]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types2: report error when using uninstantiated signature alias
authorRobert Griesemer <gri@golang.org>
Tue, 28 May 2024 21:18:42 +0000 (14:18 -0700)
committerGopher Robot <gobot@golang.org>
Wed, 29 May 2024 02:09:54 +0000 (02:09 +0000)
For #67547.
Fixes #67683.

Change-Id: I9487820ab4e2bd257d253a7016df45729b29f836
Reviewed-on: https://go-review.googlesource.com/c/go/+/588855
Auto-Submit: Robert Griesemer <gri@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
src/cmd/compile/internal/types2/expr.go
src/go/types/expr.go
src/internal/types/testdata/fixedbugs/issue67683.go [new file with mode: 0644]

index da676f47da141900331a0b5adae1da2957326023..92949a924dede172901d905f23fe77005b3de09b 100644 (file)
@@ -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"
                }
index 474db75cc810912c62cdcee8e2c6e6a23c43a99f..cf8ceddc9ace1590a47c600a10c9faac35cd93b3 100644 (file)
@@ -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 (file)
index 0000000..f7c9bcd
--- /dev/null
@@ -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)