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.