On 19/03/14 15:33, Paulo Matos wrote:
> Hi all,
> 
> This is either a C standard subtlety or a bug in GCC.

This is perfectly normal behaviour for C, and not a bug.  It is also a
topic for the gcc help list, rather than the development list.

> For example:
> unsigned short foo (unsigned int a)
> {
>   return a;
> }

This gives a conversion warning because a short unsigned int (16-bit on
x86) is smaller than an unsigned int (32-bit on x86).  So calling
foo(0x12345678) will cause truncation.

> 
> enum xpto
> {
>   A = 0,
>   B = 1,
>   X = 512
> };
> 
> extern void print (unsigned int);
> 
> unsigned char bar (enum xpto a)
> {
>   print (sizeof (unsigned char));
>   print (sizeof (enum xpto));
>   return a;
> }

The sizeof operator returns an integer of type size_t (typically the
same as unsigned int or unsigned long, depending on the platform
details).  But the compiler can see that the particular values in
question - 1 and 2 - can be converted to unsigned int without loss of
precision of changing the value.  Therefore no warning is giving.

> 
> $ ~/work/tmp/GCC/builds/gcc-trunk/gcc/cc1 -O2 test.c -Wall -Wconversion 
> --short-enums -quiet
> test.c: In function 'foo':
> test.c:3:3: warning: conversion to 'short unsigned int' from 'unsigned int' 
> may alter its value [-Wconversion]
>    return a;
>    ^
> 
> I was expecting a warning for bar as well since sizeof unsigned char is 1 and 
> sizeof enum xpto is 2, therefore the value is truncated but no warning is 
> issued.
> 
> Shall I open a PR?
> 
> Paulo Matos
> 



Reply via email to