]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/60503 - wrong lambda attribute syntax.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Nov 2018 07:46:52 +0000 (07:46 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Nov 2018 07:46:52 +0000 (07:46 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@265787 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr2.C [new file with mode: 0644]

index bb77e0b42ab9b928704be934d3a783d3fd0a1dab..7e9c0e2642ae3f4d172e81719e677583463b74ab 100644 (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.
index d01c92431ef1196858a68aff19a8c67433861899..5ea8e8ca0124cfea3c807d557f2a577b1078fbed 100644 (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;
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr1.C
new file mode 100644 (file)
index 0000000..9aa6506
--- /dev/null
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++11 } }
+
+auto l = []() [[noreturn]] {}; // { dg-warning "ignored" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-attr2.C
new file mode 100644 (file)
index 0000000..82d88f3
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/60503
+// { dg-do compile { target c++11 } }
+
+auto l = []() mutable noexcept [[ ]] {};
+auto m = []() [[ ]] mutable noexcept {}; // { dg-error "" }