https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88086

            Bug ID: 88086
           Summary: gcc only allows valid expressions as unknown C++
                    attribute argument clause
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bruno-gcc at defraine dot net
  Target Milestone: ---

GCC raises an error when the argument of an (unknown) C++ attribute contains an
undeclared identifier. Tested with -std=c++17:

  int i [[vendor::attr(somename)]];
  // error: 'somename' was not declared in this scope

More in general, GCC seem to expect a valid expression as the argument:

  int i [[vendor::attr(123?456)]];
  // error: expected ':' before ')' token
  // error: expected primary-expression before ')' token

Similarly, a specific example listed as "well-formed implementation-defined
attribute" in the standard also raises errors in GCC:

  int i [[vendor::attr([[]])]]; // well-formed implementation-defined attribute
  // error: expected identifier before '[' token
  // In lambda function:
  // error: expected '{' before ')' token

The treatment by GCC of the attribute argument as an expression does not seem
in line with the C++ standard (section 10.6.1 Attribute syntax and semantics),
which defines the attribute argument as any balanced token sequence, and which
also specifies that "any attribute-token that is not recognized by the
implementation is ignored". From this, you would expect a conforming compiler
to skip the balanced tokens in the argument of an unknown attribute.

This also seems to be what other compilers (clang, MSVC,...) are doing.

Reply via email to