github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/analysis/passes/nilness/testdata/src/d/d.go (about)

     1  package d
     2  
     3  type message interface{ PR() }
     4  
     5  func noparam() {
     6  	var messageT message
     7  	messageT.PR() // want "nil dereference in dynamic method call"
     8  }
     9  
    10  func paramNonnil[T message]() {
    11  	var messageT T
    12  	messageT.PR() // cannot conclude messageT is nil.
    13  }
    14  
    15  func instance() {
    16  	// buildssa.BuilderMode does not include InstantiateGenerics.
    17  	paramNonnil[message]() // no warning is expected as param[message] id not built.
    18  }
    19  
    20  func param[T interface {
    21  	message
    22  	~*int | ~chan int
    23  }]() {
    24  	var messageT T // messageT is nil.
    25  	messageT.PR()  // nil receiver may be okay. See param[nilMsg].
    26  }
    27  
    28  type nilMsg chan int
    29  
    30  func (m nilMsg) PR() {
    31  	if m == nil {
    32  		print("not an error")
    33  	}
    34  }
    35  
    36  var G func() = param[nilMsg] // no warning
    37  
    38  func allNillable[T ~*int | ~chan int]() {
    39  	var x, y T  // both are nillable and are nil.
    40  	if x != y { // want "impossible condition: nil != nil"
    41  		print("unreachable")
    42  	}
    43  }
    44  
    45  func notAll[T ~*int | ~chan int | ~int]() {
    46  	var x, y T  // neither are nillable due to ~int
    47  	if x != y { // no warning
    48  		print("unreachable")
    49  	}
    50  }
    51  
    52  func noninvoke[T ~func()]() {
    53  	var x T
    54  	x() // want "nil dereference in dynamic function call"
    55  }