diff options
author | Jason Merrill <jason@redhat.com> | 2018-06-18 20:38:26 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-06-18 20:38:26 -0400 |
commit | cae39eb41f37b8714f5684ee58b74460f2b76cd2 (patch) | |
tree | e3a97dbe20d14841f93735ebc431279b631bc2df /gcc | |
parent | 094c2a2373d922f7e06f99f29fc5baaea961d79e (diff) | |
download | gcc-cae39eb41f37b8714f5684ee58b74460f2b76cd2.zip gcc-cae39eb41f37b8714f5684ee58b74460f2b76cd2.tar.gz gcc-cae39eb41f37b8714f5684ee58b74460f2b76cd2.tar.bz2 |
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.
From-SVN: r261725
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/decl.c | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr81060.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C | 4 |
6 files changed, 14 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b1a449f..a8d0e62 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 3566668..b870954 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index cc2d513..6d802c9 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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] diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6e590d4..5af0f9a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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) { diff --git a/gcc/testsuite/g++.dg/cpp0x/pr81060.C b/gcc/testsuite/g++.dg/cpp0x/pr81060.C index 67b2b38..673ec15 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr81060.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr81060.C @@ -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! diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C index a887e33..8af3979 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C @@ -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" } |