changeset 467:261b05cf4d1c

Fixed problem in AssignExp where the result value might be uninitialized. see mini/assign1.d
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sun, 03 Aug 2008 16:59:28 +0200
parents 6989f040ea06
children 45a67b6f1310
files gen/toir.cpp tests/mini/assign1.d
diffstat 2 files changed, 27 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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;
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
--- /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);
+}