PR c++/81060 - ICE with unexpanded parameter pack.
authorJason Merrill <jason@redhat.com>
Tue, 19 Jun 2018 00:38:26 +0000 (20:38 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 19 Jun 2018 00:38:26 +0000 (20:38 -0400)
* pt.c (check_for_bare_parameter_packs): Add loc parameter.
* decl.c (grokdeclarator): Call it for qualifying_scope.

From-SVN: r261725

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/pr81060.C
gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C

index b1a449f91e2dc8c53df1a0fd7befc9874a594c4b..a8d0e62644049f6c705a07841a66e8a07797238f 100644 (file)
@@ -1,5 +1,9 @@
 2018-06-18  Jason Merrill  <jason@redhat.com>
 
+       PR c++/81060 - ICE with unexpanded parameter pack.
+       * pt.c (check_for_bare_parameter_packs): Add loc parameter.
+       * decl.c (grokdeclarator): Call it for qualifying_scope.
+
        PR c++/86171 - ICE with recursive alias instantiation.
        * pt.c (tsubst_decl): Handle recursive alias instantiation.
 
index 3566668efef5b9202c7d8ec73f22c5e944a15f44..b870954206649f9ad6bd0dd0a30c636933f008bd 100644 (file)
@@ -6626,7 +6626,7 @@ extern bool template_parameter_pack_p           (const_tree);
 extern bool function_parameter_pack_p          (const_tree);
 extern bool function_parameter_expanded_from_pack_p (tree, tree);
 extern tree make_pack_expansion                 (tree, tsubst_flags_t = tf_warning_or_error);
-extern bool check_for_bare_parameter_packs      (tree);
+extern bool check_for_bare_parameter_packs      (tree, location_t = UNKNOWN_LOCATION);
 extern tree build_template_info                        (tree, tree);
 extern tree get_template_info                  (const_tree);
 extern vec<qualified_typedef_usage_t, va_gc> *get_types_needing_access_check (tree);
index cc2d513a7a1b61abe313e7d63e87ad518f93c473..6d802c9e66df8c79ee12e14016798b6da228a809 100644 (file)
@@ -10175,6 +10175,9 @@ grokdeclarator (const cp_declarator *declarator,
              break;
            if (qualifying_scope)
              {
+               if (check_for_bare_parameter_packs (qualifying_scope,
+                                                   id_declarator->id_loc))
+                 return error_mark_node;
                if (at_function_scope_p ())
                  {
                    /* [dcl.meaning] 
index 6e590d4d3429aba042d4cd83d18d3e6e992e2704..5af0f9afefc57b69e3afb930e699e843a87e86d4 100644 (file)
@@ -4031,7 +4031,7 @@ make_pack_expansion (tree arg, tsubst_flags_t complain)
    Returns TRUE and emits an error if there were bare parameter packs,
    returns FALSE otherwise.  */
 bool 
-check_for_bare_parameter_packs (tree t)
+check_for_bare_parameter_packs (tree t, location_t loc /* = UNKNOWN_LOCATION */)
 {
   tree parameter_packs = NULL_TREE;
   struct find_parameter_pack_data ppd;
@@ -4055,7 +4055,8 @@ check_for_bare_parameter_packs (tree t)
 
   if (parameter_packs) 
     {
-      location_t loc = EXPR_LOC_OR_LOC (t, input_location);
+      if (loc == UNKNOWN_LOCATION)
+       loc = EXPR_LOC_OR_LOC (t, input_location);
       error_at (loc, "parameter packs not expanded with %<...%>:");
       while (parameter_packs)
         {
index 67b2b38596abefc6ecfc7e7963563f1891bb6007..673ec1587d6b0144f320e0ab664148dc45492a99 100644 (file)
@@ -7,5 +7,5 @@ template<typename... T> struct A
 };
 
 template<typename... T>
-const int A<T>::i // { dg-error "template definition of non-template" }
+const int A<T>::i // { dg-error "packs not expanded" }
 = []{ return 0; }(); // BOOM!
index a887e339848c3f61ae25d1cc511fe8106cdd0c1d..8af3979d28d321023b1bb8f5cbbde9b56acbbb5b 100644 (file)
@@ -1,8 +1,8 @@
 // { dg-do compile { target c++11 } }
-template<class... Types> struct B { // { dg-message "declaration of" }
+template<class... Types> struct B {
   void f3();
   void f4();
 };
 
 template<class... Types> void B<Types...>::f3() { } // OK
-template<class... Types> void B<Types>::f4() { } // { dg-error "invalid" }
+template<class... Types> void B<Types>::f4() { } // { dg-error "packs not expanded" }