# HG changeset patch # User Tomas Lindquist Olsen # Date 1220541850 -7200 # Node ID f0c20d50d4b39936e9dfbca375dd2a7157ae61b6 # Parent aee6217b40848dfa3b6bbd66dc32c4cd9d1a150d Pointer comparisons were being treated as signed integers. Now they are handled as unsigned integers. diff -r aee6217b4084 -r f0c20d50d4b3 gen/toir.cpp --- a/gen/toir.cpp Thu Sep 04 17:17:40 2008 +0200 +++ b/gen/toir.cpp Thu Sep 04 17:24:10 2008 +0200 @@ -1178,23 +1178,25 @@ { 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; diff -r aee6217b4084 -r f0c20d50d4b3 tests/mini/ptrcond.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/mini/ptrcond.d Thu Sep 04 17:24:10 2008 +0200 @@ -0,0 +1,8 @@ +module mini.ptrcond; + +void main() +{ + char[4]* cp; + void* vp = &cp; + assert(cp < vp); +}