aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2022-01-06 14:10:45 -0800
committerRobert Griesemer <gri@golang.org>2022-01-07 00:02:57 +0000
commitc295137ad8e5e947205d060a26164cb71952c1bb (patch)
treed5fe6f4e2c564162076acc3784b0bc7ab8bba8d3 /src
parent042548b1fdba21e351368e9f3ecd93059d09083f (diff)
downloadgo-c295137ad8e5e947205d060a26164cb71952c1bb.tar.gz
go-c295137ad8e5e947205d060a26164cb71952c1bb.zip
go/types, types2: disallow multiple blank type parameters
Work-around for #50481: report an error for multiple blank type parameters. It's always possible to use non-blank names in those cases. We expect to lift this restriction for 1.19. For #50481. Change-Id: Ifdd2d91340aac1da3387f7d80d46e44f5997c2a8 Reviewed-on: https://go-review.googlesource.com/c/go/+/376058 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> Trust: Dan Scales <danscales@google.com> Reviewed-by: Dan Scales <danscales@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/types2/decl.go11
-rw-r--r--src/go/types/decl.go13
2 files changed, 24 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/types2/decl.go b/src/cmd/compile/internal/types2/decl.go
index d61d2a8b0d..69388f78be 100644
--- a/src/cmd/compile/internal/types2/decl.go
+++ b/src/cmd/compile/internal/types2/decl.go
@@ -632,8 +632,19 @@ func (check *Checker) collectTypeParams(dst **TypeParamList, list []*syntax.Fiel
// Declare type parameters up-front.
// The scope of type parameters starts at the beginning of the type parameter
// list (so we can have mutually recursive parameterized type bounds).
+ nblanks := 0
for i, f := range list {
tparams[i] = check.declareTypeParam(f.Name)
+ // Issue #50481: For now, disallow multiple blank type parameters because
+ // it causes problems with export data. Report an error unless we are in
+ // testing mode ("assert" is defined).
+ // We expect to lift this restriction for Go 1.19.
+ if f.Name.Value == "_" {
+ nblanks++
+ if nblanks == 2 && Universe.Lookup("assert") == nil {
+ check.softErrorf(f, "cannot have multiple blank type parameters (temporary restriction, see issue #50481)")
+ }
+ }
}
// Set the type parameters before collecting the type constraints because
diff --git a/src/go/types/decl.go b/src/go/types/decl.go
index 02af0d5f3e..bbd3f04b7e 100644
--- a/src/go/types/decl.go
+++ b/src/go/types/decl.go
@@ -684,8 +684,21 @@ func (check *Checker) collectTypeParams(dst **TypeParamList, list *ast.FieldList
// Declare type parameters up-front, with empty interface as type bound.
// The scope of type parameters starts at the beginning of the type parameter
// list (so we can have mutually recursive parameterized interfaces).
+ nblanks := 0
for _, f := range list.List {
tparams = check.declareTypeParams(tparams, f.Names)
+ // Issue #50481: For now, disallow multiple blank type parameters because
+ // it causes problems with export data. Report an error unless we are in
+ // testing mode ("assert" is defined).
+ // We expect to lift this restriction for Go 1.19.
+ for _, name := range f.Names {
+ if name.Name == "_" {
+ nblanks++
+ if nblanks == 2 && Universe.Lookup("assert") == nil {
+ check.softErrorf(name, _InvalidBlank, "cannot have multiple blank type parameters (temporary restriction, see issue #50481)")
+ }
+ }
+ }
}
// Set the type parameters before collecting the type constraints because