On 19/03/14 15:55, Paulo Matos wrote: > > >> -----Original Message----- >> From: David Brown [mailto:da...@westcontrol.com] >> Sent: 19 March 2014 14:44 >> To: Paulo Matos; gcc@gcc.gnu.org >> Subject: Re: returning short-enum and truncate doesn't trigger >> conversion warning >> >> 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. >> > > Apologies, but I submitted this to gcc devel because I do think it is a bug.
Usually the discovery of bugs gets discussed on the help list - fixes for the bugs are an issue for the developers list. And it is certainly a "help" issue until we know you have found a bug. > >>> >>> 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. >> > > 512 cannot be converted to an unsigned char without loss of precision. > The prints are actually not relevant for the question. They were just used > for me to confirm the sizes of the types. Not only are the prints not relevant, but they hid the real issue - I missed the point of your question! Conversions involving enumerations are not listed in the documentation for -Wconversion, but it would be nice to get a warning here. Filing it as an enhancement request seems reasonable. > enum xpto > { > A = 0, > B = 1, > X = 512 > }; > extern void print (unsigned int); > > unsigned char bar (enum xpto a) > { > return a; > } > > Variable a could be 0, 1 or 512. In case of the latter there is loss of > precision but still no warning. > >>> >>> $ ~/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 >>> >> >> >