| // 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 testdata |
| |
| import ( |
| "context" |
| "log" |
| "os" |
| "testing" |
| ) |
| |
| // Check the three functions and assignment forms (var, :=, =) we look for. |
| // (Do these early: line numbers are fragile.) |
| func _() { |
| var ctx, cancel = context.WithCancel() // ERROR "the cancel function is not used on all paths \(possible context leak\)" |
| } // ERROR "this return statement may be reached without using the cancel var defined on line 17" |
| |
| func _() { |
| ctx, cancel2 := context.WithDeadline() // ERROR "the cancel2 function is not used..." |
| } // ERROR "may be reached without using the cancel2 var defined on line 21" |
| |
| func _() { |
| var ctx context.Context |
| var cancel3 func() |
| ctx, cancel3 = context.WithTimeout() // ERROR "function is not used..." |
| } // ERROR "this return statement may be reached without using the cancel3 var defined on line 27" |
| |
| func _() { |
| ctx, _ := context.WithCancel() // ERROR "the cancel function returned by context.WithCancel should be called, not discarded, to avoid a context leak" |
| ctx, _ = context.WithTimeout() // ERROR "the cancel function returned by context.WithTimeout should be called, not discarded, to avoid a context leak" |
| ctx, _ = context.WithDeadline() // ERROR "the cancel function returned by context.WithDeadline should be called, not discarded, to avoid a context leak" |
| } |
| |
| func _() { |
| ctx, cancel := context.WithCancel() |
| defer cancel() // ok |
| } |
| |
| func _() { |
| ctx, cancel := context.WithCancel() // ERROR "not used on all paths" |
| if condition { |
| cancel() |
| } |
| return // ERROR "this return statement may be reached without using the cancel var" |
| } |
| |
| func _() { |
| ctx, cancel := context.WithCancel() |
| if condition { |
| cancel() |
| } else { |
| // ok: infinite loop |
| for { |
| print(0) |
| } |
| } |
| } |
| |
| func _() { |
| ctx, cancel := context.WithCancel() // ERROR "not used on all paths" |
| if condition { |
| cancel() |
| } else { |
| for i := 0; i < 10; i++ { |
| print(0) |
| } |
| } |
| } // ERROR "this return statement may be reached without using the cancel var" |
| |
| func _() { |
| ctx, cancel := context.WithCancel() |
| // 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 _() { |
| ctx, cancel := context.WithCancel() // ERROR "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) |
| } |
| } // ERROR "this return statement may be reached without using the cancel var" |
| |
| func _(ch chan int) int { |
| ctx, cancel := context.WithCancel() // ERROR "not used on all paths" |
| select { |
| case <-ch: |
| new(testing.T).FailNow() |
| case y <- ch: |
| print("hi") // falls through to implicit return |
| case ch <- 1: |
| cancel() |
| default: |
| os.Exit(1) |
| } |
| } // ERROR "this return statement may be reached without using the cancel var" |
| |
| func _(ch chan int) int { |
| ctx, cancel := context.WithCancel() |
| // A blocking select must execute one of its cases. |
| select { |
| case <-ch: |
| panic() |
| } |
| } |
| |
| func _() { |
| go func() { |
| ctx, cancel := context.WithCancel() // ERROR "not used on all paths" |
| print(ctx) |
| }() // ERROR "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() |
| 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() |
| return |
| } |