https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81980
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |msebor at gcc dot gnu.org Summary|Spurious |Spurious |-Wmissing-format-attribute |-Wmissing-format-attribute |warning in 32-bit mode |and missing -Wformat for | |va_list in 32-bit mode Known to fail| |7.3.0, 8.2.0, 9.0 --- Comment #5 from Martin Sebor <msebor at gcc dot gnu.org> --- The same problem also results in a missing -Wformat for the following test case: #include <stdarg.h> void f (va_list va) { __builtin_printf ("%s", va); } It's only diagnosed without -m32: $ gcc -S -Wall -Wmissing-format-attribute t.c t.c: In function ‘f’: t.c:5:23: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘__va_list_tag *’ [-Wformat=] 5 | __builtin_printf ("%s", va); | ~^ ~~ | | | | | __va_list_tag * | char * One way to deal with it would be compare the name of the type of the argument to "va_list" Another might be to treat __builtin_va_list as a type distinct from char* when it's defined to be char*.