Skip to content
Snippets Groups Projects
  • Iain Buclaw's avatar
    df3fbd59
    d: Fix ICE in gimplify_var_or_parm_decl, at gimplify.c:2755 (PR100882) · df3fbd59
    Iain Buclaw authored
    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.
    df3fbd59
    History
    d: Fix ICE in gimplify_var_or_parm_decl, at gimplify.c:2755 (PR100882)
    Iain Buclaw authored
    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.