------- Comment #4 from amylaar at gcc dot gnu dot org 2006-06-22 16:55 ------- (In reply to comment #2) > Hmm, I just get an error on a 64bit target so the testcase is at least invalid > for them: > t.c:19: error: cast from 'int*' to 'int' loses precision > You can write this as: exit ((int)(long long) &i); I have verified that this also reproduces the problem on sh-elf.
(In reply to comment #3) > Though it is obviously wrong from the front-end: > register void * D.2002; > (int * * const &) &D.2002 > As far as I can tell, this code in cp/except.c:expand_start_catch_block: /* Otherwise the type uses a bitwise copy, and we don't have to worry about the value of std::uncaught_exception and therefore can do the copy with the return value of __cxa_end_catch instead. */ else { tree init = do_begin_catch (); exp = create_temporary_var (ptr_type_node); DECL_REGISTER (exp) = 1; cp_finish_decl (exp, init, /*init_const_expr=*/false, NULL_TREE, LOOKUP_ONLYCONVERTING); initialize_handler_parm (decl, exp); is wrong. exp has the wrong type, hence the store emitted by cp_finish_decl will end up with the wrong alias set. I'm not sure yet what the right type is, though. would that be the type of decl for pointers, and a pointer to that type for non-pointers? Or a reference? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28139