re PR c++/50086 ([C++0x] Error on lookup of template function address with variadic...
authorJason Merrill <jason@redhat.com>
Tue, 16 Aug 2011 23:26:08 +0000 (19:26 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 16 Aug 2011 23:26:08 +0000 (19:26 -0400)
PR c++/50086
* pt.c (unify_pack_expansion): Correct overloaded unification
logic.

From-SVN: r177813

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

index c06a3078e44030e0e886385bdcb21599e1e9219a..4d6c353a178ca49f50d336d845ec2c6668d91dac 100644 (file)
@@ -1,5 +1,9 @@
 2011-08-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/50086
+       * pt.c (unify_pack_expansion): Correct overloaded unification
+       logic.
+
        * pt.c (instantiate_class_template_1): If DECL_PRESERVE_P is set
        on a member function or static data member, call mark_used.
 
index 9a4419a0783506244c7f86ef861cc84c784ee6c1..9ab110aa225d3f2c96699d69a8b7d86e6a799c9c 100644 (file)
@@ -15434,7 +15434,6 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
         tree arg = TREE_VEC_ELT (packed_args, i);
        tree arg_expr = NULL_TREE;
         int arg_strict = strict;
-        bool skip_arg_p = false;
 
         if (call_args_p)
           {
@@ -15477,19 +15476,15 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
                     if (resolve_overloaded_unification
                         (tparms, targs, parm, arg,
                         (unification_kind_t) strict,
-                        sub_strict, explain_p)
-                        != 0)
-                      return 1;
-                    skip_arg_p = true;
+                        sub_strict, explain_p))
+                     goto unified;
+                   return unify_overload_resolution_failure (explain_p, arg);
                   }
 
-                if (!skip_arg_p)
-                  {
-                   arg_expr = arg;
-                    arg = unlowered_expr_type (arg);
-                    if (arg == error_mark_node)
-                      return 1;
-                  }
+               arg_expr = arg;
+               arg = unlowered_expr_type (arg);
+               if (arg == error_mark_node)
+                 return unify_invalid (explain_p);
               }
       
             arg_strict = sub_strict;
@@ -15500,16 +15495,14 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
                                                  &parm, &arg, arg_expr);
           }
 
-        if (!skip_arg_p)
-          {
-           /* For deduction from an init-list we need the actual list.  */
-           if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr))
-             arg = arg_expr;
-           RECUR_AND_CHECK_FAILURE (tparms, targs, parm, arg, arg_strict,
-                                    explain_p);
-          }
+       /* For deduction from an init-list we need the actual list.  */
+       if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr))
+         arg = arg_expr;
+       RECUR_AND_CHECK_FAILURE (tparms, targs, parm, arg, arg_strict,
+                                explain_p);
       }
 
+    unified:
       /* For each parameter pack, collect the deduced value.  */
       for (pack = packs; pack; pack = TREE_CHAIN (pack))
         {
index 2a9236cdf3aa35c262efc2ef49fc510e516d6958..f435f140b853e405a49baf70306620233e0b0e3a 100644 (file)
@@ -1,5 +1,8 @@
 2011-08-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/50086
+       * g++.dg/cpp0x/variadic-unresolved.C: New.
+
        * g++.old-deja/g++.brendan/README: Add R.I.P.
 
        * g++.dg/ext/attr-used-1.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C b/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C
new file mode 100644 (file)
index 0000000..a8463de
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/50086
+// { dg-options -std=c++0x }
+
+template<typename T> void tfun();
+template<typename T> void fun1(T);
+template<typename... Types> void fun2(Types... args);
+
+int main()
+{
+  fun1(tfun<int>); // ok
+  fun2(tfun<int>); // error: unresolved overloaded function type
+}