// run

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

// Test for cases where certain instantiations of a generic function (F in this
// example) will always fail on a type assertion or mismatch on a type case.

package main

import "fmt"

type S struct{}

func (S) M() byte {
	return 0
}

type I[T any] interface {
	M() T
}

func F[T, A any](x I[T], shouldMatch bool) {
	switch x.(type) {
	case A:
		if !shouldMatch {
			fmt.Printf("wanted mis-match, got match")
		}
	default:
		if shouldMatch {
			fmt.Printf("wanted match, got mismatch")
		}
	}

	_, ok := x.(A)
	if ok != shouldMatch {
		fmt.Printf("ok: got %v, wanted %v", ok, shouldMatch)
	}

	if !shouldMatch {
		defer func() {
			if shouldMatch {
				fmt.Printf("Shouldn't have panicked")
			}
			recover()
		}()
	}
	_ = x.(A)
	if !shouldMatch {
		fmt.Printf("Should have panicked")
	}
}

func main() {
	// Test instantiation where the type switch/type asserts can't possibly succeed
	// (since string does not implement I[byte]).
	F[byte, string](S{}, false)

	// Test instantiation where the type switch/type asserts should succeed
	// (since S does implement I[byte])
	F[byte, S](S{}, true)
	F[byte, S](I[byte](S{}), true)
}
