https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107802
Bug ID: 107802 Summary: -Wsuggest-attribute=format ignores [[gnu::format(...)]] Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: adam.f.badura at gmail dot com Target Milestone: --- I checked the issue with GCC 10.2 and trunk as on Compiler Explorer using arguments -std=c++17 -O3 -Wall -Wextra -Wpedantic -Wsuggest-attribute=format The following code (https://godbolt.org/z/qP91h5Knv): #include <cstdarg> #include <cstdio> #include <cstdlib> __attribute__((format(printf, 4, 5))) [[noreturn]] void raise( [[maybe_unused]] const char* const file, [[maybe_unused]] const unsigned line, [[maybe_unused]] const char* const condition, const char* assertionMessage, ...) { std::fprintf(stderr, "*** Assertion message: "); va_list args; va_start(args, assertionMessage); std::vfprintf(stderr, assertionMessage, args); va_end(args); std::fprintf(stderr, "\n"); std::abort(); } passes fine. However, if we replace __attribute__((format(printf, 4, 5))) with [[gnu::format(printf, 4, 5)]] a warning shows up (https://godbolt.org/z/oecjj4Tzv): <source>: In function 'void raise(const char*, unsigned int, const char*, const char*, ...)': <source>:15:49: warning: function 'void raise(const char*, unsigned int, const char*, const char*, ...)' might be a candidate for 'gnu_printf' format attribute [-Wsuggest-attribute=format] 15 | std::vfprintf(stderr, assertionMessage, args); | ^ My overall experience is that the [[gnu::...]] syntax for attributes doesn't behave the same as the __attribute__((...)) syntax. Not only it seems to be more limited to where we can place it (this is up to C++, not GCC) but also it seems attributes provided this way are more likely to be more or less ignored. However, this is the first time I caught the issue so clearly.