aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2022-08-25 14:50:27 -0700
committerGopher Robot <gobot@golang.org>2022-08-26 03:34:25 +0000
commit2eba2ff8a1572d7fcba65a5f9d54f73e307a0054 (patch)
tree3dc7e81c0664af5fd8d970cb74eb2de225982d24 /src
parent27006657fad10d195dd0f5d5719e49a4e5811f4a (diff)
downloadgo-2eba2ff8a1572d7fcba65a5f9d54f73e307a0054.tar.xz
go/types: provide a better error message for [...] array types
This matches types2 behavior. For #54511. Change-Id: Iea906e9fec7e334b7aa7f481de87373fa93d1c7c Reviewed-on: https://go-review.googlesource.com/c/go/+/425715 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Alan Donovan <adonovan@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/go/types/testdata/check/decls0.go2
-rw-r--r--src/go/types/typexpr.go10
2 files changed, 10 insertions, 2 deletions
diff --git a/src/go/types/testdata/check/decls0.go b/src/go/types/testdata/check/decls0.go
index d8fcef0824..7ba90c0504 100644
--- a/src/go/types/testdata/check/decls0.go
+++ b/src/go/types/testdata/check/decls0.go
@@ -51,7 +51,7 @@ func _() { var init int; _ = init }
// invalid array types
type (
- iA0 [... /* ERROR "invalid use of '...'" */ ]byte
+ iA0 [... /* ERROR "invalid use of \[...\] array" */ ]byte
// The error message below could be better. At the moment
// we believe an integer that is too large is not an integer.
// But at least we get an error.
diff --git a/src/go/types/typexpr.go b/src/go/types/typexpr.go
index 13adb9f2a9..ff6bb36255 100644
--- a/src/go/types/typexpr.go
+++ b/src/go/types/typexpr.go
@@ -292,11 +292,19 @@ func (check *Checker) typInternal(e0 ast.Expr, def *Named) (T Type) {
typ := new(Array)
def.setUnderlying(typ)
- typ.len = check.arrayLength(e.Len)
+ // Provide a more specific error when encountering a [...] array
+ // rather than leaving it to the handling of the ... expression.
+ if _, ok := e.Len.(*ast.Ellipsis); ok {
+ check.error(e.Len, _BadDotDotDotSyntax, "invalid use of [...] array (outside a composite literal)")
+ typ.len = -1
+ } else {
+ typ.len = check.arrayLength(e.Len)
+ }
typ.elem = check.varType(e.Elt)
if typ.len >= 0 {
return typ
}
+ // report error if we encountered [...]
case *ast.Ellipsis:
// dots are handled explicitly where they are legal