[Bug c++/77739] [5/6/7 Regression] internal compiler error: in create_tmp_var, at gimple-expr.c:524

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Nov 22 16:54:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77739

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The problem is that some expressions are genericized twice.
First when genericizing the whole function, RESULT_DECL is determined to be
is_invisiref_parm and therefore references to it are turned into INDIRECT_REF
around it and the RESULT_DECL becomes REFERENCE_TYPE.
Later on gimplify_body calls unshare_body and unshares the INDIRECT_REF.
Then the INDIRECT_REF is gimplified into a MEM_REF.  And finally:
(cp_gimplify_expr) <case VEC_INIT_EXPR> does:
625             cp_walk_tree (expr_p, cp_fold_r, &pset, NULL);
626             cp_genericize_tree (expr_p);
and sees the is_invisiref_parm RESULT_DECL again (inside of MEM_REF) and turns
it again into INDIRECT_REF and that is later gimplified again into MEM_REF.  So
we have 2 nested MEM_REFs, so one indirection too many.

I think one possibility would be to be careful about REFERENCE_REF_Ps and
corresponding MEM_REFs (I guess would need to double check that the offset is 0
and type is compatible with the type of the reference), if their argument is
is_invisiref_parm, ensure it isn't convert_from_reference again.  Will try to
implement that now.


More information about the Gcc-bugs mailing list