File tree Expand file tree Collapse file tree 5 files changed +48
-11
lines changed Expand file tree Collapse file tree 5 files changed +48
-11
lines changed Original file line number Diff line number Diff line change 1+ Fixed a false positive `unreachable` for `NoReturn` coroutine functions.
2+
3+ Closes #9840.
Original file line number Diff line number Diff line change @@ -2200,8 +2200,12 @@ def is_terminating_func(node: nodes.Call) -> bool:
22002200 inferred ._proxied , astroid .UnboundMethod
22012201 ):
22022202 inferred = inferred ._proxied ._proxied
2203- if (
2203+ if ( # pylint: disable=too-many-boolean-expressions
22042204 isinstance (inferred , nodes .FunctionDef )
2205+ and (
2206+ not isinstance (inferred , nodes .AsyncFunctionDef )
2207+ or isinstance (node .parent , nodes .Await )
2208+ )
22052209 and isinstance (inferred .returns , nodes .Name )
22062210 and (inferred_func := safe_infer (inferred .returns ))
22072211 and hasattr (inferred_func , "qname" )
Original file line number Diff line number Diff line change 44import os
55import signal
66import sys
7+ from typing import NoReturn
78
89def func1 ():
910 return 1
@@ -79,3 +80,28 @@ def func12():
7980 incognito_function ()
8081 var = 2 + 2 # [unreachable]
8182 print (var )
83+
84+ def func13 ():
85+ def inner () -> NoReturn :
86+ while True :
87+ pass
88+
89+ inner ()
90+ print ("unreachable" ) # [unreachable]
91+
92+ async def func14 ():
93+ async def inner () -> NoReturn :
94+ while True :
95+ pass
96+
97+ await inner ()
98+ print ("unreachable" ) # [unreachable]
99+
100+ async def func15 ():
101+ async def inner () -> NoReturn :
102+ while True :
103+ pass
104+
105+ coro = inner ()
106+ print ("reachable" )
107+ await coro
Original file line number Diff line number Diff line change 1+ [testoptions]
2+ min_pyver=3.9
Original file line number Diff line number Diff line change 1- unreachable:10:4:10:24:func1:Unreachable code:HIGH
2- unreachable:15:8:15:28:func2:Unreachable code:HIGH
3- unreachable:21:8:21:28:func3:Unreachable code:HIGH
4- unreachable:25:4:25:16:func4:Unreachable code:HIGH
5- unreachable:38:4:38:24:func6:Unreachable code:HIGH
6- unreachable:42:4:42:15:func7:Unreachable code:INFERENCE
7- unreachable:64:4:64:15:func9:Unreachable code:INFERENCE
8- unreachable:69:4:69:15:func10:Unreachable code:INFERENCE
9- unreachable:74:4:74:15:func11:Unreachable code:INFERENCE
10- unreachable:80:4:80:15:func12:Unreachable code:INFERENCE
1+ unreachable:11:4:11:24:func1:Unreachable code:HIGH
2+ unreachable:16:8:16:28:func2:Unreachable code:HIGH
3+ unreachable:22:8:22:28:func3:Unreachable code:HIGH
4+ unreachable:26:4:26:16:func4:Unreachable code:HIGH
5+ unreachable:39:4:39:24:func6:Unreachable code:HIGH
6+ unreachable:43:4:43:15:func7:Unreachable code:INFERENCE
7+ unreachable:65:4:65:15:func9:Unreachable code:INFERENCE
8+ unreachable:70:4:70:15:func10:Unreachable code:INFERENCE
9+ unreachable:75:4:75:15:func11:Unreachable code:INFERENCE
10+ unreachable:81:4:81:15:func12:Unreachable code:INFERENCE
11+ unreachable:90:4:90:24:func13:Unreachable code:INFERENCE
12+ unreachable:98:4:98:24:func14:Unreachable code:INFERENCE
You can’t perform that action at this time.
0 commit comments