]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/55724 ([C++11] Default type of a template value is not working)
authorJason Merrill <jason@redhat.com>
Wed, 19 Dec 2012 22:22:36 +0000 (17:22 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 19 Dec 2012 22:22:36 +0000 (17:22 -0500)
PR c++/55724
* pt.c (type_unification_real): Re-combine post-deduction loops.

From-SVN: r194620

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

index 83d3c63860ce356dcedbc410c0d3db5ca50b50f8..f6abef6368268a6bb137cc7f884d4ce25e8561ab 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/55724
+       * pt.c (type_unification_real): Re-combine post-deduction loops.
+
 2012-12-14  Jason Merrill  <jason@redhat.com>
 
        PR c++/55685
index a21522b3510679be1ebad4aa1bc40f9e7092efe6..1b3f039cc6d8144a5f1c4e98e677d647a1030966 100644 (file)
@@ -15333,13 +15333,19 @@ type_unification_real (tree tparms,
                                 ? tf_warning_or_error
                                 : tf_none);
 
-      /* Check to see if we need another pass before we start clearing
-        ARGUMENT_PACK_INCOMPLETE_P.  */
       for (i = 0; i < ntparms; i++)
        {
          tree targ = TREE_VEC_ELT (targs, i);
          tree tparm = TREE_VEC_ELT (tparms, i);
 
+         /* Clear the "incomplete" flags on all argument packs now so that
+            substituting them into later default arguments works.  */
+         if (targ && ARGUMENT_PACK_P (targ))
+            {
+              ARGUMENT_PACK_INCOMPLETE_P (targ) = 0;
+              ARGUMENT_PACK_EXPLICIT_ARGS (targ) = NULL_TREE;
+            }
+
          if (targ || tparm == error_mark_node)
            continue;
          tparm = TREE_VALUE (tparm);
@@ -15352,24 +15358,6 @@ type_unification_real (tree tparms,
              && uses_template_parms (TREE_TYPE (tparm))
              && !saw_undeduced++)
            goto again;
-       }
-
-      for (i = 0; i < ntparms; i++)
-       {
-         tree targ = TREE_VEC_ELT (targs, i);
-         tree tparm = TREE_VEC_ELT (tparms, i);
-
-         /* Clear the "incomplete" flags on all argument packs now so that
-            substituting them into later default arguments works.  */
-         if (targ && ARGUMENT_PACK_P (targ))
-            {
-              ARGUMENT_PACK_INCOMPLETE_P (targ) = 0;
-              ARGUMENT_PACK_EXPLICIT_ARGS (targ) = NULL_TREE;
-            }
-
-         if (targ || tparm == error_mark_node)
-           continue;
-         tparm = TREE_VALUE (tparm);
 
          /* Core issue #226 (C++0x) [temp.deduct]:
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C
new file mode 100644 (file)
index 0000000..0248b60
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/55724
+// { dg-options -std=c++11 }
+
+template<int N> struct S {};
+template<typename T = int, T N> void f(S<N>) {}
+int main() { S<1> s; f(s); }