[Bug c++/35852] -Wconversion rejects bitwise negation and assignment, cannot cast around

fang at csl dot cornell dot edu gcc-bugzilla@gcc.gnu.org
Fri Aug 29 04:56:00 GMT 2008



------- Comment #7 from fang at csl dot cornell dot edu  2008-08-29 04:54 -------
(In reply to comment #5)
> This is the current situation as of revision 139373.
> 
> typedef unsigned short  ushort;
> 
> enum {
>         FOO = 0x13
> };
> 
> template <typename T>
> inline
> void
> andnot(T& lv, const T& rv) {
>   lv &= ~rv; // -Wconversion  int(lv) & ~(int(rv))
> }
> 
> int
> main(int, char*[]) {
>   ushort x = 99;
>   x = ~FOO;               // -Wsign-conversion -20 -> unsigned short
>   x &= ~FOO;              // -Wconversion int(x) & ~(int(19)) -> unsigned short
>   x = x & ~FOO;           // -Wconversion int(x) & ~(int(19)) -> unsigned short
>   x = x & ushort(~FOO);   // no warning
>   x = x & ushort(~ushort(FOO));   // no warning
>   x &= static_cast<ushort>(~FOO); // no warning
>   x &= ~x;                        // no warning
>   andnot(x, ushort(FOO)); // instantiated from here
>   return x;
> }
> 
> I don't see what is wrong with the warnings. Would you mind elaborating?

The situation then seems to have improved since I first reported it. 
Originally, none of the cases with explicit casts would pass, but comment #4
suggests that those have been fixed.  I expect the cast-less cases to have
warnings.  (I would consider this fixed.)


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35852



More information about the Gcc-bugs mailing list