aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-06-18 20:38:26 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-06-18 20:38:26 -0400
commitcae39eb41f37b8714f5684ee58b74460f2b76cd2 (patch)
treee3a97dbe20d14841f93735ebc431279b631bc2df /gcc
parent094c2a2373d922f7e06f99f29fc5baaea961d79e (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/decl.c3
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr81060.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C4
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" }