]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile/internal/types2: better error message for invalid ....
authorRobert Griesemer <gri@golang.org>
Thu, 14 Jan 2021 01:00:11 +0000 (17:00 -0800)
committerRobert Griesemer <gri@golang.org>
Thu, 14 Jan 2021 17:52:06 +0000 (17:52 +0000)
This partially addresses the issue below: In many (all) cases we want to
handle invalid ... use in the parser as a syntax error; but this ensures
that we get a decent error if we get here anyway.

Updates #43680.

Change-Id: I93af43a5f5741d8bc76e7a13c0db75e6edf43111
Reviewed-on: https://go-review.googlesource.com/c/go/+/283475
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/types2/examples/types.go2
src/cmd/compile/internal/types2/expr.go
src/cmd/compile/internal/types2/typexpr.go

index be8d44e599279fd41e7bc731662624b5d13f8f13..f094880c4963fe32c196204e785c68e6608edb69 100644 (file)
@@ -113,6 +113,9 @@ type I1[T any] interface{
        m1(T)
 }
 
+// There is no such thing as a variadic generic type.
+type _[T ... /* ERROR invalid use of ... */ interface{}] struct{}
+
 // Generic interfaces may be embedded as one would expect.
 type I2 interface {
        I1(int)     // method!
index 34cbefc864b75e5f5e59622cc2cd6ec1d553b79e..a3778129ffbaca6604622a21bd0be9c713f70fb1 100644 (file)
@@ -1181,7 +1181,7 @@ func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKin
                check.ident(x, e, nil, false)
 
        case *syntax.DotsType:
-               // ellipses are handled explicitly where they are legal
+               // dots are handled explicitly where they are legal
                // (array composite literals and parameter lists)
                check.error(e, "invalid use of '...'")
                goto Error
index 32377ed3f457309d972147847251606c50f89eca..d30f2fef26df20e925d684a169784d83b5eb2b95 100644 (file)
@@ -521,6 +521,12 @@ func (check *Checker) typInternal(e0 syntax.Expr, def *Named) (T Type) {
                typ.elem = check.varType(e.Elem)
                return typ
 
+       case *syntax.DotsType:
+               // dots are handled explicitly where they are legal
+               // (array composite literals and parameter lists)
+               check.error(e, "invalid use of '...'")
+               check.use(e.Elem)
+
        case *syntax.StructType:
                typ := new(Struct)
                def.setUnderlying(typ)