]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: avoid multiple errors regarding misuse of ... in signatures
authorRobert Griesemer <gri@golang.org>
Wed, 5 Dec 2018 17:52:59 +0000 (09:52 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 5 Dec 2018 20:59:58 +0000 (20:59 +0000)
Follow-up on #28450 (golang.org/cl/152417).

Updates #28450.
Fixes #29107.

Change-Id: Ib4b4fe582c35315a4f71cf6dbc7f7f2f24b37ec1
Reviewed-on: https://go-review.googlesource.com/c/152758
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/noder.go
test/fixedbugs/issue28450.go

index 89e9ddb668b0618dcedd592d1c00d0774dd073fc..3aa303c0c1c404b90224d7b97fa210b8b5cb6b8a 100644 (file)
@@ -546,12 +546,14 @@ func (p *noder) param(param *syntax.Field, dddOk, final bool) *Node {
        // rewrite ...T parameter
        if typ.Op == ODDD {
                if !dddOk {
-                       yyerror("cannot use ... in receiver or result parameter list")
+                       // We mark these as syntax errors to get automatic elimination
+                       // of multiple such errors per line (see yyerrorl in subr.go).
+                       yyerror("syntax error: cannot use ... in receiver or result parameter list")
                } else if !final {
                        if param.Name == nil {
-                               yyerror("cannot use ... with non-final parameter")
+                               yyerror("syntax error: cannot use ... with non-final parameter")
                        } else {
-                               p.yyerrorpos(param.Name.Pos(), "cannot use ... with non-final parameter %s", param.Name.Value)
+                               p.yyerrorpos(param.Name.Pos(), "syntax error: cannot use ... with non-final parameter %s", param.Name.Value)
                        }
                }
                typ.Op = OTARRAY
index 21e5e0c5f1cab8f60ce8e6023eb7f7e15a1426f1..1a1183b2912f63c4b6501358e6d20a4c8ff206fd 100644 (file)
@@ -6,13 +6,13 @@
 
 package p
 
-func f(a, b, c, d ...int)       {} // ERROR "non-final parameter a" "non-final parameter b" "non-final parameter c"
+func f(a, b, c, d ...int)       {} // ERROR "non-final parameter a"
 func g(a ...int, b ...int)      {} // ERROR "non-final parameter a"
 func h(...int, ...int, float32) {} // ERROR "non-final parameter"
 
 type a func(...float32, ...interface{}) // ERROR "non-final parameter"
 type b interface {
        f(...int, ...int)                // ERROR "non-final parameter"
-       g(a ...int, b ...int, c float32) // ERROR "non-final parameter a" "non-final parameter b"
+       g(a ...int, b ...int, c float32) // ERROR "non-final parameter a"
        valid(...int)
 }