Pointer comparisons were being treated as signed integers. Now they are handled as unsigned integers.

This commit is contained in:
Tomas Lindquist Olsen
2008-09-04 17:24:10 +02:00
parent ee29f29659
commit 3a8125b7c8
2 changed files with 14 additions and 4 deletions

View File

@@ -1178,23 +1178,25 @@ DValue* CmpExp::toElem(IRState* p)
{
llvm::ICmpInst::Predicate cmpop;
bool skip = false;
// pointers don't report as being unsigned
bool uns = (t->isunsigned() || t->ty == Tpointer);
switch(op)
{
case TOKlt:
case TOKul:
cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_ULT : llvm::ICmpInst::ICMP_SLT;
cmpop = uns ? llvm::ICmpInst::ICMP_ULT : llvm::ICmpInst::ICMP_SLT;
break;
case TOKle:
case TOKule:
cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_ULE : llvm::ICmpInst::ICMP_SLE;
cmpop = uns ? llvm::ICmpInst::ICMP_ULE : llvm::ICmpInst::ICMP_SLE;
break;
case TOKgt:
case TOKug:
cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_UGT : llvm::ICmpInst::ICMP_SGT;
cmpop = uns ? llvm::ICmpInst::ICMP_UGT : llvm::ICmpInst::ICMP_SGT;
break;
case TOKge:
case TOKuge:
cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_UGE : llvm::ICmpInst::ICMP_SGE;
cmpop = uns ? llvm::ICmpInst::ICMP_UGE : llvm::ICmpInst::ICMP_SGE;
break;
case TOKue:
cmpop = llvm::ICmpInst::ICMP_EQ;

8
tests/mini/ptrcond.d Normal file
View File

@@ -0,0 +1,8 @@
module mini.ptrcond;
void main()
{
char[4]* cp;
void* vp = &cp;
assert(cp < vp);
}