From: smasher164 Date: Tue, 4 Dec 2018 11:41:39 +0000 (-0500) Subject: cmd/compile: improve error message for non-final variadic parameter X-Git-Tag: go1.12beta1~169 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a7af474359;p=gostls13.git cmd/compile: improve error message for non-final variadic parameter Previously, when a function signature had defined a non-final variadic parameter, the error message always referred to the type associated with that parameter. However, if the offending parameter's name was part of an identifier list with a variadic type, one could misinterpret the message, thinking the problem had been with one of the other names in the identifer list. func bar(a, b ...int) {} clear ~~~~~~~^ ^~~~~~~~ confusing This change updates the error message and sets the column position to that of the offending parameter's name, if it exists. Fixes #28450. Change-Id: I076f560925598ed90e218c25d70f9449ffd9b3ea Reviewed-on: https://go-review.googlesource.com/c/152417 Run-TryBot: Matthew Dempsky Reviewed-by: Robert Griesemer --- diff --git a/src/cmd/compile/internal/gc/noder.go b/src/cmd/compile/internal/gc/noder.go index 23c9539b0a..89e9ddb668 100644 --- a/src/cmd/compile/internal/gc/noder.go +++ b/src/cmd/compile/internal/gc/noder.go @@ -548,7 +548,11 @@ func (p *noder) param(param *syntax.Field, dddOk, final bool) *Node { if !dddOk { yyerror("cannot use ... in receiver or result parameter list") } else if !final { - yyerror("can only use ... with final parameter in list") + if param.Name == nil { + yyerror("cannot use ... with non-final parameter") + } else { + p.yyerrorpos(param.Name.Pos(), "cannot use ... with non-final parameter %s", param.Name.Value) + } } typ.Op = OTARRAY typ.Right = typ.Left diff --git a/test/fixedbugs/issue28450.go b/test/fixedbugs/issue28450.go new file mode 100644 index 0000000000..21e5e0c5f1 --- /dev/null +++ b/test/fixedbugs/issue28450.go @@ -0,0 +1,18 @@ +// errorcheck + +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +func f(a, b, c, d ...int) {} // ERROR "non-final parameter a" "non-final parameter b" "non-final parameter c" +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" + valid(...int) +}