This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/35852] -Wconversion rejects bitwise negation and assignment, cannot cast around
- From: "manu at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 1 Aug 2008 17:54:10 -0000
- Subject: [Bug c++/35852] -Wconversion rejects bitwise negation and assignment, cannot cast around
- References: <bug-35852-3227@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #4 from manu at gcc dot gnu dot org 2008-08-01 17:54 -------
To be honest, I am not sure what deserves a warning and what not in this
testcase.
FOO is 19, ~FOO is -20. Therefore
ushort x = ~FOO seems to deserve a warning (with -Wsing-conversion at least).
x = x & -20 is handled as x = (int)x & -20. If x == 0xFFFF, this seems like the
case above and probably deserves a warning.
lv = lv & ~rv is seen as:
<bit_and_expr
type <integer_type int public SI
size <integer_cst constant 32>
unit size <integer_cst constant 4>
arg 0 <nop_expr 0x2aaaab238940 type <integer_type int>
arg 0 <indirect_ref type <integer_type short unsigned int>
arg 0 <parm_decl lv>>>
arg 1 <bit_not_expr type <integer_type int>
arg 0 <nop_expr type <integer_type int>
arg 0 <indirect_ref type <integer_type short unsigned int>
tree_0 arg 0 <parm_decl rv>>>>>
That is, we would need to peek inside each operand and recursively check
whether the expressions/conversions are safe. I don't know if this is feasible
at all and I personally don't know at this moment how to implement it properly.
On the other hand, in mainline, I don't get any warnings for:
x = x & ushort(~FOO); // -Wconversion
x = x & ushort(~ushort(FOO)); // -Wconversion
x &= static_cast<ushort>(~FOO); // -Wconversion
So that seems fixed.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35852