From 3a8125b7c83136d10b24cd99839caa887a852777 Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Thu, 4 Sep 2008 17:24:10 +0200 Subject: [PATCH] Pointer comparisons were being treated as signed integers. Now they are handled as unsigned integers. --- gen/toir.cpp | 10 ++++++---- tests/mini/ptrcond.d | 8 ++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 tests/mini/ptrcond.d diff --git a/gen/toir.cpp b/gen/toir.cpp index 72bf787c..76561ef1 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -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; diff --git a/tests/mini/ptrcond.d b/tests/mini/ptrcond.d new file mode 100644 index 00000000..4fd5870f --- /dev/null +++ b/tests/mini/ptrcond.d @@ -0,0 +1,8 @@ +module mini.ptrcond; + +void main() +{ + char[4]* cp; + void* vp = &cp; + assert(cp < vp); +}