Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jun 2003 18:25:33 +0930
From:      Malcolm Kay <malcolm.kay@internode.on.net>
To:        Sean Chittenden <sean@chittenden.org>, questions@freebsd.org
Subject:   Re: gcc me harder: -Wconversion bug?
Message-ID:  <200306101825.33674.malcolm.kay@internode.on.net>
In-Reply-To: <20030609230324.GL65470@perrin.int.nxad.com>
References:  <20030609230324.GL65470@perrin.int.nxad.com>

next in thread | previous in thread | raw e-mail | index | archive | help

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@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200306101825.33674.malcolm.kay>