From 9cece7dbff3d7fcfbd087893980aaceb40ccd0f3 Mon Sep 17 00:00:00 2001
From: Robert Bradshaw <robertwb@math.washington.edu>
Date: Wed, 21 Oct 2009 23:39:02 -0700
Subject: [PATCH] More cmp tests, refix C assignable types.

---
 Cython/Compiler/ExprNodes.py |  4 ++++
 tests/run/cmp.pyx            | 27 +++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index 5c3670b8a..9871eda37 100644
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -5151,6 +5151,10 @@ class CmpNode(object):
                     # one Python type and one non-Python type, not assignable
                     self.invalid_types_error(operand1, op, operand2)
                     new_common_type = error_type
+            elif type1.assignable_from(type2):
+                new_common_type = type1
+            elif type2.assignable_from(type1):
+                new_common_type = type2
             else:
                 # C types that we couldn't handle up to here are an error
                 self.invalid_types_error(operand1, op, operand2)
diff --git a/tests/run/cmp.pyx b/tests/run/cmp.pyx
index ecc30d249..6b5fd14ce 100644
--- a/tests/run/cmp.pyx
+++ b/tests/run/cmp.pyx
@@ -46,3 +46,30 @@ def typed_cmp(list L):
     print Ellipsis is L
     print 1 == L
     print L == 1.5
+
+def pointer_cmp():
+    """
+    >>> pointer_cmp()
+    True
+    False
+    True
+    """
+    cdef int* a = NULL
+    cdef double* b = NULL
+    cdef double** c = NULL
+    print a is NULL
+    print b is not NULL
+    print c == NULL
+
+def c_cmp(double a, int b, long c):
+    """
+    >>> c_cmp(1, 2, 3)
+    True
+    >>> c_cmp(1.5, 2, 2)
+    True
+    >>> c_cmp(1.5, 2, 0)
+    False
+    >>> c_cmp(1, 1, 3)
+    False
+    """
+    return a < b <= c
-- 
2.30.9