diff --git a/gen/toir.cpp b/gen/toir.cpp index e4a91927..6909d72a 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -448,7 +448,7 @@ LLConstant* StringExp::toConstElem(IRState* p) 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 @@ DValue* AssignExp::toElem(IRState* p) 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 --git a/tests/mini/assign1.d b/tests/mini/assign1.d new file mode 100644 index 00000000..a1d92d5d --- /dev/null +++ b/tests/mini/assign1.d @@ -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); +}