From d7de486493ecdb02cc4379b964a13aa76ec6a012 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Sun, 29 Mar 2009 11:43:45 +0200 Subject: [PATCH] A different fix to #218 and DMD2682 that does not lead to constant folding regressions. Fixes run/const_15, run/c/const_16_B. The price is removing the lvalueness of struct literals. If it turns out too much code depends on this behavior or we don't want to break with DMD, we could keep struct literals as lvalues and instead convert struct literals used as expression initializers into struct initializers. --- dmd/expression.c | 3 +++ dmd/expression.h | 4 +++- dmd/optimize.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) 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;