Patchwork C++ PATCH for c++/52008 (ICE with variadic partial specialization)

login
register
mail settings
Submitter Jason Merrill
Date April 17, 2012, 2:24 a.m.
Message ID <4F8CD445.8010709@redhat.com>
Download mbox | patch
Permalink /patch/153025/
State New
Headers show

Comments

Jason Merrill - April 17, 2012, 2:24 a.m.
In this testcase, the partial specialization has fewer template 
arguments than the primary template has parameters, which was confusing 
GCC.  Let's give an error for this case because the partial 
specialization isn't more specialized than the primary template.

Tested x86_64-pc-linux-gnu, applying to trunk.

Patch

commit b7486132b037ea59ac7e6524085e4e765dc22852
Author: Jason Merrill <jason@redhat.com>
Date:   Mon Apr 16 12:49:13 2012 -0400

    	PR c++/52008
    	* pt.c (process_partial_specialization): Complain about a partial
    	specialization with fewer args than primary template parms.

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index fcefc94..d6144d5 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4376,6 +4376,18 @@  process_partial_specialization (tree decl)
 						   (maintmpl)))))
     error ("partial specialization %qT does not specialize any template arguments", type);
 
+  /* A partial specialization that replaces multiple parameters of the
+     primary template with a pack expansion is less specialized for those
+     parameters.  */
+  if (nargs < DECL_NTPARMS (maintmpl))
+    {
+      error ("partial specialization is not more specialized than the "
+	     "primary template because it replaces multiple parameters "
+	     "with a pack expansion");
+      inform (DECL_SOURCE_LOCATION (maintmpl), "primary template here");
+      return decl;
+    }
+
   /* [temp.class.spec]
 
      A partially specialized non-type argument expression shall not
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic130.C b/gcc/testsuite/g++.dg/cpp0x/variadic130.C
new file mode 100644
index 0000000..f73c8b5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic130.C
@@ -0,0 +1,8 @@ 
+// PR c++/52008
+// { dg-do compile { target c++11 } }
+
+template <int I, typename T, typename... Ts>
+struct A;
+
+template<typename... Ts>
+struct A<0, Ts...>;		// { dg-error "not more specialized" }