gcc me harder: -Wconversion bug?

Malcolm Kay malcolm.kay at internode.on.net
Tue Jun 10 01:55:45 PDT 2003


On Tue, 10 Jun 2003 08:33, Sean Chittenden wrote:
> [ Please CC: me on replies, not on questions@ ]
>
> Is this a GCC bug with the -Wconversion flag or am I doing something
> wrong?  I know it's just a warning, but it's irritating me more than
> that dumb Dan Quayle quote, "if it weren't for that horse, I wouldn't
> have spent an extra year in college..."  -sc
>
> % gcc -v
> Using built-in specs.
> Configured with: FreeBSD/i386 system compiler
> Thread model: posix
> gcc version 3.2.2 [FreeBSD] 20030205 (release)
> % uname -a
> FreeBSD hostname.example.com 5.1-CURRENT FreeBSD 5.1-CURRENT #2: Mon Jun  9
> 12:23:34 PDT 2003    
> sean at hostname.example.com:/usr/src/sys/i386/compile/HOSTNAME  i386
>
>
> % gcc -Wconversion test.c
> test.c: In function `main':
> test.c:5: warning: passing arg 1 of `f' with different width due to
> prototype
>
> /* Begin test.h */
> #ifndef __TEST_H__
> #define __TEST_H__
>
> #ifndef bool
> typedef char bool;
> #endif
>
> #ifndef true
> #define true    ((bool)1)
> #endif
>
> #ifndef false
> #define false   ((bool)0)
> #endif
>
> void f(bool b);
> #endif
> /* End test.h */
>
>
> /* Begin test.c */
> #include "test.h"
>
> int
> main(void) {
>   f(true);
>   return(0);
> }
>
> void
> f(bool b) { }
> /* End test.c */

It seems to me that this is doing exactly what is claimed for -Wconversion.
To quote from the gcc man page:
       -Wconversion
              Warn  if  a prototype causes a type conversion that
              is different from what would happen to the same ar-
              gument  in  the  absence  of a prototype.  ...

Now in the absence of a prototype for f() the argument true would be promoted 
from char/bool to int before being passed to the function. With the prototype
in scope it is not promoted. Different argument widths so warning delivered.

Malcolm


More information about the freebsd-questions mailing list