Commit 83ade13 1 parent c25bef3 commit 83ade13 Copy full SHA for 83ade13
File tree 4 files changed +46
-11
lines changed
4 files changed +46
-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 @@ -2197,8 +2197,12 @@ def is_terminating_func(node: nodes.Call) -> bool:
2197
2197
inferred ._proxied , astroid .UnboundMethod
2198
2198
):
2199
2199
inferred = inferred ._proxied ._proxied
2200
- if (
2200
+ if ( # pylint: disable=too-many-boolean-expressions
2201
2201
isinstance (inferred , nodes .FunctionDef )
2202
+ and (
2203
+ not isinstance (inferred , nodes .AsyncFunctionDef )
2204
+ or isinstance (node .parent , nodes .Await )
2205
+ )
2202
2206
and isinstance (inferred .returns , nodes .Name )
2203
2207
and (inferred_func := safe_infer (inferred .returns ))
2204
2208
and hasattr (inferred_func , "qname" )
Original file line number Diff line number Diff line change 4
4
import os
5
5
import signal
6
6
import sys
7
+ from typing import NoReturn
7
8
8
9
def func1 ():
9
10
return 1
@@ -79,3 +80,28 @@ def func12():
79
80
incognito_function ()
80
81
var = 2 + 2 # [unreachable]
81
82
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
- 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