c/7696: Spurious shift warning

Christian Ehrhardt ehrhardt@mathematik.uni-ulm.de
Sun Apr 6 12:17:00 GMT 2003


http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7696

PR 7696 started out as a spurious warning on ia64 but it turns out that
this is probably a wrong code generation bug on any 64bit arch. The
source code in question is this:
$ cat 7696.c
               struct ia64_psr {
                 unsigned long cpl : 2;
               } x = {1};
		
               main ()
               {
                 unsigned long y =  ((unsigned long) x.cpl) << 40;
		 printf ("%lx %d\n", y, sizeof (y));
		 return 0;
               }
$ gcc -m64 7696.c 
7696.c: In function `main':
7696.c:7: warning: left shift count >= width of type
This program will print 
$ a.out
100 8

According to gdb the cast is thrown away early (build_binary_op doesn't see
it at all), probably because the bitfield is of type unsigned long. But
later on default_conversion sees that the precision is only two and converts
x.cpl to an integer (instead of a long). This oviouly hurts on arches where
int has 32 bit but long has 64.

Two different work arounds can be used to cure the problem: either
declare the bitfield as int or cast x.cpl to long long instead of long.
Obviously none of these is a fix. I'll see if I can come up with a
patch.

     regards   Christian

-- 
THAT'S ALL FOLKS!



More information about the Gcc-bugs mailing list