Commit 1c85a781 authored by Robert Bradshaw's avatar Robert Bradshaw

Fix incompatible pointer assingments for bool binops.

Fixes #2059.
parent 5ae0b7cc
...@@ -11718,7 +11718,7 @@ class BoolBinopNode(ExprNode): ...@@ -11718,7 +11718,7 @@ class BoolBinopNode(ExprNode):
operator=self.operator, operator=self.operator,
operand1=operand1, operand2=operand2) operand1=operand1, operand2=operand2)
def generate_bool_evaluation_code(self, code, final_result_temp, and_label, or_label, end_label, fall_through): def generate_bool_evaluation_code(self, code, final_result_temp, final_result_type, and_label, or_label, end_label, fall_through):
code.mark_pos(self.pos) code.mark_pos(self.pos)
outer_labels = (and_label, or_label) outer_labels = (and_label, or_label)
...@@ -11727,19 +11727,20 @@ class BoolBinopNode(ExprNode): ...@@ -11727,19 +11727,20 @@ class BoolBinopNode(ExprNode):
else: else:
my_label = or_label = code.new_label('next_or') my_label = or_label = code.new_label('next_or')
self.operand1.generate_bool_evaluation_code( self.operand1.generate_bool_evaluation_code(
code, final_result_temp, and_label, or_label, end_label, my_label) code, final_result_temp, final_result_type, and_label, or_label, end_label, my_label)
and_label, or_label = outer_labels and_label, or_label = outer_labels
code.put_label(my_label) code.put_label(my_label)
self.operand2.generate_bool_evaluation_code( self.operand2.generate_bool_evaluation_code(
code, final_result_temp, and_label, or_label, end_label, fall_through) code, final_result_temp, final_result_type, and_label, or_label, end_label, fall_through)
def generate_evaluation_code(self, code): def generate_evaluation_code(self, code):
self.allocate_temp_result(code) self.allocate_temp_result(code)
result_type = PyrexTypes.py_object_type if self.type.is_pyobject else self.type
or_label = and_label = None or_label = and_label = None
end_label = code.new_label('bool_binop_done') end_label = code.new_label('bool_binop_done')
self.generate_bool_evaluation_code(code, self.result(), and_label, or_label, end_label, end_label) self.generate_bool_evaluation_code(code, self.result(), result_type, and_label, or_label, end_label, end_label)
code.put_label(end_label) code.put_label(end_label)
gil_message = "Truth-testing Python object" gil_message = "Truth-testing Python object"
...@@ -11824,7 +11825,7 @@ class BoolBinopResultNode(ExprNode): ...@@ -11824,7 +11825,7 @@ class BoolBinopResultNode(ExprNode):
test_result = self.arg.result() test_result = self.arg.result()
return (test_result, self.arg.type.is_pyobject) return (test_result, self.arg.type.is_pyobject)
def generate_bool_evaluation_code(self, code, final_result_temp, and_label, or_label, end_label, fall_through): def generate_bool_evaluation_code(self, code, final_result_temp, final_result_type, and_label, or_label, end_label, fall_through):
code.mark_pos(self.pos) code.mark_pos(self.pos)
# x => x # x => x
...@@ -11867,7 +11868,7 @@ class BoolBinopResultNode(ExprNode): ...@@ -11867,7 +11868,7 @@ class BoolBinopResultNode(ExprNode):
code.putln("} else {") code.putln("} else {")
self.value.generate_evaluation_code(code) self.value.generate_evaluation_code(code)
self.value.make_owned_reference(code) self.value.make_owned_reference(code)
code.putln("%s = %s;" % (final_result_temp, self.value.result())) code.putln("%s = %s;" % (final_result_temp, self.value.result_as(final_result_type)))
self.value.generate_post_assignment_code(code) self.value.generate_post_assignment_code(code)
# disposal: {not (and_label and or_label) [else]} # disposal: {not (and_label and or_label) [else]}
self.arg.generate_disposal_code(code) self.arg.generate_disposal_code(code)
......
...@@ -58,3 +58,18 @@ def or2_literal(): ...@@ -58,3 +58,18 @@ def or2_literal():
5 5
""" """
return False or 5 return False or 5
cdef class A(object):
def __repr__(self):
return "A"
def test_GH2059_missing_cast():
"""
>>> test_GH2059_missing_cast()
(A, A)
"""
cdef A a = A()
cdef object o = None
cdef A a_first = a or o
cdef A a_second = o or a
return a_first, a_second
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment