Mercurial > projects > ldc
changeset 575:f0c20d50d4b3
Pointer comparisons were being treated as signed integers. Now they are handled as unsigned integers.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Thu, 04 Sep 2008 17:24:10 +0200 |
parents | aee6217b4084 |
children | d159da5201f1 |
files | gen/toir.cpp tests/mini/ptrcond.d |
diffstat | 2 files changed, 14 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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;