aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-nested.c
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-06-04 19:38:26 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2021-06-04 20:45:01 +0200
commitdf3fbd5957f12927a459a2686f4eee55f66ec2f4 (patch)
treec9387e7a394e7e91adcaf72aa799f4a48f03e88b /gcc/tree-nested.c
parent6f8c9691495ad5a307db98dc19c3296ee4e6de64 (diff)
downloadgcc-df3fbd5957f12927a459a2686f4eee55f66ec2f4.zip
gcc-df3fbd5957f12927a459a2686f4eee55f66ec2f4.tar.gz
gcc-df3fbd5957f12927a459a2686f4eee55f66ec2f4.tar.bz2
d: Fix ICE in gimplify_var_or_parm_decl, at gimplify.c:2755 (PR100882)
Constructor calls for temporaries were reusing the TARGET_EXPR_SLOT of a TARGET_EXPR for an assignment, which later got passed to `build_assign', which stripped away the outer TARGET_EXPR, leaving a reference to a lone temporary with no declaration. This stripping away of the TARGET_EXPR also discarded any cleanups that may have been assigned to the expression as well. So now the reuse of TARGET_EXPR_SLOT has been removed, and `build_assign' now constructs assignments inside the TARGET_EXPR_INITIAL slot. This has also been extended to `return_expr', to deal with possibility of a TARGET_EXPR being returned. gcc/d/ChangeLog: PR d/100882 * d-codegen.cc (build_assign): Construct initializations inside TARGET_EXPR_INITIAL. (compound_expr): Remove intermediate expressions that have no side-effects. (return_expr): Construct returns inside TARGET_EXPR_INITIAL. * expr.cc (ExprVisitor::visit (CallExp *)): Remove useless assignment to TARGET_EXPR_SLOT. gcc/testsuite/ChangeLog: PR d/100882 * gdc.dg/pr100882a.d: New test. * gdc.dg/pr100882b.d: New test. * gdc.dg/pr100882c.d: New test. * gdc.dg/torture/pr100882.d: New test.
Diffstat (limited to 'gcc/tree-nested.c')
0 files changed, 0 insertions, 0 deletions