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:
parent
ac27459299
commit
c24c8a4b00
@ -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.
|
||||
|
@ -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;
|
||||
|
3
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr1.C
Normal file
3
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr1.C
Normal file
@ -0,0 +1,3 @@
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
auto l = []() [[noreturn]] {}; // { dg-warning "ignored" }
|
5
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr2.C
Normal file
5
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr2.C
Normal file
@ -0,0 +1,5 @@
|
||||
// PR c++/60503
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
auto l = []() mutable noexcept [[ ]] {};
|
||||
auto m = []() [[ ]] mutable noexcept {}; // { dg-error "" }
|
Loading…
Reference in New Issue
Block a user