Fixed a bug in the compiler that caused problems with loop not being referenced in...
authorArmin Ronacher <armin.ronacher@active-4.com>
Thu, 14 Aug 2008 10:31:12 +0000 (12:31 +0200)
committerArmin Ronacher <armin.ronacher@active-4.com>
Thu, 14 Aug 2008 10:31:12 +0000 (12:31 +0200)
--HG--
branch : trunk

jinja2/compiler.py
tests/test_forloop.py

index ad7857d07e3076928f507dbfee06ce5b0b22eb86..4c0944a5c34e285d6c36676778d7394ba790c2ad 100644 (file)
@@ -909,7 +909,8 @@ class CodeGenerator(NodeVisitor):
 
         # make sure the loop variable is a special one and raise a template
         # assertion error if a loop tries to write to loop
-        loop_frame.identifiers.add_special('loop')
+        if extended_loop:
+            loop_frame.identifiers.add_special('loop')
         for name in node.find_all(nodes.Name):
             if name.ctx == 'store' and name.name == 'loop':
                 self.fail('Can\'t assign to special loop variable '
index a4f057c2f132e7b29043dde37f88acc8e4261b88..0c307ecbc6662c200583ecbfedd4e5d3945babdb 100644 (file)
@@ -144,3 +144,12 @@ def test_scoped_special_var(env):
     t = env.from_string('{% for s in seq %}[{{ loop.first }}{% for c in s %}'
                         '|{{ loop.first }}{% endfor %}]{% endfor %}')
     assert t.render(seq=('ab', 'cd')) == '[True|True|False][False|True|False]'
+
+
+def test_scoped_loop_var(env):
+    t = env.from_string('{% for x in seq %}{{ loop.first }}'
+                        '{% for y in seq %}{% endfor %}{% endfor %}')
+    assert t.render(seq='ab') == 'TrueFalse'
+    t = env.from_string('{% for x in seq %}{% for y in seq %}'
+                        '{{ loop.first }}{% endfor %}{% endfor %}')
+    assert t.render(seq='ab') == 'TrueFalseTrueFalse'