CWG 2233 - default arg and parameter pack
authorJason Merrill <jason@redhat.com>
Sun, 13 Nov 2016 06:52:43 +0000 (01:52 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 13 Nov 2016 06:52:43 +0000 (01:52 -0500)
* typeck.c (convert_arguments): Handle default arg followed by none.

From-SVN: r242350

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

index b2195e4b687c7c8f607023026fe80af50663559f..8683744ad677e0a04a187dca02718819eb36c8d1 100644 (file)
@@ -1,5 +1,8 @@
 2016-11-12  Jason Merrill  <jason@redhat.com>
 
+       CWG 2233
+       * typeck.c (convert_arguments): Handle default arg followed by none.
+
        * constexpr.c (potential_constant_expression_1): REALPART_EXPR and
        IMAGPART_EXPR can be lvalues.
 
index 211696cf02957892b3af7d93036aa0e105872eab..24ca1b52410b85e41b0ed65492ee9458fa48caf7 100644 (file)
@@ -3835,6 +3835,10 @@ convert_arguments (tree typelist, vec<tree, va_gc> **values, tree fndecl,
        {
          for (; typetail != void_list_node; ++i)
            {
+             /* After DR777, with explicit template args we can end up with a
+                default argument followed by no default argument.  */
+             if (!TREE_PURPOSE (typetail))
+               break;
              tree parmval
                = convert_default_arg (TREE_VALUE (typetail),
                                       TREE_PURPOSE (typetail),
@@ -3850,9 +3854,10 @@ convert_arguments (tree typelist, vec<tree, va_gc> **values, tree fndecl,
                break;
            }
        }
-      else
+
+      if (typetail && typetail != void_list_node)
        {
-          if (complain & tf_error)
+         if (complain & tf_error)
            error_args_num (input_location, fndecl, /*too_many_p=*/false);
          return -1;
        }
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic169.C b/gcc/testsuite/g++.dg/cpp0x/variadic169.C
new file mode 100644 (file)
index 0000000..6858973
--- /dev/null
@@ -0,0 +1,9 @@
+// DR 2233
+// { dg-do compile { target c++11 } }
+
+template<typename ...T> void f(int n = 0, T ...t);
+
+int main()
+{
+  f<int>();                    // { dg-error "too few arguments" }
+}