Commit 31449cf8 by Jason Merrill

c++: ICE on invalid concept placeholder [PR94481].

Here the 'decltype' is missing '(auto)', so open_paren was NULL, and trying
to get its location is a SEGV.  Using matching_parens avoids that problem.

gcc/cp/ChangeLog
2020-04-07  Jason Merrill  <jason@redhat.com>

	PR c++/94481
	* parser.c (cp_parser_placeholder_type_specifier): Use
	matching_parens.
parent c23c899a
2020-04-07 Jason Merrill <jason@redhat.com>
PR c++/94481
* parser.c (cp_parser_placeholder_type_specifier): Use
matching_parens.
2020-04-07 Iain Sandoe <iain@sandoe.co.uk> 2020-04-07 Iain Sandoe <iain@sandoe.co.uk>
* coroutines.cc (maybe_promote_captured_temps): Ensure that * coroutines.cc (maybe_promote_captured_temps): Ensure that
......
...@@ -18367,7 +18367,7 @@ cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc, ...@@ -18367,7 +18367,7 @@ cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc,
/* As per the standard, require auto or decltype(auto), except in some /* As per the standard, require auto or decltype(auto), except in some
cases (template parameter lists, -fconcepts-ts enabled). */ cases (template parameter lists, -fconcepts-ts enabled). */
cp_token *placeholder = NULL, *open_paren = NULL, *close_paren = NULL; cp_token *placeholder = NULL, *close_paren = NULL;
if (cxx_dialect >= cxx2a) if (cxx_dialect >= cxx2a)
{ {
if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO)) if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
...@@ -18375,12 +18375,10 @@ cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc, ...@@ -18375,12 +18375,10 @@ cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc,
else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DECLTYPE)) else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DECLTYPE))
{ {
placeholder = cp_lexer_consume_token (parser->lexer); placeholder = cp_lexer_consume_token (parser->lexer);
open_paren = cp_parser_require (parser, CPP_OPEN_PAREN, matching_parens parens;
RT_OPEN_PAREN); parens.require_open (parser);
cp_parser_require_keyword (parser, RID_AUTO, RT_AUTO); cp_parser_require_keyword (parser, RID_AUTO, RT_AUTO);
close_paren = cp_parser_require (parser, CPP_CLOSE_PAREN, close_paren = parens.require_close (parser);
RT_CLOSE_PAREN,
open_paren->location);
} }
} }
...@@ -18429,7 +18427,7 @@ cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc, ...@@ -18429,7 +18427,7 @@ cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc,
results in an invented template parameter. */ results in an invented template parameter. */
if (parser->auto_is_implicit_function_template_parm_p) if (parser->auto_is_implicit_function_template_parm_p)
{ {
if (placeholder && token_is_decltype (placeholder)) if (close_paren)
{ {
location_t loc = make_location (placeholder->location, location_t loc = make_location (placeholder->location,
placeholder->location, placeholder->location,
// PR c++/94481
// { dg-do compile { target c++2a } }
template<typename T>
concept C = true;
void foo() {
C decltype c = 1; // { dg-error "" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment