In <http://lists.gnu.org/archive/html/bug-tar/2006-06/msg00023.html> Denis Excoffier reports that compiling tar-1.15.91 generates the following bogus error message on powerpc-apple-darwin8.6.0:
openat.c: In function 'rpl_openat': openat.c:60: warning: 'mode_t' is promoted to 'int' when passed through '...' openat.c:60: warning: (so you should pass 'int' not 'mode_t' to 'va_arg') openat.c:60: note: if this code is reached, the program will abort I reproduced the problem on my i686-pc-linux-gnu platform, so the problem is generic. At the end of this description is a sample test case that illustrates the problem. Compiling it with 'gcc -c' yields the messages: t.c: In function 'foo': t.c:18: warning: 'mode_t' is promoted to 'int' when passed through '...' t.c:18: warning: (so you should pass 'int' not 'mode_t' to 'va_arg') t.c:18: note: if this code is reached, the program will abort This diagnostic is bogus: line 18 cannot possibly be executed because sizeof (mode_t) < sizeof (int). GCC knows this, since it doesn't generate code for line 18, so GCC should be smart enough to not generate the diagnostic for line 18. #include <stdarg.h> typedef unsigned short int mode_t; int foo (int flags, ...) { mode_t mode = 0; va_list arg; va_start (arg, flags); /* If mode_t is narrower than int, use the promoted type (int), not mode_t. Use sizeof to guess whether mode_t is nerrower; we don't know of any practical counterexamples. */ if (sizeof (mode_t) < sizeof (int)) mode = va_arg (arg, int); else mode = va_arg (arg, mode_t); /* This is line 18. */ va_end (arg); return flags == mode; } -- Summary: bogus warning for va_arg argument promotion Product: gcc Version: 4.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: eggert at gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28106