diff --git a/dmd/expression.c b/dmd/expression.c index 39e8e850..596a5a9f 100644 --- a/dmd/expression.c +++ b/dmd/expression.c @@ -3234,10 +3234,13 @@ int StructLiteralExp::isLvalue() } #endif +/* +Removed in LDC. See declaration. Expression *StructLiteralExp::toLvalue(Scope *sc, Expression *e) { return this; } +*/ int StructLiteralExp::checkSideEffect(int flag) diff --git a/dmd/expression.h b/dmd/expression.h index ce3357d0..70b6b956 100644 --- a/dmd/expression.h +++ b/dmd/expression.h @@ -502,7 +502,9 @@ struct StructLiteralExp : Expression void scanForNestedRef(Scope *sc); Expression *optimize(int result); Expression *interpret(InterState *istate); - Expression *toLvalue(Scope *sc, Expression *e); + // LDC: struct literals aren't lvalues! Taking their address can lead to + // incorrect behavior, see LDC#218, DMD#2682 + // Expression *toLvalue(Scope *sc, Expression *e); int inlineCost(InlineCostState *ics); Expression *doInline(InlineDoState *ids); diff --git a/dmd/optimize.c b/dmd/optimize.c index c8582836..94504b89 100644 --- a/dmd/optimize.c +++ b/dmd/optimize.c @@ -46,7 +46,7 @@ Expression *fromConstInitializer(Expression *e1) if (e1->op == TOKvar) { VarExp *ve = (VarExp *)e1; VarDeclaration *v = ve->var->isVarDeclaration(); - if (v && v->isConst() && v->init && !v->init->isStructInitializer()) + if (v && v->isConst() && v->init) { Expression *ei = v->init->toExpression(); if (ei && ei->type) e1 = ei;