blob: d6d0b5f5f3ead82ec521d31aedd003f1396cc05d [file] [log] [blame]
// Copyright 2021 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.
// This file contains tests for the lostcancel checker.
//go:build go1.18
package typeparams
import (
"context"
"time"
)
var bg = context.Background()
func _[T any]() {
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 19"
func _[T any]() {
_, cancel := context.WithCancel(bg)
defer cancel() // ok
}
// User-defined Context that matches type "context.Context"
type C1[P1 any, P2 any] interface {
Deadline() (deadline time.Time, ok P1)
Done() <-chan struct{}
Err() error
Value(key P2) P2
}
func _(bg C1[bool, interface{}]) {
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
}
// User-defined Context that doesn't match type "context.Context"
type C2[P any] interface {
WithCancel(parent C1[P, bool]) (ctx C1[P, bool], cancel func())
}
func _(c C2[interface{}]) {
ctx, _ := c.WithCancel(nil) // not "context.WithCancel()"
_ = ctx
}
// Further regression test for Go issue 16143.
func _() {
type C[P any] struct{ f func() P }
var x C[int]
x.f()
}