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;
--- /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);
+}