Mercurial > projects > ldc
diff gen/toir.c @ 69:2b5a2eaa88be trunk
[svn r73] Identity expression for dynamic array and null was broken.
author | lindquist |
---|---|
date | Sun, 28 Oct 2007 04:23:38 +0100 |
parents | c4b3f5d2cd9b |
children | fb265a6efea1 |
line wrap: on
line diff
--- a/gen/toir.c Sun Oct 28 03:14:29 2007 +0100 +++ b/gen/toir.c Sun Oct 28 04:23:38 2007 +0100 @@ -425,7 +425,7 @@ if (t->ty == Tarray) { llvm::Constant* clen = llvm::ConstantInt::get(LLVM_DtoSize_t(),len,false); - return LLVM_DtoConstantSlice(clen, arrptr); + return LLVM_DtoConstSlice(clen, arrptr); } assert(0); @@ -2539,20 +2539,24 @@ elem* e = new elem; llvm::Value* l = u->getValue(); - llvm::Value* r = 0; - if (v->type == elem::NUL) - r = llvm::ConstantPointerNull::get(llvm::cast<llvm::PointerType>(l->getType())); - else - r = v->getValue(); + llvm::Value* r = v->getValue(); Type* t1 = LLVM_DtoDType(e1->type); if (t1->ty == Tarray) { - assert(l->getType() == r->getType()); + if (v->type == elem::NUL) { + r = NULL; + } + else { + assert(l->getType() == r->getType()); + } e->val = LLVM_DtoDynArrayIs(op,l,r); } else { llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; + if (t1->ty == Tpointer && v->type == elem::NUL && l->getType() != r->getType()) { + r = llvm::ConstantPointerNull::get(llvm::cast<llvm::PointerType>(l->getType())); + } e->val = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb()); } e->type = elem::VAL;