class_docstr: This analyse extract positive subscripts from code.
  
  It is flow sensitive and aliasing is not taken into account as integer
  doesn't create aliasing in Python.
  
  >>> import gast as ast
  >>> from pythran import passmanager, backend
  >>> node = ast.parse('''
  ... def foo(a):
  ...     for i in builtins.range(1, 10):
  ...         c = i // 2
  ...     return''')
  >>> pm = passmanager.PassManager("test")
  >>> res = pm.gather(RangeValues, node)
  >>> res['c'], res['i']
  (Interval(low=0, high=5), Interval(low=1, high=10))
class_docstr_tok: ["This","analyse","extract","positive","subscripts","from","code",".","It","is","flow","sensitive","and","aliasing","is","not","taken","into","account","as","integer","does","n't","create","aliasing","in","Python",".",">",">",">","import","gast","as","ast",">",">",">","from","pythran","import","passmanager",",","backend",">",">",">","node","=","ast.parse","(","``","'","...","def","foo","(","a",")",":","...","for","i","in","builtins.range","(","1",",","10",")",":","...","c","=","i","\/\/","2","...","return","''","'",")",">",">",">","pm","=","passmanager.PassManager","(","``","test","''",")",">",">",">","res","=","pm.gather","(","RangeValues",",","node",")",">",">",">","res","[","'","c","'","]",",","res","[","'","i","'","]","(","Interval","(","low=0",",","high=5",")",",","Interval","(","low=1",",","high=10",")",")"]
docstr: Handle iterate variable in for loops.
  
  >>> import gast as ast
  >>> from pythran import passmanager, backend
  >>> node = ast.parse('''
  ... def foo():
  ...     a = b = c = 2
  ...     for i in builtins.range(1):
  ...         a -= 1
  ...         b += 1
  ...     return''')
  >>> pm = passmanager.PassManager("test")
  >>> res = pm.gather(RangeValues, node)
  >>> res['a']
  Interval(low=-inf, high=2)
  >>> res['b']
  Interval(low=2, high=inf)
  >>> res['c']
  Interval(low=2, high=2)
  
  >>> node = ast.parse('''
  ... def foo():
  ...     for i in (1, 2, 4):
  ...         a = i
  ...     return''')
  >>> pm = passmanager.PassManager("test")
  >>> res = pm.gather(RangeValues, node)
  >>> res['a']
  Interval(low=1, high=4)
docstr_tok: ["Handle","iterate","variable","in","for","loops",".",">",">",">","import","gast","as","ast",">",">",">","from","pythran","import","passmanager",",","backend",">",">",">","node","=","ast.parse","(","``","'","...","def","foo","(",")",":","...","a","=","b","=","c","=","2","...","for","i","in","builtins.range","(","1",")",":","...","a","-=","1","...","b","+=","1","...","return","''","'",")",">",">",">","pm","=","passmanager.PassManager","(","``","test","''",")",">",">",">","res","=","pm.gather","(","RangeValues",",","node",")",">",">",">","res","[","'","a","'","]","Interval","(","low=-inf",",","high=2",")",">",">",">","res","[","'","b","'","]","Interval","(","low=2",",","high=inf",")",">",">",">","res","[","'","c","'","]","Interval","(","low=2",",","high=2",")",">",">",">","node","=","ast.parse","(","``","'","...","def","foo","(",")",":","...","for","i","in","(","1",",","2",",","4",")",":","...","a","=","i","...","return","''","'",")",">",">",">","pm","=","passmanager.PassManager","(","``","test","''",")",">",">",">","res","=","pm.gather","(","RangeValues",",","node",")",">",">",">","res","[","'","a","'","]","Interval","(","low=1",",","high=4",")"]
code: def visit_For(self, node):
      """Handle iterate variable in for loops.
  
      >>> import gast as ast
      >>> from pythran import passmanager, backend
      >>> node = ast.parse('''
      ... def foo():
      ...     a = b = c = 2
      ...     for i in builtins.range(1):
      ...         a -= 1
      ...         b += 1
      ...     return''')
      >>> pm = passmanager.PassManager("test")
      >>> res = pm.gather(RangeValues, node)
      >>> res['a']
      Interval(low=-inf, high=2)
      >>> res['b']
      Interval(low=2, high=inf)
      >>> res['c']
      Interval(low=2, high=2)
  
      >>> node = ast.parse('''
      ... def foo():
      ...     for i in (1, 2, 4):
      ...         a = i
      ...     return''')
      >>> pm = passmanager.PassManager("test")
      >>> res = pm.gather(RangeValues, node)
      >>> res['a']
      Interval(low=1, high=4)
      """
      assert isinstance(
          node.target, ast.Name
      ), "For apply on variables."
      self.visit(node.iter)
      init_state = self.result.copy()
  
      bound_range(
          self.result,
          self.aliases,
          ast.Compare(node.target, [ast.In()], [node.iter]),
      )
  
      # visit body
      skip = {
          x for x in self.cfg.successors(node) if x is not node.body[0]
      }
      skip.add(node)
      next_ = self.cfg_visit(node.body[0], skip=skip)
  
      if self.no_backward:
          return self.visit_loop_successor(node)
      else:
          pass  # self.no_backward += 1
  
      prev_state = self.result
      self.result = prev_state.copy()
  
      self.cfg_visit(node.body[0], skip=skip)
  
      self.widen(self.result, prev_state)
      self.cfg_visit(node.body[0], skip=skip)
      self.unionify(init_state)
      pass  # self.no_backward -= 1
  
      return self.visit_loop_successor(node)
  
imports: import gast
  from collections import defaultdict
  from functools import reduce
  from pythran.analyses import Aliases, CFG
  from pythran.intrinsic import Intrinsic
  from pythran.passmanager import ModuleAnalysis
  from pythran.interval import Interval, IntervalTuple, UNKNOWN_RANGE
  from pythran.tables import MODULES, attributes
label_desc: Use image node_id 12 for calling the RangeValues obj's underlying member method code with example usage: obj.visit_For(node) and returns: self, self