[svn r366] Fixed identity exprs for structs was comparing addresses, not content!

This commit is contained in:
Tomas Lindquist Olsen
2008-07-13 04:27:02 +02:00
parent a4e4f34a34
commit c4982165ba
3 changed files with 59 additions and 1 deletions

View File

@@ -389,7 +389,7 @@ LLValue* DtoStructEquals(TOK op, DValue* lhs, DValue* rhs)
// 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;

View File

@@ -2260,7 +2260,11 @@ DValue* IdentityExp::toElem(IRState* p)
// 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;

54
tests/mini/structs8.d Normal file
View File

@@ -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);
}