https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106712
Bug ID: 106712 Summary: Incorrect propagation of C++11 attributes to subsequent function declarations Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ed at catmur dot uk Target Milestone: --- In [[first-attribute]] int f [[second-attribute]](), g(); the [[first-attribute]] should apply to both f and g, the [[second-attribute]] to f only: > The attribute-specifier-seq appertains to each of the entities declared by > the declarators of the init-declarator-list. http://eel.is/c++draft/dcl.dcl#dcl.pre-3.sentence-5 > The attribute-specifier-seq affects the type only for the declaration it > appears in, not other declarations involving the same type. http://eel.is/c++draft/dcl.dcl#dcl.spec.general-1.sentence-3 However, gcc instead applies [[second-attribute]] to both functions, but only if [[first-attribute]] is non-empty. This can lead to rejects-valid: [[gnu::cold]] int g() { return 1; } [[gnu::cold]] int f [[gnu::fastcall]](), g(); // error: ambiguating new declaration of 'int g()' Or to miscompilation, e.g.: [[gnu::cold]] int f [[gnu::const]](), g(); int g() { static int i; return ++i; } #include <cassert> int main() { assert(g() + g() == 3); } // fails Or erroneous warnings (with only standard attributes): [[noreturn]] int f [[nodiscard]](), g(); int main() { g(); }