changeset 345:5320fe65a65d trunk

[svn r366] Fixed identity exprs for structs was comparing addresses, not content!
author lindquist
date Sun, 13 Jul 2008 04:27:02 +0200
parents e20ce6d8d374
children c9d5c711d65a
files gen/structs.cpp gen/toir.cpp tests/mini/structs8.d
diffstat 3 files changed, 60 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/gen/structs.cpp	Sun Jul 13 04:11:08 2008 +0200
+++ b/gen/structs.cpp	Sun Jul 13 04:27:02 2008 +0200
@@ -389,7 +389,7 @@
 
     // set predicate
     llvm::ICmpInst::Predicate cmpop;
-    if (op == TOKequal)
+    if (op == TOKequal || op == TOKidentity)
         cmpop = llvm::ICmpInst::ICMP_EQ;
     else
         cmpop = llvm::ICmpInst::ICMP_NE;
--- a/gen/toir.cpp	Sun Jul 13 04:11:08 2008 +0200
+++ b/gen/toir.cpp	Sun Jul 13 04:27:02 2008 +0200
@@ -2260,7 +2260,11 @@
     // handle dynarray specially
     if (t1->ty == Tarray)
         return new DImValue(type, DtoDynArrayIs(op,u,v));
-
+    // also structs
+    else if (t1->ty == Tstruct)
+        return new DImValue(type, DtoStructEquals(op,u,v));
+
+    // FIXME this stuff isn't pretty
     LLValue* l = u->getRVal();
     LLValue* r = v->getRVal();
     LLValue* eval = 0;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/mini/structs8.d	Sun Jul 13 04:27:02 2008 +0200
@@ -0,0 +1,54 @@
+module test.structs8;
+
+struct S
+{
+    int a,b;
+}
+
+void main()
+{
+    S a = S(1,2);
+    S b = S(2,3);
+    S c = S(3,4);
+    S d = S(2,3);
+
+    assert(a == a);
+    assert(a != b);
+    assert(a != c);
+    assert(a != d);
+
+    assert(b != a);
+    assert(b == b);
+    assert(b != c);
+    assert(b == d);
+
+    assert(c != a);
+    assert(c != b);
+    assert(c == c);
+    assert(c != d);
+
+    assert(d != a);
+    assert(d == b);
+    assert(d != c);
+    assert(d == d);
+
+    assert(a is a);
+    assert(a !is b);
+    assert(a !is c);
+    assert(a !is d);
+
+    assert(b !is a);
+    assert(b is b);
+    assert(b !is c);
+    assert(b is d);
+
+    assert(c !is a);
+    assert(c !is b);
+    assert(c is c);
+    assert(c !is d);
+
+    assert(d !is a);
+    assert(d is b);
+    assert(d !is c);
+    assert(d is d);
+}