]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: provide a better error message for [...] array types
authorRobert Griesemer <gri@golang.org>
Thu, 25 Aug 2022 21:50:27 +0000 (14:50 -0700)
committerGopher Robot <gobot@golang.org>
Fri, 26 Aug 2022 03:34:25 +0000 (03:34 +0000)
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>

src/go/types/testdata/check/decls0.go
src/go/types/typexpr.go

index d8fcef0824d402588bd46d4ea24f6abd290b43c8..7ba90c0504e6e68a57c75878563dedec0fb0e876 100644 (file)
@@ -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.
index 13adb9f2a982dd25ed80891289feca35cf1d19eb..ff6bb3625589c7b030d23fdabaedc598b28a8479 100644 (file)
@@ -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