https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52952
--- Comment #51 from Manuel López-Ibáñez <manu at gcc dot gnu.org> --- There are few things still that don't work: 1. C++ does not work 2. Locations within strings expanded from a macro 3. Location within strings from a const char array. void foo(void) { #define c " %d %d " __builtin_printf(c, 0.5, 0); const char a[] = " %d "; __builtin_printf(a, 0.5); } GCC 9: <source>:2:25: error: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Werror=format=] 2 | #define c " %d %d " | ^~~~~~~~~ <source>:3:20: note: in expansion of macro 'c' 3 | __builtin_printf(c, 0.5, 0); | ^ <source>:6:20: error: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Werror=format=] 6 | __builtin_printf(a, 0.5); | ^ ~~~ | | | double Clang can do (3) but not (2): <source>:3:23: error: format specifies type 'int' but the argument has type 'double' [-Werror,-Wformat] __builtin_printf(c, 0.5, 0); ~ ^~~ <source>:6:23: error: format specifies type 'int' but the argument has type 'double' [-Werror,-Wformat] __builtin_printf(a, 0.5); ~ ^~~ <source>:5:22: note: format string is defined here const char a[] = " %d "; ^~ %f