OSDN Git Service

PR c++/38543
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Apr 2012 14:11:34 +0000 (14:11 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Apr 2012 14:11:34 +0000 (14:11 +0000)
* pt.c (determine_specialization): Instead of comparing the number
of parms, check that tsubst gives the right answer.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186533 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/variadic131.C [new file with mode: 0644]

index 9b2fe30..83325c1 100644 (file)
@@ -1,5 +1,9 @@
 2012-04-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/38543
+       * pt.c (determine_specialization): Instead of comparing the number
+       of parms, check that tsubst gives the right answer.
+
        PR c++/50830
        * pt.c (convert_template_argument): Handle template template
        argument packs.
index c96b333..383f0d6 100644 (file)
@@ -1860,6 +1860,7 @@ determine_specialization (tree template_id,
        {
          tree decl_arg_types;
          tree fn_arg_types;
+         tree insttype;
 
          /* In case of explicit specialization, we need to check if
             the number of template headers appearing in the specialization
@@ -1927,7 +1928,8 @@ determine_specialization (tree template_id,
               template <> void f<int>();
             The specialization f<int> is invalid but is not caught
             by get_bindings below.  */
-         if (list_length (fn_arg_types) != list_length (decl_arg_types))
+         if (cxx_dialect < cxx11
+             && list_length (fn_arg_types) != list_length (decl_arg_types))
            continue;
 
          /* Function templates cannot be specializations; there are
@@ -1950,6 +1952,18 @@ determine_specialization (tree template_id,
               specialize TMPL will produce DECL.  */
            continue;
 
+         if (cxx_dialect >= cxx11)
+           {
+             /* Make sure that the deduced arguments actually work.  */
+             insttype = tsubst (TREE_TYPE (fn), targs, tf_none, NULL_TREE);
+             if (insttype == error_mark_node)
+               continue;
+             fn_arg_types
+               = skip_artificial_parms_for (fn, TYPE_ARG_TYPES (insttype));
+             if (!compparms (fn_arg_types, decl_arg_types))
+               continue;
+           }
+
          /* Save this template, and the arguments deduced.  */
          templates = tree_cons (targs, fn, templates);
        }
index b62f8e5..b233a8b 100644 (file)
@@ -1,5 +1,10 @@
 2012-04-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/38543
+       * g++.dg/cpp0x/variadic131.C: New.
+
+2012-04-16  Jason Merrill  <jason@redhat.com>
+
        PR c++/50830
        * g++.dg/cpp0x/variadic129.C: New.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic131.C b/gcc/testsuite/g++.dg/cpp0x/variadic131.C
new file mode 100644 (file)
index 0000000..3006f87
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/38543
+// { dg-do compile { target c++11 } }
+
+template< typename ... T > void foo( T ... args );
+template<> void foo( ){}
+template<> void foo(int,double){}
+int main()
+{
+  foo( 0, 0.0 );
+  return 55;
+}