[gcc(refs/vendors/redhat/heads/gcc-8-branch)] backport: re PR c++/90842 (ICE in poplevel, at cp/decl.c:585)
Jakub Jelinek
jakub@gcc.gnu.org
Thu Sep 17 16:39:11 GMT 2020
https://gcc.gnu.org/g:de35d53a2e88f9d79022ea4321af2136c627042f
commit de35d53a2e88f9d79022ea4321af2136c627042f
Author: Jakub Jelinek <jakub@redhat.com>
Date: Fri Feb 14 12:34:46 2020 +0100
backport: re PR c++/90842 (ICE in poplevel, at cp/decl.c:585)
Backported from mainline
2019-11-21 Jakub Jelinek <jakub@redhat.com>
Jason Merrill <jason@redhat.com>
PR c++/90842
* parser.c (cp_parser_decl_specifier_seq): For concept or typedef
break early if CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR.
For type specifiers, set CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS
if CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR is set.
* g++.dg/cpp1y/lambda-generic-90842.C: New test.
Diff:
---
gcc/cp/ChangeLog | 12 ++++++++++++
gcc/cp/parser.c | 11 +++++++++++
gcc/testsuite/ChangeLog | 8 ++++++++
gcc/testsuite/g++.dg/cpp1y/lambda-generic-90842.C | 7 +++++++
4 files changed, 38 insertions(+)
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f9b02d0309b..b1cc9db5383 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,15 @@
+2020-02-14 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2019-11-21 Jakub Jelinek <jakub@redhat.com>
+ Jason Merrill <jason@redhat.com>
+
+ PR c++/90842
+ * parser.c (cp_parser_decl_specifier_seq): For concept or typedef
+ break early if CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR.
+ For type specifiers, set CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS
+ if CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR is set.
+
2020-01-27 Nathan Sidwell <nathan@acm.org>
PR c++/91826
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index d17a212a18f..f523c87a9ae 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -13552,6 +13552,10 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
case RID_CONCEPT:
ds = ds_concept;
cp_lexer_consume_token (parser->lexer);
+
+ if (flags & CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR)
+ break;
+
/* In C++20 a concept definition is just 'concept name = expr;'
Support that syntax by pretending we've seen 'bool'. */
if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
@@ -13579,6 +13583,10 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
ds = ds_typedef;
/* Consume the token. */
cp_lexer_consume_token (parser->lexer);
+
+ if (flags & CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR)
+ break;
+
/* A constructor declarator cannot appear in a typedef. */
constructor_possible_p = false;
/* The "typedef" keyword can only occur in a declaration; we
@@ -13673,6 +13681,9 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
bool is_cv_qualifier;
tree type_spec;
+ if (flags & CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR)
+ flags |= CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS;
+
type_spec
= cp_parser_type_specifier (parser, flags,
decl_specs,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4423f92e60d..329243521cf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2020-02-14 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2019-11-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/90842
+ * g++.dg/cpp1y/lambda-generic-90842.C: New test.
+
2020-01-20 Richard Biener <rguenther@suse.de>
Backport from mainline
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-90842.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-90842.C
new file mode 100644
index 00000000000..433c9c2030e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-90842.C
@@ -0,0 +1,7 @@
+// PR c++/90842
+// { dg-do compile { target c++14 } }
+
+auto a = [](auto x) struct C { void foo (); } {}; // { dg-error "expected" }
+ // { dg-error "type-specifier invalid in lambda" "" { xfail *-*-* } .-1 }
+auto b = [](auto x) mutable typedef {}; // { dg-error "'typedef' invalid in lambda" }
+auto d = [](auto x) mutable friend {}; // { dg-error "'friend' invalid in lambda" }
More information about the Gcc-cvs
mailing list