Commit 9607b544 authored by Robert Bradshaw's avatar Robert Bradshaw

Fix bug for python targets in for...from loops, allow non-integer numeric arguments.

parent 39048dc5
...@@ -2599,7 +2599,7 @@ class TypecastNode(ExprNode): ...@@ -2599,7 +2599,7 @@ class TypecastNode(ExprNode):
error(self.pos, "Casting temporary Python object to non-Python type") error(self.pos, "Casting temporary Python object to non-Python type")
if to_py and not from_py: if to_py and not from_py:
self.result_ctype = py_object_type self.result_ctype = py_object_type
self.is_temp = 1 self.is_temp = 1
def check_const(self): def check_const(self):
self.operand.check_const() self.operand.check_const()
...@@ -2846,7 +2846,7 @@ class NumBinopNode(BinopNode): ...@@ -2846,7 +2846,7 @@ class NumBinopNode(BinopNode):
"/": "PyNumber_Divide", "/": "PyNumber_Divide",
"//": "PyNumber_FloorDivide", "//": "PyNumber_FloorDivide",
"%": "PyNumber_Remainder", "%": "PyNumber_Remainder",
"**": "PyNumber_Power" "**": "PyNumber_Power"
} }
......
...@@ -2532,8 +2532,12 @@ class ForFromStatNode(StatNode): ...@@ -2532,8 +2532,12 @@ class ForFromStatNode(StatNode):
self.target.analyse_target_types(env) self.target.analyse_target_types(env)
self.bound1.analyse_types(env) self.bound1.analyse_types(env)
self.bound2.analyse_types(env) self.bound2.analyse_types(env)
self.bound1 = self.bound1.coerce_to(self.target.type, env) if self.target.type.is_numeric:
self.bound2 = self.bound2.coerce_to(self.target.type, env) self.bound1 = self.bound1.coerce_to(self.target.type, env)
self.bound2 = self.bound2.coerce_to(self.target.type, env)
else:
self.bound1 = self.bound1.coerce_to_integer(env)
self.bound2 = self.bound2.coerce_to_integer(env)
if self.step is not None: if self.step is not None:
if isinstance(self.step, ExprNodes.UnaryMinusNode): if isinstance(self.step, ExprNodes.UnaryMinusNode):
warning(self.step.pos, "Probable infinite loop in for-from-by statment. Consider switching the directions of the relations.", 2) warning(self.step.pos, "Probable infinite loop in for-from-by statment. Consider switching the directions of the relations.", 2)
...@@ -2542,14 +2546,14 @@ class ForFromStatNode(StatNode): ...@@ -2542,14 +2546,14 @@ class ForFromStatNode(StatNode):
if not (self.bound2.is_name or self.bound2.is_literal): if not (self.bound2.is_name or self.bound2.is_literal):
self.bound2 = self.bound2.coerce_to_temp(env) self.bound2 = self.bound2.coerce_to_temp(env)
target_type = self.target.type target_type = self.target.type
if not (target_type.is_pyobject or target_type.is_int): if not (target_type.is_pyobject or target_type.is_numeric):
error(self.target.pos, error(self.target.pos,
"Integer for-loop variable must be of type int or Python object") "Integer for-loop variable must be of type int or Python object")
#if not (target_type.is_pyobject #if not (target_type.is_pyobject
# or target_type.assignable_from(PyrexTypes.c_int_type)): # or target_type.assignable_from(PyrexTypes.c_int_type)):
# error(self.target.pos, # error(self.target.pos,
# "Cannot assign integer to variable of type '%s'" % target_type) # "Cannot assign integer to variable of type '%s'" % target_type)
if target_type.is_int: if target_type.is_numeric:
self.is_py_target = 0 self.is_py_target = 0
self.loopvar_name = self.target.entry.cname self.loopvar_name = self.target.entry.cname
self.py_loopvar_node = None self.py_loopvar_node = None
......
version = '0.9.6.10' version = '0.9.6.10.1'
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