@@ -3830,13 +3830,15 @@ def visit_star_expr(self, expr: StarExpr) -> None:
3830
3830
expr .expr .accept (self )
3831
3831
3832
3832
def visit_yield_from_expr (self , e : YieldFromExpr ) -> None :
3833
- if not self .is_func_scope (): # not sure
3833
+ if not self .is_func_scope ():
3834
3834
self .fail ('"yield from" outside function' , e , serious = True , blocker = True )
3835
+ elif self .is_comprehension_stack [- 1 ]:
3836
+ self .fail ('"yield from" inside comprehension or generator expression' ,
3837
+ e , serious = True , blocker = True )
3838
+ elif self .function_stack [- 1 ].is_coroutine :
3839
+ self .fail ('"yield from" in async function' , e , serious = True , blocker = True )
3835
3840
else :
3836
- if self .function_stack [- 1 ].is_coroutine :
3837
- self .fail ('"yield from" in async function' , e , serious = True , blocker = True )
3838
- else :
3839
- self .function_stack [- 1 ].is_generator = True
3841
+ self .function_stack [- 1 ].is_generator = True
3840
3842
if e .expr :
3841
3843
e .expr .accept (self )
3842
3844
@@ -4214,20 +4216,22 @@ def visit__promote_expr(self, expr: PromoteExpr) -> None:
4214
4216
if analyzed is not None :
4215
4217
expr .type = analyzed
4216
4218
4217
- def visit_yield_expr (self , expr : YieldExpr ) -> None :
4219
+ def visit_yield_expr (self , e : YieldExpr ) -> None :
4218
4220
if not self .is_func_scope ():
4219
- self .fail ('"yield" outside function' , expr , serious = True , blocker = True )
4220
- else :
4221
- if self .function_stack [- 1 ].is_coroutine :
4222
- if self .options .python_version < (3 , 6 ):
4223
- self .fail ('"yield" in async function' , expr , serious = True , blocker = True )
4224
- else :
4225
- self .function_stack [- 1 ].is_generator = True
4226
- self .function_stack [- 1 ].is_async_generator = True
4221
+ self .fail ('"yield" outside function' , e , serious = True , blocker = True )
4222
+ elif self .is_comprehension_stack [- 1 ]:
4223
+ self .fail ('"yield" inside comprehension or generator expression' ,
4224
+ e , serious = True , blocker = True )
4225
+ elif self .function_stack [- 1 ].is_coroutine :
4226
+ if self .options .python_version < (3 , 6 ):
4227
+ self .fail ('"yield" in async function' , e , serious = True , blocker = True )
4227
4228
else :
4228
4229
self .function_stack [- 1 ].is_generator = True
4229
- if expr .expr :
4230
- expr .expr .accept (self )
4230
+ self .function_stack [- 1 ].is_async_generator = True
4231
+ else :
4232
+ self .function_stack [- 1 ].is_generator = True
4233
+ if e .expr :
4234
+ e .expr .accept (self )
4231
4235
4232
4236
def visit_await_expr (self , expr : AwaitExpr ) -> None :
4233
4237
if not self .is_func_scope ():
0 commit comments