https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77328
--- Comment #4 from Eric Gallager <egallager at gcc dot gnu.org> --- (In reply to Martin Sebor from comment #3) > GCC 8 and 9 output for the test case is slightly different (underlining the > sprintf argument is a nice improvement) but still not what it should be: > > pr77328.c: In function ‘f’: > pr77328.c:7:30: warning: format ‘%i’ expects argument of type ‘int’, but > argument 4 has type ‘double’ [-Wformat=] > __builtin_sprintf (d, "%i %i", 1, 2.0); > ~^ ~~~ > %f > pr77328.c:9:9: warning: format ‘%i’ expects argument of type ‘int’, but > argument 4 has type ‘double’ [-Wformat=] > P (d, "%i %i", 1, 2.0); > ^~~~~~~ ~~~ > pr77328.c:5:45: note: in definition of macro ‘P’ > #define P(d, f, a, b) __builtin_sprintf (d, f, a, b) > ^ With gcc 10 it's now: $ /usr/local/bin/gcc -c -S -Wformat 77328.c 77328.c: In function 'f': 77328.c:7:29: warning: format '%i' expects argument of type 'int', but argument 4 has type 'double' [-Wformat=] 7 | __builtin_sprintf (d, "%i %i", 1, 2.0); | ~^ ~~~ | | | | int double | %f 77328.c:9:8: warning: format '%i' expects argument of type 'int', but argument 4 has type 'double' [-Wformat=] 9 | P (d, "%i %i", 1, 2.0); | ^~~~~~~ ~~~ | | | double 77328.c:5:45: note: in definition of macro 'P' 5 | #define P(d, f, a, b) __builtin_sprintf (d, f, a, b) | ^ 77328.c:9:13: note: format string is defined here 9 | P (d, "%i %i", 1, 2.0); | ~^ | | | int | %f $