From 25d22d9abae4345c24cd2ae7f26de1846888faa4 Mon Sep 17 00:00:00 2001 From: Emmanuel Odeke Date: Sat, 10 Feb 2018 20:10:26 -0800 Subject: [PATCH] cmd/compile: report the struct type in invalid number of initializer values Fixes #23732 Disambiguate "too few" or "too many" values in struct initializer messages by reporting the name of the literal. After: issue23732.go:27:3: too few values in Foo literal issue23732.go:34:12: too many values in Bar literal issue23732.go:40:6: too few values in Foo literal issue23732.go:40:12: too many values in Bar literal Change-Id: Ieca37298441d907ac78ffe960c5ab55741a362ef Reviewed-on: https://go-review.googlesource.com/93277 Run-TryBot: Emmanuel Odeke Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/typecheck.go | 4 +-- test/fixedbugs/issue23732.go | 42 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue23732.go 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" + } +}