From 13c49096fd3b08ef53742dd7ae8bcfbfa45f3173 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 28 May 2024 14:18:42 -0700 Subject: [PATCH] go/types, types2: report error when using uninstantiated signature alias For #67547. Fixes #67683. Change-Id: I9487820ab4e2bd257d253a7016df45729b29f836 Reviewed-on: https://go-review.googlesource.com/c/go/+/588855 Auto-Submit: Robert Griesemer LUCI-TryBot-Result: Go LUCI Reviewed-by: Robert Findley Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/types2/expr.go | 2 +- src/go/types/expr.go | 2 +- .../types/testdata/fixedbugs/issue67683.go | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 src/internal/types/testdata/fixedbugs/issue67683.go diff --git a/src/cmd/compile/internal/types2/expr.go b/src/cmd/compile/internal/types2/expr.go index da676f47da..92949a924d 100644 --- a/src/cmd/compile/internal/types2/expr.go +++ b/src/cmd/compile/internal/types2/expr.go @@ -1013,7 +1013,7 @@ func (check *Checker) nonGeneric(T *target, x *operand) { } var what string switch t := x.typ.(type) { - case *Named: + case *Alias, *Named: if isGeneric(t) { what = "type" } diff --git a/src/go/types/expr.go b/src/go/types/expr.go index 474db75cc8..cf8ceddc9a 100644 --- a/src/go/types/expr.go +++ b/src/go/types/expr.go @@ -998,7 +998,7 @@ func (check *Checker) nonGeneric(T *target, x *operand) { } var what string switch t := x.typ.(type) { - case *Named: + case *Alias, *Named: if isGeneric(t) { what = "type" } diff --git a/src/internal/types/testdata/fixedbugs/issue67683.go b/src/internal/types/testdata/fixedbugs/issue67683.go new file mode 100644 index 0000000000..f7c9bcdd01 --- /dev/null +++ b/src/internal/types/testdata/fixedbugs/issue67683.go @@ -0,0 +1,19 @@ +// -goexperiment=aliastypeparams -gotypesalias=1 + +// 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 A[P any] func() + +// alias signature types +type B[P any] = func() +type C[P any] = B[P] + +var _ = A /* ERROR "cannot use generic type A without instantiation" */ (nil) + +// generic alias signature types must be instantiated before use +var _ = B /* ERROR "cannot use generic type B without instantiation" */ (nil) +var _ = C /* ERROR "cannot use generic type C without instantiation" */ (nil)