# HG changeset patch # User Tomas Lindquist Olsen # Date 1217775568 -7200 # Node ID 261b05cf4d1c8f3500c780045faae7293afaa8a3 # Parent 6989f040ea06904e64a08538af7a0c257ec28a8e Fixed problem in AssignExp where the result value might be uninitialized. see mini/assign1.d diff -r 6989f040ea06 -r 261b05cf4d1c gen/toir.cpp --- a/gen/toir.cpp Sun Aug 03 16:16:16 2008 +0200 +++ b/gen/toir.cpp Sun Aug 03 16:59:28 2008 +0200 @@ -448,7 +448,7 @@ DValue* AssignExp::toElem(IRState* p) { - Logger::print("AssignExp::toElem: %s | %s = %s\n", toChars(), e1->type->toChars(), e2->type ? e2->type->toChars() : 0); + Logger::print("AssignExp::toElem: %s | (%s)(%s = %s)\n", toChars(), type->toChars(), e1->type->toChars(), e2->type ? e2->type->toChars() : 0); LOG_SCOPE; if (e1->op == TOKarraylength) @@ -472,13 +472,16 @@ if (l->isSlice() || l->isComplex()) return l; - LLValue* v; - if (l->isVar() && l->isVar()->lval) - v = l->getLVal(); + if (type->toBasetype()->ty == Tstruct && e2->type->isintegral()) + { + // handle struct = 0; + return l; + } else - v = l->getRVal(); - - return new DVarValue(type, v, true); + { + assert(type->equals(e2->type)); + return r; + } } ////////////////////////////////////////////////////////////////////////////////////////// diff -r 6989f040ea06 -r 261b05cf4d1c tests/mini/assign1.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/mini/assign1.d Sun Aug 03 16:59:28 2008 +0200 @@ -0,0 +1,17 @@ +module mini.assign1; + +extern(C) int printf(char*, ...); + +struct X +{ + int a; + alias a b; +} +void main() +{ + X e = void; + e.a = e.b = 5; + printf("%d - %d\n", e.a, e.b); + assert(e.a == 5); + assert(e.a == e.b); +}