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



Richard Biener <rguenth at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

           Keywords|wrong-code                  |

             Status|ASSIGNED                    |RESOLVED

         Resolution|                            |INVALID



--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> 2012-12-03 
12:30:20 UTC ---

We ask fold_unary to fold



fold_unary_ignore_overflow_loc (loc=2147483655, code=FIX_TRUNC_EXPR, 

    type=0x7ffff6d17690, op0=0x7ffff6e23858)

    at /space/rguenther/src/svn/trunk/gcc/fold-const.c:8363

(gdb) call debug_tree (type)

 <integer_type 0x7ffff6d17690 unsigned int public unsigned SI

    size <integer_cst 0x7ffff6d1a0c0 type <integer_type 0x7ffff6d170a8

bitsizetype> constant 32>

    unit size <integer_cst 0x7ffff6d1a0e0 type <integer_type 0x7ffff6d17000

sizetype> constant 4>

    align 32 symtab 0 alias set -1 canonical type 0x7ffff6d17690 precision 32

min <integer_cst 0x7ffff6d1a100 0> max <integer_cst 0x7ffff6d1a0a0 4294967295>

    pointer_to_this <pointer_type 0x7ffff6d270a8>>

(gdb) call debug_tree (op0)

 <real_cst 0x7ffff6e23858

    type <real_type 0x7ffff6d17f18 double sizes-gimplified DF

        size <integer_cst 0x7ffff6d02d40 constant 64>

        unit size <integer_cst 0x7ffff6d02d60 constant 8>

        align 64 symtab 0 alias set -1 canonical type 0x7ffff6d17f18 precision

64

        pointer_to_this <pointer_type 0x7ffff6d1f150>>

    constant -1.0e+0>



which ends up in fold_convert_const_int_from_real which returns

0 with TREE_OVERFLOW set.



Note that you end up converting the double -1.0 to unsigned which according

to C99 6.3.1.4 ends up invoking undefined behavior.



GCC's behavior is not ill-defined, your testcase is.  That behavior changed

is fine as it is unsefined.

Reply via email to