aboutsummaryrefslogtreecommitdiff
path: root/src/go
diff options
context:
space:
mode:
authorRob Findley <rfindley@google.com>2021-04-26 22:25:56 -0400
committerRobert Findley <rfindley@google.com>2021-04-27 13:46:16 +0000
commit39844971fb92992305babb4b64d50faa7fea40a0 (patch)
tree1d76715b2aa693eb6d1df36bc7737f51934eb4a8 /src/go
parent6edd573218709e50dc73c49d5ae465819b7ef226 (diff)
downloadgo-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.go4
-rw-r--r--src/go/internal/typeparams/typeparams.go5
-rw-r--r--src/go/types/expr.go6
-rw-r--r--src/go/types/fixedbugs/issue45635.go223
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" */ ]
+}