From: Rob Findley Date: Tue, 27 Apr 2021 02:25:56 +0000 (-0400) Subject: go/types: don't panic when checking a ListExpr in exprInternal X-Git-Tag: go1.17beta1~431 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=39844971fb;p=gostls13.git 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 Trust: Robert Griesemer Run-TryBot: Robert Findley TryBot-Result: Go Bot Reviewed-by: Robert Griesemer --- 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" */ ] +}