Commit cd36e80c authored by Vitja Makarov's avatar Vitja Makarov

Fix error handling add error tests

parent 5e6e3aee
...@@ -4978,11 +4978,15 @@ class YieldExprNode(ExprNode): ...@@ -4978,11 +4978,15 @@ class YieldExprNode(ExprNode):
# #
# arg ExprNode the value to return from the generator # arg ExprNode the value to return from the generator
# label_name string name of the C label used for this yield # label_name string name of the C label used for this yield
# label_num integer yield label number
subexprs = ['arg'] subexprs = ['arg']
type = py_object_type type = py_object_type
label_num = 0
def analyse_types(self, env): def analyse_types(self, env):
if not self.label_num:
error(self.pos, "'yield' not supported here")
self.is_temp = 1 self.is_temp = 1
if self.arg is not None: if self.arg is not None:
self.arg.analyse_types(env) self.arg.analyse_types(env)
......
...@@ -1308,22 +1308,23 @@ class YieldNodeCollector(TreeVisitor): ...@@ -1308,22 +1308,23 @@ class YieldNodeCollector(TreeVisitor):
def __init__(self): def __init__(self):
super(YieldNodeCollector, self).__init__() super(YieldNodeCollector, self).__init__()
self.yields = [] self.yields = []
self.has_return = False self.returns = []
self.has_return_value = False
visit_Node = TreeVisitor.visitchildren visit_Node = TreeVisitor.visitchildren
def visit_YieldExprNode(self, node): def visit_YieldExprNode(self, node):
if self.has_return: if self.has_return_value:
error(node.pos, "'yield' outside function") error(node.pos, "'yield' outside function")
else: self.yields.append(node)
self.yields.append(node) node.label_num = len(self.yields)
node.label_num = len(self.yields)
def visit_ReturnStatNode(self, node): def visit_ReturnStatNode(self, node):
if self.yields: if node.value:
error(collector.returns[0].pos, "'return' with argument inside generator") self.has_return_value = True
else: if self.yields:
self.has_return = True error(node.pos, "'return' with argument inside generator")
self.returns.append(node)
def visit_ClassDefNode(self, node): def visit_ClassDefNode(self, node):
pass pass
...@@ -1348,6 +1349,8 @@ class MarkClosureVisitor(CythonTransform): ...@@ -1348,6 +1349,8 @@ class MarkClosureVisitor(CythonTransform):
collector.visitchildren(node) collector.visitchildren(node)
if collector.yields: if collector.yields:
if collector.returns and not collector.has_return_value:
error(collector.returns[0].pos, "'return' inside generators not yet supported ")
node.is_generator = True node.is_generator = True
node.needs_closure = True node.needs_closure = True
node.yields = collector.yields node.yields = collector.yields
......
def foo():
yield
return 0
def bar(a):
return 0
yield
def xxx():
yield
return
yield
class Foo:
yield
_ERRORS = u"""
3:4: 'return' with argument inside generator
7:4: 'yield' outside function
11:4: 'return' inside generators not yet supported
13:0: 'yield' not supported here
16:4: 'yield' not supported here
"""
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