diff --git a/src/internal/types/testdata/fixedbugs/issue51503.go b/src/internal/types/testdata/fixedbugs/issue51503.go new file mode 100644 index 00000000000..90a4256229a --- /dev/null +++ b/src/internal/types/testdata/fixedbugs/issue51503.go @@ -0,0 +1,31 @@ +// Copyright 2024 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[T any] struct{} + +// The inner T in T[T] must not conflict with the receiver base type T. +func (T[T]) m1() {} + +// The receiver parameter r is declared after the receiver type parameter +// r in T[r]. An error is expected for the receiver parameter. +func (r /* ERROR "r redeclared" */ T[r]) m2() {} + +type C any + +// The scope of type parameter C starts after the type name (_) +// because we want to be able to use type parameters in the type +// parameter list. Hence, the 2nd C in the type parameter list below +// refers to the first C. Since constraints cannot be type parameters +// this is an error. +type _[C C /* ERROR "cannot use a type parameter as constraint" */] struct{} + +// Same issue here. +func _[C C /* ERROR "cannot use a type parameter as constraint" */]() {} + +// The scope of ordinary parameter C starts after the function signature. +// Therefore, the 2nd C in the parameter list below refers to the type C. +// This code is correct. +func _(C C) {} // okay