aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-04-04 20:09:05 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-04-04 20:09:05 -0400
commit0dd285f9a8da75fd01a36acb6b427a9afbd189ce (patch)
tree782fbaacb947cb7b2b6af84577f39a2d168e5b10
parent01e1df9ff6f1742b31a033fdb65c8ebb5ea0e983 (diff)
downloadgcc-0dd285f9a8da75fd01a36acb6b427a9afbd189ce.zip
gcc-0dd285f9a8da75fd01a36acb6b427a9afbd189ce.tar.gz
gcc-0dd285f9a8da75fd01a36acb6b427a9afbd189ce.tar.bz2
PR c++/84936 - ICE with unexpanded pack in mem-initializer.
* parser.c (cp_parser_mem_initializer_list): Call check_for_bare_parameter_packs. From-SVN: r259107
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c9
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic175.C10
3 files changed, 23 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a691763..62f61ea 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-04-04 Jason Merrill <jason@redhat.com>
+
+ PR c++/84936 - ICE with unexpanded pack in mem-initializer.
+ * parser.c (cp_parser_mem_initializer_list): Call
+ check_for_bare_parameter_packs.
+
2018-04-04 Jakub Jelinek <jakub@redhat.com>
PR inline-asm/85172
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index f6fbcf6..59eb822 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -14381,10 +14381,15 @@ cp_parser_mem_initializer_list (cp_parser* parser)
/* Parse the mem-initializer. */
mem_initializer = cp_parser_mem_initializer (parser);
/* If the next token is a `...', we're expanding member initializers. */
- if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
+ bool ellipsis = cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS);
+ if (ellipsis
+ || (mem_initializer != error_mark_node
+ && check_for_bare_parameter_packs (TREE_PURPOSE
+ (mem_initializer))))
{
/* Consume the `...'. */
- cp_lexer_consume_token (parser->lexer);
+ if (ellipsis)
+ cp_lexer_consume_token (parser->lexer);
/* The TREE_PURPOSE must be a _TYPE, because base-specifiers
can be expanded but members cannot. */
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic175.C b/gcc/testsuite/g++.dg/cpp0x/variadic175.C
new file mode 100644
index 0000000..969f4b0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic175.C
@@ -0,0 +1,10 @@
+// PR c++/84936
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<typename... T> A(T... t)
+ : decltype(t)() {} // { dg-error "parameter pack" }
+};
+
+A a;