diff options
author | Rob Findley <rfindley@google.com> | 2021-04-26 22:25:56 -0400 |
---|---|---|
committer | Robert Findley <rfindley@google.com> | 2021-04-27 13:46:16 +0000 |
commit | 39844971fb92992305babb4b64d50faa7fea40a0 (patch) | |
tree | 1d76715b2aa693eb6d1df36bc7737f51934eb4a8 /src/go | |
parent | 6edd573218709e50dc73c49d5ae465819b7ef226 (diff) | |
download | go-39844971fb92992305babb4b64d50faa7fea40a0.tar.gz go-39844971fb92992305babb4b64d50faa7fea40a0.zip |
go/types: don't panic when checking a ListExpr in exprInternal
As an alternative to CL 312149, add a catch-all error message in
exprInternal when encountering a ListExpr, rather than panicking.
We still might want something like CL 312149 to improve the error
message or recovery from bad indexing.
Change-Id: I865f7cc4eefa4a3b7bd8f3100df96d0144e1712f
Reviewed-on: https://go-review.googlesource.com/c/go/+/313909
Trust: Robert Findley <rfindley@google.com>
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/go')
-rw-r--r-- | src/go/internal/typeparams/notypeparams.go | 4 | ||||
-rw-r--r-- | src/go/internal/typeparams/typeparams.go | 5 | ||||
-rw-r--r-- | src/go/types/expr.go | 6 | ||||
-rw-r--r-- | src/go/types/fixedbugs/issue45635.go2 | 23 |
4 files changed, 37 insertions, 1 deletions
diff --git a/src/go/internal/typeparams/notypeparams.go b/src/go/internal/typeparams/notypeparams.go index 7bd62c9efe..a8c25ac2b1 100644 --- a/src/go/internal/typeparams/notypeparams.go +++ b/src/go/internal/typeparams/notypeparams.go @@ -30,6 +30,10 @@ func UnpackExpr(expr ast.Expr) []ast.Expr { return []ast.Expr{expr} } +func IsListExpr(n ast.Node) bool { + return false +} + func Get(ast.Node) *ast.FieldList { return nil } diff --git a/src/go/internal/typeparams/typeparams.go b/src/go/internal/typeparams/typeparams.go index 0332b6b816..66f66afb28 100644 --- a/src/go/internal/typeparams/typeparams.go +++ b/src/go/internal/typeparams/typeparams.go @@ -38,6 +38,11 @@ func UnpackExpr(x ast.Expr) []ast.Expr { return nil } +func IsListExpr(n ast.Node) bool { + _, ok := n.(*ast.ListExpr) + return ok +} + func Get(n ast.Node) *ast.FieldList { switch n := n.(type) { case *ast.TypeSpec: diff --git a/src/go/types/expr.go b/src/go/types/expr.go index 4023362a4e..7d701d985b 100644 --- a/src/go/types/expr.go +++ b/src/go/types/expr.go @@ -1805,7 +1805,11 @@ func (check *Checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind { // types, which are comparatively rare. default: - panic(fmt.Sprintf("%s: unknown expression type %T", check.fset.Position(e.Pos()), e)) + if typeparams.IsListExpr(e) { + check.errorf(e, _Todo, "invalid multi-index expression") + } else { + panic(fmt.Sprintf("%s: unknown expression type %T", check.fset.Position(e.Pos()), e)) + } } // everything went well diff --git a/src/go/types/fixedbugs/issue45635.go2 b/src/go/types/fixedbugs/issue45635.go2 index 1fbe0382ea..ec5cf3c5ff 100644 --- a/src/go/types/fixedbugs/issue45635.go2 +++ b/src/go/types/fixedbugs/issue45635.go2 @@ -7,3 +7,26 @@ package main func main() { some /* ERROR "undeclared name" */ [int, int]() } + +type N[T any] struct{} + +var _ N /* ERROR "0 arguments but 1 type parameters" */ [] + +type I interface { + type map[int]int, []int +} + +func _[T I]() { + var m map[int]int + _ = m[1 /* ERROR "multi-index expression" */, 2 /* ERROR "expected type" */ ] + + var a [3]int + _ = a[1 /* ERROR "multi-index expression" */, 2 /* ERROR "expected type" */ ] + + var s []int + _ = s[1 /* ERROR "multi-index expression" */, 2 /* ERROR "expected type" */ ] + + var t T + // TODO(rFindley) Fix the duplicate error below. + _ = t[1 /* ERROR "multi-index expression" */ /* ERROR "multi-index expression" */, 2 /* ERROR "expected type" */ ] +} |