[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