@@ -5066,7 +5066,9 @@ var allocationNilCheckQ = pattern.MustParse(`(IfStmt _ cond@(BinaryExpr lhs op@(
5066
5066
5067
5067
func CheckAllocationNilCheck (pass * analysis.Pass ) (interface {}, error ) {
5068
5068
irpkg := pass .ResultOf [buildir .Analyzer ].(* buildir.IR ).Pkg
5069
- fn := func (node ast.Node ) {
5069
+
5070
+ var path []ast.Node
5071
+ fn := func (node ast.Node , stack []ast.Node ) {
5070
5072
m , ok := code .Match (pass , allocationNilCheckQ , node )
5071
5073
if ! ok {
5072
5074
return
@@ -5077,10 +5079,9 @@ func CheckAllocationNilCheck(pass *analysis.Pass) (interface{}, error) {
5077
5079
return
5078
5080
}
5079
5081
lhs := m .State ["lhs" ].(ast.Expr )
5080
- path , exact := astutil .PathEnclosingInterval (code .File (pass , lhs ), lhs .Pos (), lhs .Pos ())
5081
- if ! exact {
5082
- // TODO(dh): when can this happen?
5083
- return
5082
+ path = path [:0 ]
5083
+ for i := len (stack ) - 1 ; i >= 0 ; i -- {
5084
+ path = append (path , stack [i ])
5084
5085
}
5085
5086
irfn := ir .EnclosingFunction (irpkg , path )
5086
5087
v , isAddr := irfn .ValueForExpr (lhs )
@@ -5178,8 +5179,7 @@ func CheckAllocationNilCheck(pass *analysis.Pass) (interface{}, error) {
5178
5179
report .Report (pass , cond , fallback )
5179
5180
}
5180
5181
}
5181
-
5182
5182
}
5183
- code .Preorder (pass , fn , (* ast .IfStmt )(nil ))
5183
+ code .PreorderStack (pass , fn , (* ast .IfStmt )(nil ))
5184
5184
return nil , nil
5185
5185
}
0 commit comments