Clang only allows you to use __attribute__((format)) on variadic functions. There are legit use cases for __attribute__((format)) on non-variadic functions, such as:
(1) variadic templates
template<typename… Args> void print(const char *fmt, Args… &&args) __attribute__((format(1, 2))); // error: format attribute requires variadic function
(2) functions which take fixed arguments and a custom format:
void print_number_string(const char *fmt, unsigned number, const char *string) __attribute__((format(1, 2))); // ^error: format attribute requires variadic function void foo(void) { print_number_string(“%08x %s\n”, 0xdeadbeef, “hello”); print_number_string(“%d %s”, 0xcafebabe, “bar”); }
This change allows Clang users to attach __attribute__((format)) to non-variadic functions, including functions with C++ variadic templates. It replaces the error with a GCC compatibility warning and improves the type checker to ensure that received arrays are treated like pointers (this is a possibility in C++ since references to template types can bind to arrays).
I'd say with the %0 attribute (add "the")