https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92409
--- Comment #12 from rguenther at suse dot de <rguenther at suse dot de> --- On Fri, 8 Nov 2019, jamborm at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92409 > > --- Comment #11 from Martin Jambor <jamborm at gcc dot gnu.org> --- > (In reply to Richard Biener from comment #8) > > @@ -3634,6 +3636,10 @@ declare_return_variable (copy_body_data > > && !DECL_GIMPLE_REG_P (result) > > && DECL_P (var)) > > DECL_GIMPLE_REG_P (var) = 0; > > + > > + if (!useless_type_conversion_p (callee_type, caller_type)) > > + var = build1 (VIEW_CONVERT_EXPR, callee_type, var); > > + > > use = NULL; > > goto done; > > } > > OK, but please note that the callee_type and caller_type have > different sizes here: > > (gdb) pt callee_type > <integer_type 0x7ffff76bc5e8 int public SI > size <integer_cst 0x7ffff76a3cd8 type <integer_type 0x7ffff76bc0a8 > bitsizetype> constant 32>... > > (gdb) pt caller_type > <record_type 0x7ffff77c7dc8 str_t type_0 BLK > size <integer_cst 0x7ffff76c11b0 type <integer_type 0x7ffff76bc0a8 > bitsizetype> constant 96>... > > ...so you are creating a size-mismatched V_C_E. Don't you want to use > force_value_to_type instead? No, I need an lvalue here. Note V_C_Es like this are OK-ish (Ada creates those as well). In the end we're moving the mismatch handling to RTL which eventually will simply push to a stack slot and do a bitfield read (or ICE ...).