added unittest for recursive for loop

--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 4716de1..cf0f4a5 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -534,7 +534,7 @@
             raise TemplateAssertionError('It\'s not possible to set and '
                                          'access variables derived from '
                                          'an outer scope! (affects: %s' %
-                                         vars, node.lineno, self.name)
+                                         vars, node.lineno, self.filename)
 
         # remove variables from a closure from the frame's undeclared
         # identifiers.
@@ -585,7 +585,7 @@
             if block.name in self.blocks:
                 raise TemplateAssertionError('block %r defined twice' %
                                              block.name, block.lineno,
-                                             self.name)
+                                             self.filename)
             self.blocks[block.name] = block
 
         # find all imports and import them
@@ -601,7 +601,7 @@
                     self.writeline('import %s as %s' % (imp, alias))
 
         # add the load name
-        self.writeline('name = %r' % self.name)
+        self.writeline('name = %r' % self.filename)
 
         # generate the root render function.
         self.writeline('def root(context, environment=environment):', extra=1)
@@ -688,7 +688,7 @@
         if not frame.toplevel:
             raise TemplateAssertionError('cannot use extend from a non '
                                          'top-level scope', node.lineno,
-                                         self.name)
+                                         self.filename)
 
         # if the number of extends statements in general is zero so
         # far, we don't have to add a check if something extended
diff --git a/jinja2/runtime.py b/jinja2/runtime.py
index d734182..2605717 100644
--- a/jinja2/runtime.py
+++ b/jinja2/runtime.py
@@ -205,12 +205,16 @@
     def __iter__(self):
         return self
 
-    def __call__(self, iterable):
+    def loop(self, iterable):
         if self._recurse is None:
             raise TypeError('Tried to call non recursive loop.  Maybe you '
-                            'forgot the "recursive" keyword.')
+                            "forgot the 'recursive' modifier.")
         return self._recurse(iterable, self._recurse)
 
+    # a nifty trick to enhance the error message if someone tried to call
+    # the the loop without or with too many arguments.
+    __call__ = loop; del loop
+
     def next(self):
         self.index0 += 1
         return self._next(), self
diff --git a/tests/test_forloop.py b/tests/test_forloop.py
index dd25494..9f9020a 100644
--- a/tests/test_forloop.py
+++ b/tests/test_forloop.py
@@ -21,6 +21,9 @@
 SCOPE = '''{% for item in seq %}{% endfor %}{{ item }}'''
 VARLEN = '''{% for item in iter %}{{ item }}{% endfor %}'''
 NONITER = '''{% for item in none %}...{% endfor %}'''
+RECURSIVE = '''{% for item in seq recursive -%}
+    [{{ item.a }}{% if item.b %}[{{ loop(item.b) }}]{% endif %}]
+{%- endfor %}'''
 
 
 def test_simple(env):
@@ -79,3 +82,12 @@
 def test_noniter(env):
     tmpl = env.from_string(NONITER)
     raises(TypeError, tmpl.render)
+
+
+def test_recursive(env):
+    tmpl = env.from_string(RECURSIVE)
+    assert tmpl.render(seq=[
+        dict(a=1, b=[dict(a=1), dict(a=2)]),
+        dict(a=2, b=[dict(a=1), dict(a=2)]),
+        dict(a=3, b=[dict(a='a')])
+    ]) == '[1[[1][2]]][2[[1][2]]][3[[a]]]'