cmd/vet: lostcancel: suppress the check in the main.main function
When main.main returns, the process exits, so there's no need to cancel contexts. This CL was originally reviewed as https://go-review.googlesource.com/c/go/+/106915 and then retried in https://go-review.googlesource.com/c/go/+/148758 but then reverted due to an embarrassing sequence of careless moves. Change-Id: Icdee0650996a442023e030697f10d2c31fd5fdff Reviewed-on: https://go-review.googlesource.com/c/148877 Run-TryBot: Alan Donovan <adonovan@google.com> Run-TryBot: Michael Matloob <matloob@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Michael Matloob <matloob@golang.org>
This commit is contained in:
parent
d3a25d70bd
commit
4e34152f16
|
@ -132,11 +132,17 @@ func runFunc(pass *analysis.Pass, node ast.Node) {
|
||||||
var sig *types.Signature
|
var sig *types.Signature
|
||||||
switch node := node.(type) {
|
switch node := node.(type) {
|
||||||
case *ast.FuncDecl:
|
case *ast.FuncDecl:
|
||||||
g = cfgs.FuncDecl(node)
|
|
||||||
sig, _ = pass.TypesInfo.Defs[node.Name].Type().(*types.Signature)
|
sig, _ = pass.TypesInfo.Defs[node.Name].Type().(*types.Signature)
|
||||||
|
if node.Name.Name == "main" && sig.Recv() == nil && pass.Pkg.Name() == "main" {
|
||||||
|
// Returning from main.main terminates the process,
|
||||||
|
// so there's no need to cancel contexts.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
g = cfgs.FuncDecl(node)
|
||||||
|
|
||||||
case *ast.FuncLit:
|
case *ast.FuncLit:
|
||||||
g = cfgs.FuncLit(node)
|
|
||||||
sig, _ = pass.TypesInfo.Types[node.Type].Type.(*types.Signature)
|
sig, _ = pass.TypesInfo.Types[node.Type].Type.(*types.Signature)
|
||||||
|
g = cfgs.FuncLit(node)
|
||||||
}
|
}
|
||||||
if sig == nil {
|
if sig == nil {
|
||||||
return // missing type information
|
return // missing type information
|
||||||
|
|
|
@ -13,5 +13,5 @@ import (
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
testdata := analysistest.TestData()
|
testdata := analysistest.TestData()
|
||||||
analysistest.Run(t, testdata, lostcancel.Analyzer, "a")
|
analysistest.Run(t, testdata, lostcancel.Analyzer, "a", "b")
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "context"
|
||||||
|
|
||||||
|
// Return from main is handled specially.
|
||||||
|
// Since the program exits, there's no need to call cancel.
|
||||||
|
func main() {
|
||||||
|
_, cancel := context.WithCancel(nil)
|
||||||
|
if maybe {
|
||||||
|
cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func notMain() {
|
||||||
|
_, cancel := context.WithCancel(nil) // want "cancel function.*not used"
|
||||||
|
|
||||||
|
if maybe {
|
||||||
|
cancel()
|
||||||
|
}
|
||||||
|
} // want "return statement.*reached without using the cancel"
|
||||||
|
|
||||||
|
var maybe bool
|
Loading…
Reference in New Issue