// 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.

package p

type T[P any] struct{}

func _(x interface{}) {
	switch x.(type) {
	case nil:
	case int:

	case T[int]:
	case []T[int]:
	case [10]T[int]:
	case struct{T[int]}:
	case *T[int]:
	case func(T[int]):
	case interface{m(T[int])}:
	case map[T[int]] string:
	case chan T[int]:

	case T /* ERROR cannot use generic type T\[P interface{}\] without instantiation */ :
	case []T /* ERROR cannot use generic type */ :
	case [10]T /* ERROR cannot use generic type */ :
	case struct{T /* ERROR cannot use generic type */ }:
	case *T /* ERROR cannot use generic type */ :
	case func(T /* ERROR cannot use generic type */ ):
	case interface{m(T /* ERROR cannot use generic type */ )}:
	case map[T /* ERROR cannot use generic type */ ] string:
	case chan T /* ERROR cannot use generic type */ :

	case T /* ERROR cannot use generic type */ , *T /* ERROR cannot use generic type */ :
	}
}

// Make sure a parenthesized nil is ok.

func _(x interface{}) {
	switch x.(type) {
	case ((nil)), int:
	}
}

// Make sure we look for the predeclared nil.

func _(x interface{}) {
	type nil int
	switch x.(type) {
	case nil: // ok - this is the type nil
	}
}

func _(x interface{}) {
	var nil int
	switch x.(type) {
	case nil /* ERROR not a type */ : // not ok - this is the variable nil
	}
}
