------- Comment #7 from manu at gcc dot gnu dot org  2009-03-08 03:54 -------
(In reply to comment #5)
> BTW, my comment was about the C++ frontend. IE:
>     .../gcc44/bin/g++ -c -Wall -W -Wconversion test.cpp

The code of Wconversion is shared between C and C++ front-ends, so they should
produce the same output. I get:

warning: conversion to ‘unsigned char’ from ‘unsigned int’ may alter
its value

My guess is that the code in conversion_warning is not able to handle an
expression so complex as:

<bit_ior_expr 0x2aaaab65f700
    type <integer_type 0x2aaaab4fc600 unsigned int public unsigned SI
        size <integer_cst 0x2aaaab4e8a20 constant 32>
        unit size <integer_cst 0x2aaaab4e8690 constant 4>
        align 32 symtab 0 alias set -1 canonical type 0x2aaaab4fc600 precision
32 min <integer_cst 0x2aaaab4e8a50 0> max <integer_cst 0x2aaaab4e89f0
4294967295>>

    arg 0 <bit_and_expr 0x2aaaab65f540 type <integer_type 0x2aaaab4fc600
unsigned int>

        arg 0 <nop_expr 0x2aaaab65f500 type <integer_type 0x2aaaab4fc600
unsigned int>
            arg 0 <parm_decl 0x2aaaab4f1b40 a1>>
        arg 1 <integer_cst 0x2aaaab665480 constant 192>>
    arg 1 <bit_and_expr 0x2aaaab65f6c0 type <integer_type 0x2aaaab4fc600
unsigned int>

        arg 0 <nop_expr 0x2aaaab65f680 type <integer_type 0x2aaaab4fc600
unsigned int>
            arg 0 <parm_decl 0x2aaaab4f1bd0 a2>>
        arg 1 <integer_cst 0x2aaaab6654b0 constant 32>>>

The approach using get_unwidened and shorten_binary_op only works for really
simple expressions. It needs to be more powerful to handle complex expressions. 

Alternatively, the expression should be simplified before reaching
conversion_warning. In fact, by the time we reach GIMPLE we have:

  [pr38522.C : 8] D.2074 = a1 & 192;
  [pr38522.C : 8] D.2075 = a2 & 32;
  [pr38522.C : 8] local = D.2074 | D.2075;

which can be handled by current Wconversion perfectly.

I don't have time to work on this, so anyone feel free to take it.


-- 

manu at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2009-03-08 03:54:27
               date|                            |
            Summary|g++ -Wconversion warnings   |-Wconversion does not handle
                   |                            |complex bitwise expressions


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

Reply via email to