From 39844971fb92992305babb4b64d50faa7fea40a0 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Mon, 26 Apr 2021 22:25:56 -0400 Subject: [PATCH] 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 --- src/go/internal/typeparams/notypeparams.go | 4 ++++ src/go/internal/typeparams/typeparams.go | 5 +++++ src/go/types/expr.go | 6 +++++- src/go/types/fixedbugs/issue45635.go2 | 23 ++++++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) 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" */ ] +} -- 2.48.1