aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/syntax/testdata
diff options
context:
space:
mode:
authorRobert Griesemer <gri@google.com>2026-01-22 16:16:17 -0800
committerRobert Griesemer <gri@google.com>2026-02-19 12:22:13 -0800
commit06dc5db75d4c2548c0187f34ce79389678be7ca0 (patch)
tree67ed553c81ea149812d0d2482ec4d2dafe216fcf /src/cmd/compile/internal/syntax/testdata
parenta8032d4c781f14fa0bd561d96e719492aee08c23 (diff)
downloadgo-06dc5db75d4c2548c0187f34ce79389678be7ca0.tar.xz
cmd/compile, go/*: move method type parameter checks from parsers to type checkers
The parsers (cmd/compile/internal/syntax and go/parser) always accepted type parameters on methods for parser robustness but reported an error. With this change, the parsers accept the type parameters on methods, and then the type checkers (cmd/compile/internal/types2 and go/types) complain about them. Add test case for method type parameters when running the parsers only. Adjust some existing test cases as needed. This change is a necessary first step towards implementing generic methods but does not enable them. For #77273. Change-Id: I291fcf0aef0c917c74b32131c88b9e4ed71c5060 Reviewed-on: https://go-review.googlesource.com/c/go/+/738441 Reviewed-by: Mark Freeman <markfreeman@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Griesemer <gri@google.com>
Diffstat (limited to 'src/cmd/compile/internal/syntax/testdata')
-rw-r--r--src/cmd/compile/internal/syntax/testdata/smoketest.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/syntax/testdata/smoketest.go b/src/cmd/compile/internal/syntax/testdata/smoketest.go
index 6b3593ac7a..e7c9f7283f 100644
--- a/src/cmd/compile/internal/syntax/testdata/smoketest.go
+++ b/src/cmd/compile/internal/syntax/testdata/smoketest.go
@@ -71,3 +71,33 @@ type _ interface {
T[P]
T[P1, P2]
}
+
+// generic method
+type List[E any] []E
+
+func (l List[E]) Map[F any](m func(E) F) (r List[F]) {
+ for _, x := range l {
+ r = append(r, m(x))
+ }
+ return
+}
+
+func _() {
+ l := List[string]{"foo", "foobar", "42"}
+ r := l.Map(func(s string) int { return len(s)})
+ _ = r
+}
+
+func _[E, F any](l List[E]) List[F] {
+ var f func(List[E], func(E) F) List[F] = List[E].Map // method expression & type inference
+ return f(l, func(E) F { var f F; return f })
+}
+
+// disallowed type parameters
+
+type _ func /* ERROR function type must have no type parameters */ [P any](P)
+type _ interface {
+ m /* ERROR interface method must have no type parameters */ [P any](P)
+}
+
+var _ = func /* ERROR function type must have no type parameters */ [P any](P) {}