diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 5285cb22d9..0161f26890 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -3030,7 +3030,7 @@ func typecheckcomplit(n *Node) *Node { ls[i] = n1 if i >= t.NumFields() { if !errored { - yyerror("too many values in struct initializer") + yyerror("too many values in %v", n) errored = true } continue @@ -3048,7 +3048,7 @@ func typecheckcomplit(n *Node) *Node { ls[i] = n1 } if len(ls) < t.NumFields() { - yyerror("too few values in struct initializer") + yyerror("too few values in %v", n) } } else { hash := make(map[string]bool) diff --git a/test/fixedbugs/issue23732.go b/test/fixedbugs/issue23732.go new file mode 100644 index 0000000000..be17bf4f61 --- /dev/null +++ b/test/fixedbugs/issue23732.go @@ -0,0 +1,42 @@ +// 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. + +// Issue 23732: Give better details about which struct +// initializer has the wrong number of values. + +package main + +type Foo struct { + A int + B int + C interface{} + Bar +} + +type Bar struct { + A string +} + +func main() { + _ = Foo{ + 1, + 2, + 3, // ERROR "too few values in Foo literal" + } + + _ = Foo{ + 1, + 2, + 3, + Bar{"A", "B"}, // ERROR "too many values in Bar literal" + } + + _ = Foo{ + 1, + 2, + Bar{"A", "B"}, // ERROR "too many values in Bar literal" "too few values in Foo literal" + } +}