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

--- Comment #4 from joseph at codesourcery dot com <joseph at codesourcery dot 
com> ---
On Thu, 29 Jul 2021, eggert at gnu dot org via Gcc-bugs wrote:

> The grammar at the start of section 6.7 of the current C2x draft (N2596) says
> that attribute specifiers may appear either before or after declaration
> specifiers. Unfortunately, GCC rejects attribution specifiers after 
> declaration
> specifiers. For example, for this this source code:
> 
> extern [[nodiscard]] int f (void);

That's not syntactically valid.  You can have attribute specifiers before 
declaration specifiers in a declaration, or at the end of declaration 
specifiers, but you can't have them in the middle; the syntax productions 
don't allow it.

> extern int [[nodiscard]] g (void);
> int [[nodiscard]] h (void);

Those violate the constraints on the nodiscard attribute.  As per 6.7#8, 
"The optional attribute specifier sequence terminating a sequence of 
declaration specifiers appertains to the type determined by the preceding 
sequence of declaration specifiers.".  That is, this syntax is applying 
the attribute to the type int, but the constraints for nodiscard 
(6.7.11.2#1) say "The nodiscard attribute shall be applied to the 
identifier in a function declaration or to the definition of a structure, 
union, or enumeration type.".

To apply the nodiscard attribute to a function, either place it before the 
declaration specifiers (in which case it applies to all declared entities 
in that declaration, so don't so that if you have multiple declarators in 
the declaration but only want nodiscard to apply to some of them), or 
after the identifier in the declarator.

Reply via email to