diff -r 651a88137be7 Cython/Compiler/Nodes.py
--- a/Cython/Compiler/Nodes.py	Fri Mar 20 17:51:46 2009 +0100
+++ b/Cython/Compiler/Nodes.py	Mon Mar 23 00:05:46 2009 +0530
@@ -3969,17 +3969,20 @@
         if from_range:
             range_bound = code.funcstate.allocate_temp(self.bound2.type, manage_ref=False)
             code.putln("%s = %s;" % (range_bound, self.bound2.result()))
+            loop_init = code.funcstate.allocate_temp(self.bound1.type, manage_ref=False)
+            code.putln("%s = %s;" % (loop_init, self.bound1.result()))
             # Skip the loop entirely (and avoid assigning to the loopvar) if
             # the loop is empty:
             code.putln("if (%s%s %s %s) {" % (
-                self.bound1.result(), offset, self.relation2, range_bound
+                loop_init, offset, self.relation2, range_bound
                 ))
         else:
             range_bound = self.bound2.result()
+            loop_init = self.bound1.result()
         code.putln(
             "for (%s = %s%s; %s %s %s; %s%s) {" % (
                 loopvar_name,
-                self.bound1.result(), offset,
+                loop_init, offset,
                 loopvar_name, self.relation2, range_bound,
                 loopvar_name, incop))
         if self.py_loopvar_node:
@@ -3993,6 +3996,7 @@
             # End the outer if statement:
             code.putln("} /* end if */")
             code.funcstate.release_temp(range_bound)
+            code.funcstate.release_temp(loop_init)
         else:
             code.putln("}")
         break_label = code.break_label
diff -r 651a88137be7 tests/bugs/rangeOptimization_T203.pyx
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/bugs/rangeOptimization_T203.pyx	Mon Mar 23 00:05:46 2009 +0530
@@ -0,0 +1,105 @@
+__doc__ = u"""
+>>> test_var(10, 5)
+at 0
+at 1
+at 2
+at 3
+at 4
+5
+>>> test_func(5)
+get_bound(5)
+at 0
+at 1
+at 2
+at 3
+at 4
+5
+>>> test_f()
+9
+>>> f()
+g called
+0
+1
+2
+2
+>>> test_step()
+g called
+0
+3
+6
+9
+9
+>>> test_cond()
+g called
+0
+1
+2
+2
+>>> test_start()
+g called
+3
+4
+5
+6
+7
+8
+9
+9
+"""
+
+cdef int get_bound(int m):
+    print "get_bound(%s)"%m
+    return m
+
+def test_var(int n, int m):
+    cdef int i
+    for i from 0 <= i < n:
+        print "at", i
+        n = m
+    return i
+
+def test_func(int n):
+    cdef int i
+    for i from 0 <= i < get_bound(n):
+        print "at", i
+    return i
+
+def test_f():
+    cdef int i,n
+    n = 10
+    for i in range(n):
+      if i == 5: n *= 2
+    print i
+
+cdef int g():
+    print "g called"
+    return 3
+
+def f():
+    cdef int i
+    i=0 
+    for i in range(g()):
+        print i
+    print i
+
+def test_step():
+    cdef int i
+    i=0
+    for i in range(0, 10, g()):
+        print i
+    print i
+
+def test_cond():
+    cdef int i
+    i=0
+    for i in range(0, g(), 1):
+        print i
+    print i
+
+def test_start():
+    cdef int i
+    i=0
+    for i in range(g(), 10, 1):
+        print i
+    print i
+
