Jakub Jelinek wrote: > On Fri, Jul 08, 2011 at 02:36:23PM +0200, Georg-Johann Lay wrote: >> I am on 4.7 trunk (175991) >> >> Configured with: ../../gcc.gnu.org/trunk/configure --target=avr >> --prefix=/local/gnu/install/gcc-4.7 --disable-nls --disable-shared >> --enable-languages=c,c++ --with-dwarf2 --disable-lto >> >> Suppose the following source from gcc.c-torture/compile/pr30338.c: >> >> extern char *grub_scratch_mem; >> int testload_func (char *arg, int flags) >> { >> int i; >> for (i = 0; i < 0x10ac0; i++) >> if (*((unsigned char *) ((0x200000 + i + (int) grub_scratch_mem))) >> != *((unsigned char *) ((0x300000 + i + (int) grub_scratch_mem)))) >> return 0; >> return 1; >> } >> >> And compiled with the command line >> >>> avr-gcc pr30338.c -S -Os -dp -mmcu=atmega128 -fdump-tree-original >> pr30338.c: In function 'testload_func': >> pr30338.c:9:11: warning: cast to pointer from integer of different >> size [-Wint-to-pointer-cast] >> pr30338.c:10:14: warning: cast to pointer from integer of different >> size [-Wint-to-pointer-cast] >> >> Frist of all, the warning is incorrect because Pmode=HImode=int on AVR. > > This is a gcc-help matter, if you have 16-bit int, then obviously > 0x200000 doesn't fit into signed or unsigned int, and as it fits into > long (which must be 32-bit at least), it has type long int. > See ISO C99, 6.4.4.1. > "The type of an integer constant is the first of the corresponding list in > which its value can be represented." > For no suffix and hexadecimal constant, the list is > {,long ,long long }{,unsigned }int > > Jakub
Thanks for clarification. Johann