[dcl.attr.grammar] (original) (raw)
9 Declarations [dcl]
9.13 Attributes [dcl.attr]
9.13.1 Attribute syntax and semantics [dcl.attr.grammar]
Attributes specify additional information for various source constructs such as types, variables, names, contract assertions, blocks, or translation units.
balanced-token:
( balanced-token-seq )
[ balanced-token-seq ]
{ balanced-token-seq }
any token other than a parenthesis, a bracket, or a brace
If an attribute-specifiercontains an attribute-using-prefix, the attribute-list following that attribute-using-prefixshall not contain an attribute-scoped-tokenand every attribute-token in that attribute-listis treated as if its identifier were prefixed with N::, where N is the attribute-namespacespecified in the attribute-using-prefix.
[Note 1:
This rule imposes no constraints on how an attribute-using-prefixaffects the tokens in an attribute-argument-clause.
— _end note_]
[Example 1: [[using CC: opt(1), debug]] void f() {} [[using CC: opt(1)]] [[CC::debug]] void g() {} [[using CC: CC::opt(1)]] void h() {} — _end example_]
[Note 2:
For each individual attribute, the form of thebalanced-token-seq will be specified.
— _end note_]
In an attribute-list, an ellipsis may appear only if thatattribute's specification permits it.
An attribute-specifier that contains no attributes has no effect.
The order in which the attribute-tokens appear in anattribute-list is not significant.
Noname lookup is performed on any of the identifiers contained in anattribute-token.
The attribute-token determines additional requirements on the attribute-argument-clause (if any).
Each attribute-specifier-seq is said to appertain to some entity or statement, identified by the syntactic context where it appears ([stmt], [dcl], [dcl.decl]).
If an attribute-specifier-seq that appertains to some entity or statement contains an attribute or alignment-specifier that is not allowed to apply to that entity or statement, the program is ill-formed.
If an attribute-specifier-seqappertains to a friend declaration ([class.friend]), that declaration shall be a definition.
For an attribute-token(including an attribute-scoped-token) not specified in this document, the behavior is implementation-defined; any such attribute-token that is not recognized by the implementation is ignored.
[Note 4:
A program is ill-formed if it contains an attributespecified in [dcl.attr] that violates the rules specifying to which entity or statement the attribute can apply or the syntax rules for the attribute's attribute-argument-clause, if any.
— _end note_]
[Note 5:
The attributes specified in [dcl.attr]have optional semantics: given a well-formed program, removing all instances of any one of those attribute_s_results in a program whose set of possible executions ([intro.abstract]) for a given input is a subset of those of the original program for the same input, absent implementation-defined guarantees with respect to that attribute.
— _end note_]
An attribute-token is reserved for future standardization if
- it is not an attribute-scoped-token and is not specified in this document, or
- it is an attribute-scoped-token and its attribute-namespace isstd followed by zero or more digits.
Each implementation should choose a distinctive name for theattribute-namespace in an attribute-scoped-token.
Two consecutive left square bracket tokens shall appear only when introducing an attribute-specifier or within the balanced-token-seq of an attribute-argument-clause.
[Note 6:
If two consecutive left square brackets appear where an attribute-specifier is not allowed, the program is ill-formed even if the brackets match an alternative grammar production.
— _end note_]
[Example 2: int p[10];void f() { int x = 42, y[5];int(p[[x] { return x; }()]); y[[] { return 2; }()] = 2; int i [[vendor::attr([[]])]]; } — _end example_]