Mercurial > projects > ldc
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); +}