--- /dev/null
+// Copyright 2016 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 a
+
+import (
+ "context"
+ "log"
+ "os"
+ "testing"
+ "time"
+)
+
+var bg = context.Background()
+
+// Check the three functions and assignment forms (var, :=, =) we look for.
+// (Do these early: line numbers are fragile.)
+func _() {
+ var _, cancel = context.WithCancel(bg) // want `the cancel function is not used on all paths \(possible context leak\)`
+ if false {
+ _ = cancel
+ }
+} // want "this return statement may be reached without using the cancel var defined on line 20"
+
+func _() {
+ _, cancel2 := context.WithDeadline(bg, time.Time{}) // want "the cancel2 function is not used..."
+ if false {
+ _ = cancel2
+ }
+} // want "may be reached without using the cancel2 var defined on line 27"
+
+func _() {
+ var cancel3 func()
+ _, cancel3 = context.WithTimeout(bg, 0) // want "function is not used..."
+ if false {
+ _ = cancel3
+ }
+} // want "this return statement may be reached without using the cancel3 var defined on line 35"
+
+func _() {
+ ctx, _ := context.WithCancel(bg) // want "the cancel function returned by context.WithCancel should be called, not discarded, to avoid a context leak"
+ ctx, _ = context.WithTimeout(bg, 0) // want "the cancel function returned by context.WithTimeout should be called, not discarded, to avoid a context leak"
+ ctx, _ = context.WithDeadline(bg, time.Time{}) // want "the cancel function returned by context.WithDeadline should be called, not discarded, to avoid a context leak"
+ _ = ctx
+}
+
+func _() {
+ _, cancel := context.WithCancel(bg)
+ defer cancel() // ok
+}
+
+func _() {
+ _, cancel := context.WithCancel(bg) // want "not used on all paths"
+ if condition {
+ cancel()
+ }
+ return // want "this return statement may be reached without using the cancel var"
+}
+
+func _() {
+ _, cancel := context.WithCancel(bg)
+ if condition {
+ cancel()
+ } else {
+ // ok: infinite loop
+ for {
+ print(0)
+ }
+ }
+}
+
+func _() {
+ _, cancel := context.WithCancel(bg) // want "not used on all paths"
+ if condition {
+ cancel()
+ } else {
+ for i := 0; i < 10; i++ {
+ print(0)
+ }
+ }
+} // want "this return statement may be reached without using the cancel var"
+
+func _() {
+ _, cancel := context.WithCancel(bg)
+ // ok: used on all paths
+ switch someInt {
+ case 0:
+ new(testing.T).FailNow()
+ case 1:
+ log.Fatal()
+ case 2:
+ cancel()
+ case 3:
+ print("hi")
+ fallthrough
+ default:
+ os.Exit(1)
+ }
+}
+
+func _() {
+ _, cancel := context.WithCancel(bg) // want "not used on all paths"
+ switch someInt {
+ case 0:
+ new(testing.T).FailNow()
+ case 1:
+ log.Fatal()
+ case 2:
+ cancel()
+ case 3:
+ print("hi") // falls through to implicit return
+ default:
+ os.Exit(1)
+ }
+} // want "this return statement may be reached without using the cancel var"
+
+func _(ch chan int) {
+ _, cancel := context.WithCancel(bg) // want "not used on all paths"
+ select {
+ case <-ch:
+ new(testing.T).FailNow()
+ case ch <- 2:
+ print("hi") // falls through to implicit return
+ case ch <- 1:
+ cancel()
+ default:
+ os.Exit(1)
+ }
+} // want "this return statement may be reached without using the cancel var"
+
+func _(ch chan int) {
+ _, cancel := context.WithCancel(bg)
+ // A blocking select must execute one of its cases.
+ select {
+ case <-ch:
+ panic(0)
+ }
+ if false {
+ _ = cancel
+ }
+}
+
+func _() {
+ go func() {
+ ctx, cancel := context.WithCancel(bg) // want "not used on all paths"
+ if false {
+ _ = cancel
+ }
+ print(ctx)
+ }() // want "may be reached without using the cancel var"
+}
+
+var condition bool
+var someInt int
+
+// Regression test for Go issue 16143.
+func _() {
+ var x struct{ f func() }
+ x.f()
+}
+
+// Regression test for Go issue 16230.
+func _() (ctx context.Context, cancel func()) {
+ ctx, cancel = context.WithCancel(bg)
+ return // a naked return counts as a load of the named result values
+}
+
+// Same as above, but for literal function.
+var _ = func() (ctx context.Context, cancel func()) {
+ ctx, cancel = context.WithCancel(bg)
+ return
+}
+
+// Test for Go issue 31856.
+func _() {
+ var cancel func()
+
+ func() {
+ _, cancel = context.WithCancel(bg)
+ }()
+
+ cancel()
+}
+
+var cancel1 func()
+
+// Same as above, but for package-level cancel variable.
+func _() {
+ // We assume that other uses of cancel1 exist.
+ _, cancel1 = context.WithCancel(bg)
+}