PR c++/60503 - wrong lambda attribute syntax.

This patch fixes two issues with lambda attribute handling: First, it was in
the wrong place in the grammar.  Second, it was treating attributes as
applying to the whole declaration rather than to the function type, as
specified by the standard.

	* parser.c (cp_parser_lambda_declarator_opt): Fix attribute
	handling.

From-SVN: r265787
This commit is contained in:
Jason Merrill 2018-11-05 02:46:52 -05:00 committed by Jason Merrill
parent ac27459299
commit c24c8a4b00
4 changed files with 19 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2018-11-04 Jason Merrill <jason@redhat.com>
PR c++/60503 - wrong lambda attribute syntax.
* parser.c (cp_parser_lambda_declarator_opt): Fix attribute
handling.
2018-11-02 Nathan Sidwell <nathan@acm.org>
* decl.c (duplicate_decls): Refactor checks.

View File

@ -10596,8 +10596,6 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
parens.require_close (parser);
attributes = cp_parser_attributes_opt (parser);
/* In the decl-specifier-seq of the lambda-declarator, each
decl-specifier shall either be mutable or constexpr. */
int declares_class_or_enum;
@ -10618,6 +10616,8 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
/* Parse optional exception specification. */
exception_spec = cp_parser_exception_specification_opt (parser);
attributes = cp_parser_std_attribute_spec_seq (parser);
/* Parse optional trailing return type. */
if (cp_lexer_next_token_is (parser->lexer, CPP_DEREF))
{
@ -10668,15 +10668,14 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
REF_QUAL_NONE,
tx_qual,
exception_spec,
/*late_return_type=*/NULL_TREE,
return_type,
/*requires_clause*/NULL_TREE);
declarator->id_loc = LAMBDA_EXPR_LOCATION (lambda_expr);
if (return_type)
declarator->u.function.late_return_type = return_type;
declarator->std_attributes = attributes;
fco = grokmethod (&return_type_specs,
declarator,
attributes);
NULL_TREE);
if (fco != error_mark_node)
{
DECL_INITIALIZED_IN_CLASS_P (fco) = 1;

View File

@ -0,0 +1,3 @@
// { dg-do compile { target c++11 } }
auto l = []() [[noreturn]] {}; // { dg-warning "ignored" }

View File

@ -0,0 +1,5 @@
// PR c++/60503
// { dg-do compile { target c++11 } }
auto l = []() mutable noexcept [[ ]] {};
auto m = []() [[ ]] mutable noexcept {}; // { dg-error "" }