From 4b34601a7918376bff45f8cf4de94fc20573f969 Mon Sep 17 00:00:00 2001 From: Alexey Prokhin Date: Sun, 2 Jan 2011 17:38:40 +0300 Subject: [PATCH] Make sure that a l-value of a binassign expressions is only evaluated once. --- gen/toir.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/gen/toir.cpp b/gen/toir.cpp index 8ae43465..74855fdf 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -85,7 +85,6 @@ DValue* VarExp::toElem(IRState* p) if (cachedLvalue) { LLValue* V = cachedLvalue; - cachedLvalue = NULL; return new DVarValue(type, V); } @@ -604,6 +603,9 @@ DValue* X##AssignExp::toElem(IRState* p) \ e3.type = e1->type; \ DValue* dst = findLvalue(p, e1)->toElem(p); \ DValue* res = e3.toElem(p); \ + while(e1->op == TOKcast) \ + e1 = ((CastExp*)e1)->e1; \ + e1->cachedLvalue = NULL; \ DValue* stval = DtoCast(loc, res, dst->getType()); \ DtoAssign(loc, dst, stval); \ return DtoCast(loc, res, type); \ @@ -1074,7 +1076,6 @@ DValue* PtrExp::toElem(IRState* p) if (cachedLvalue) { V = cachedLvalue; - cachedLvalue = NULL; } else { @@ -1101,7 +1102,6 @@ DValue* DotVarExp::toElem(IRState* p) { Logger::println("using cached lvalue"); LLValue *V = cachedLvalue; - cachedLvalue = NULL; VarDeclaration* vd = var->isVarDeclaration(); assert(vd); return new DVarValue(type, vd, V); @@ -1240,7 +1240,6 @@ DValue* IndexExp::toElem(IRState* p) if (cachedLvalue) { LLValue* V = cachedLvalue; - cachedLvalue = NULL; return new DVarValue(type, V); }