Fixes #69506.
Change-Id: I18215e11f214b12d5f65be1d1740181e427f8817
Reviewed-on: https://go-review.googlesource.com/c/go/+/617015
Reviewed-by: Alan Donovan <adonovan@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
}
}
if errPos.IsKnown() {
+ // Not all parameters are named because named != len(list).
+ // If named == typed, there must be parameters that have no types.
+ // They must be at the end of the parameter list, otherwise types
+ // would have been filled in by the right-to-left sweep above and
+ // there would be no error.
+ // If requireNames is set, the parameter list is a type parameter
+ // list.
var msg string
- if requireNames {
- // Not all parameters are named because named != len(list).
- // If named == typed we must have parameters that have no types,
- // and they must be at the end of the parameter list, otherwise
- // the types would have been filled in by the right-to-left sweep
- // above and we wouldn't have an error. Since we are in a type
- // parameter list, the missing types are constraints.
- if named == typed {
- errPos = end // position error at closing ]
+ if named == typed {
+ errPos = end // position error at closing token ) or ]
+ if requireNames {
msg = "missing type constraint"
} else {
+ msg = "missing parameter type"
+ }
+ } else {
+ if requireNames {
msg = "missing type parameter name"
// go.dev/issue/60812
if len(list) == 1 {
msg += " or invalid array length"
}
+ } else {
+ msg = "missing parameter name"
}
- } else {
- msg = "mixed named and unnamed parameters"
}
p.syntaxErrorAt(errPos, msg)
}
--- /dev/null
+// Copyright 2024 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 _(a int, b /* ERROR missing parameter type */ )
+func _(a int, /* ERROR missing parameter name */ []int)
+func _(a int, /* ERROR missing parameter name */ []int, c int)
}
type t interface {
t[a]
- m /* ERROR method must have no type parameters */ [_ _, /* ERROR mixed */ _]()
+ m /* ERROR method must have no type parameters */ [_ _, _ /* ERROR missing parameter type */ ]()
t[a, b]
}
}
}
if errPos.IsValid() {
+ // Not all parameters are named because named != len(list).
+ // If named == typed, there must be parameters that have no types.
+ // They must be at the end of the parameter list, otherwise types
+ // would have been filled in by the right-to-left sweep above and
+ // there would be no error.
+ // If tparams is set, the parameter list is a type parameter list.
var msg string
- if tparams {
- // Not all parameters are named because named != len(list).
- // If named == typed we must have parameters that have no types,
- // and they must be at the end of the parameter list, otherwise
- // the types would have been filled in by the right-to-left sweep
- // above and we wouldn't have an error. Since we are in a type
- // parameter list, the missing types are constraints.
- if named == typed {
- errPos = p.pos // position error at closing ]
+ if named == typed {
+ errPos = p.pos // position error at closing token ) or ]
+ if tparams {
msg = "missing type constraint"
} else {
+ msg = "missing parameter type"
+ }
+ } else {
+ if tparams {
msg = "missing type parameter name"
// go.dev/issue/60812
if len(list) == 1 {
msg += " or invalid array length"
}
+ } else {
+ msg = "missing parameter name"
}
- } else {
- msg = "mixed named and unnamed parameters"
}
p.error(errPos, msg)
}
--- /dev/null
+// Copyright 2024 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 _(a int, b) /* ERROR "missing parameter type" */
+func _(a int, [ /* ERROR "missing parameter name" */ ]int)
+func _(a int, [ /* ERROR "missing parameter name" */ ]int, c int)
package main
import "runtime"
-func foo(runtime.UintType, i int) { // ERROR "cannot declare name runtime.UintType|mixed named and unnamed|undefined identifier"
+func foo(runtime.UintType, i int) { // ERROR "cannot declare name runtime.UintType|missing parameter name|undefined identifier"
println(i, runtime.UintType) // GCCGO_ERROR "undefined identifier"
}
type t2 int
type t3 int
-func f1(*t2, x t3) // ERROR "named"
-func f2(t1, *t2, x t3) // ERROR "named"
-func f3() (x int, *string) // ERROR "named"
+func f1(*t2, x t3) // ERROR "missing parameter name"
+func f2(t1, *t2, x t3) // ERROR "missing parameter name"
+func f3() (x int, *string) // ERROR "missing parameter name"
func f4() (t1 t1) // legal - scope of parameter named t1 starts in body of f4.