// 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 go1_17 type T[P /* ERROR type parameters require go1\.18 or later */ any /* ERROR undeclared name: any \(requires version 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 undeclared name: any \(requires version go1\.18 or later\) */ ]() {} func main[P /* ERROR type parameters require go1\.18 or later */ any /* ERROR undeclared name: any \(requires version go1\.18 or later\) */ ]() {} func f[P /* ERROR type parameters require go1\.18 or later */ any /* ERROR undeclared name: any \(requires version 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 undeclared name: comparable \(requires version go1\.18 or later\) } type C2 interface { comparable // ERROR undeclared name: comparable \(requires version 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 undeclared name: comparable \(requires version go1\.18 or later\) // errors for these were reported with their declaration _ C1 _ C2 _ = comparable // ERROR undeclared name: comparable \(requires version go1\.18 or later\) // errors for these were reported with their declaration _ = C1 _ = C2 )