On Wed, Aug 21, 2019 at 7:24 AM Marek Polacek <pola...@redhat.com> wrote: > > Currently, we disregard prefix attributes in conditions, e.g.: > > if ([[maybe_unused]] int i = f()) { } > > The problem here is that although we've parsed the attribute, it > was never passed down to start_decl, so the effects were lost. > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > 2019-08-21 Marek Polacek <pola...@redhat.com> > > PR c++/91304 - prefix attributes ignored in condition. > * parser.c (cp_parser_condition): Handle prefix attributes. > > * g++.dg/cpp0x/gen-attrs-70.C: New test. > > diff --git gcc/cp/parser.c gcc/cp/parser.c > index dbbfe1dbc2f..b410a6c030f 100644 > --- gcc/cp/parser.c > +++ gcc/cp/parser.c > @@ -12066,6 +12066,10 @@ cp_parser_condition (cp_parser* parser) > /* Restore the saved message. */ > parser->type_definition_forbidden_message = saved_message; > > + /* Gather the attributes that were provided with the > + decl-specifiers. */ > + tree prefix_attributes = type_specifiers.attributes;
The patch is OK, since it follows the existing pattern, but it's weird that we depend on various places in the parser to extract the attributes from the specifiers rather than deal with that in grokdeclarator. > + > cp_parser_maybe_commit_to_declaration (parser, > type_specifiers.any_specifiers_p); > > @@ -12116,7 +12120,7 @@ cp_parser_condition (cp_parser* parser) > /* Create the declaration. */ > decl = start_decl (declarator, &type_specifiers, > /*initialized_p=*/true, > - attributes, /*prefix_attributes=*/NULL_TREE, > + attributes, prefix_attributes, > &pushed_scope); > > /* Parse the initializer. */ > diff --git gcc/testsuite/g++.dg/cpp0x/gen-attrs-70.C > gcc/testsuite/g++.dg/cpp0x/gen-attrs-70.C > new file mode 100644 > index 00000000000..90a2e97a3f6 > --- /dev/null > +++ gcc/testsuite/g++.dg/cpp0x/gen-attrs-70.C > @@ -0,0 +1,13 @@ > +// PR c++/91304 - prefix attributes ignored in condition. > +// { dg-do compile { target c++11 } } > +// { dg-additional-options "-Wall -Wextra" } > + > +int f(); > + > +void g() > +{ > + if ([[maybe_unused]] int i = f()) { } > + if ([[deprecated]] int i = f()) { i = 10; } // { dg-warning ".i. is > deprecated" } > + if (int i [[maybe_unused]] = f()) { } > + if (int i [[deprecated]] = f()) { i = 10; } // { dg-warning ".i. is > deprecated" } > +}