http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52672
Meador Inge <meadori at codesourcery dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Version|4.6.4 |4.8.0
--- Comment #1 from Meador Inge <meadori at codesourcery dot com> 2012-03-23
02:29:46 UTC ---
Actually I found a smaller repro that also triggers in trunk:
typedef unsigned long * ul_ptr;
constexpr void * a = (void*) ((ul_ptr)(((ul_ptr)0x01000010)[14]))[0];
The problem happens when 'cxx_eval_indirect_ref' is presented with an
indirect reference expression that looks like:
<indirect_ref 0xf7dd6018
type <integer_type 0xf7c524e0 long unsigned int public unsigned SI
size <integer_cst 0xf7c3b5cc constant 32>
unit size <integer_cst 0xf7c3b5e8 constant 4>
align 32 symtab 0 alias set -1 canonical type 0xf7c524e0 precision 32
min <integer_cst 0xf7c3b984 0> max <integer_cst 0xf7c3b968 4294967295>
pointer_to_this <pointer_type 0xf7dc9cc0>>
arg 0 <nop_expr 0xf7dd6000
type <pointer_type 0xf7dc9d20 ul_ptr type <integer_type 0xf7c524e0 long
unsigned int>
unsigned SI size <integer_cst 0xf7c3b5cc 32> unit size <integer_cst
0xf7c3b5e8 4>
align 32 symtab 0 alias set -1 canonical type 0xf7dc9cc0>
arg 0 <indirect_ref 0xf7da3fc0 type <integer_type 0xf7c524e0 long
unsigned int>
arg 0 <integer_cst 0xf7cabe54 constant 16777288>
/home/meadori/etc/bugs/issue13031.cpp:3:63>
/home/meadori/etc/bugs/issue13031.cpp:3:68>
/home/meadori/etc/bugs/issue13031.cpp:3:68>
It calls into 'cxx_fold_indirect_ref' to fold the indirect reference operand
and
ends up stripping the NOP cast ending up with:
<indirect_ref 0xf7da3fc0
type <integer_type 0xf7c524e0 long unsigned int public unsigned SI
size <integer_cst 0xf7c3b5cc constant 32>
unit size <integer_cst 0xf7c3b5e8 constant 4>
align 32 symtab 0 alias set -1 canonical type 0xf7c524e0 precision 32
min <integer_cst 0xf7c3b984 0> max <integer_cst 0xf7c3b968 4294967295>
pointer_to_this <pointer_type 0xf7dc9cc0>>
arg 0 <integer_cst 0xf7cabe54 type <pointer_type 0xf7dc9d20 ul_ptr>
constant 16777288>
which, of course, fails the 'gcc_assert (POINTER_TYPE_P (subtype));' assert
in 'cxx_fold_indirect_ref'.
I would like to work out a patch for this one. Any tips would be appreciated.