// -lang=go1.17 // 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. // Parser accepts type parameters but the type checker // needs to report any operations that are not permitted // before Go 1.18. package p type T[P /* ERROR "type parameter requires go1.18 or later" */ any /* ERROR "predeclared any requires go1.18 or later" */] struct{} // for init (and main, but we're not in package main) we should only get one error func init[P /* ERROR "func init must have no type parameters" */ any /* ERROR "predeclared any requires go1.18 or later" */]() { } func main[P /* ERROR "type parameter requires go1.18 or later" */ any /* ERROR "predeclared any requires go1.18 or later" */]() { } func f[P /* ERROR "type parameter requires go1.18 or later" */ any /* ERROR "predeclared any requires go1.18 or later" */](x P) { var _ T[ /* ERROR "type instantiation requires go1.18 or later" */ int] var _ (T[ /* ERROR "type instantiation requires go1.18 or later" */ int]) _ = T[ /* ERROR "type instantiation requires go1.18 or later" */ int]{} _ = T[ /* ERROR "type instantiation requires go1.18 or later" */ int](struct{}{}) } func (T[ /* ERROR "type instantiation requires go1.18 or later" */ P]) g(x int) { f[ /* ERROR "function instantiation requires go1.18 or later" */ int](0) // explicit instantiation (f[ /* ERROR "function instantiation requires go1.18 or later" */ int])(0) // parentheses (different code path) f( /* ERROR "implicit function instantiation requires go1.18 or later" */ x) // implicit instantiation } type C1 interface { comparable // ERROR "predeclared comparable requires go1.18 or later" } type C2 interface { comparable // ERROR "predeclared comparable requires go1.18 or later" int // ERROR "embedding non-interface type int requires go1.18 or later" ~ /* ERROR "embedding interface element ~int requires go1.18 or later" */ int int /* ERROR "embedding interface element int | ~string requires go1.18 or later" */ | ~string } type _ interface { // errors for these were reported with their declaration C1 C2 } type ( _ comparable // ERROR "predeclared comparable requires go1.18 or later" // errors for these were reported with their declaration _ C1 _ C2 _ = comparable // ERROR "predeclared comparable requires go1.18 or later" // errors for these were reported with their declaration _ = C1 _ = C2 )