diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-06-04 19:38:26 +0200 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-06-04 20:45:01 +0200 |
commit | df3fbd5957f12927a459a2686f4eee55f66ec2f4 (patch) | |
tree | c9387e7a394e7e91adcaf72aa799f4a48f03e88b /gcc/tree-nested.c | |
parent | 6f8c9691495ad5a307db98dc19c3296ee4e6de64 (diff) | |
download | gcc-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