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