diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a4024ef515520afe20f1e79732de2bbb2a20567e..520262e21fe0f999beeaec1b99a1a6ddc1237cc3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2009-11-20  Simon Martin  <simartin@users.sourceforge.net>
+
+	PR c++/38646
+	* pt.c (process_partial_specialization): Do not turn wrongly located
+	parameter pack arguments into error_mark_node.
+	Split too long lines into two.
+
 2009-11-20  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR c++/42060
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index c3b0f0e668f346795d18583f090ebee9eba2bc29..0a194440ae6958f1a6df21c0ea8794753c6a18f3 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -3795,12 +3795,11 @@ process_partial_specialization (tree decl)
                   || (!packed_args && i < nargs - 1))
                 {
                   if (TREE_CODE (arg) == EXPR_PACK_EXPANSION)
-                    error ("parameter pack argument %qE must be at the end of the template argument list", arg);
+                    error ("parameter pack argument %qE must be at the "
+			   "end of the template argument list", arg);
                   else
-                    error ("parameter pack argument %qT must be at the end of the template argument list", arg);
-
-		  if (packed_args)
-		    TREE_VEC_ELT (packed_args, j) = error_mark_node;
+                    error ("parameter pack argument %qT must be at the "
+			   "end of the template argument list", arg);
                 }
             }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ecedddc6f9d8a6738facd2045a0eba82291832c0..51d1d328067d1040d352af68bad2103b618e14b9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-20  Simon Martin  <simartin@users.sourceforge.net>
+
+	PR c++/38646
+	* g++.dg/cpp0x/pr38646.C: New test.
+
 2009-11-20  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
 	* gcc.dg/c99-stdint-6.c: Set dg-options for alpha*-dec-osf5*.
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr38646.C b/gcc/testsuite/g++.dg/cpp0x/pr38646.C
new file mode 100644
index 0000000000000000000000000000000000000000..3ef74cd4866695e708f577c1c11e51e7b53a9aaf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/pr38646.C
@@ -0,0 +1,12 @@
+/* PR c++/38646 */
+/* { dg-do "compile" } */
+/* { dg-options "-std=c++0x" } */
+
+template<int...> struct A;
+
+template<int... N> struct A<N..., N...> /* { dg-error "must be at the end" } */
+{
+  template<typename> struct B;
+
+  template<typename T> struct B<T*> {};
+};