]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: report the struct type in invalid number of initializer values
authorEmmanuel Odeke <emm.odeke@gmail.com>
Sun, 11 Feb 2018 04:10:26 +0000 (20:10 -0800)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Tue, 13 Feb 2018 19:42:15 +0000 (19:42 +0000)
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 <emm.odeke@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue23732.go [new file with mode: 0644]

index 5285cb22d9ffbee9d5b648108e2221f1a8b40e60..0161f268909495fc85d62ed3c6f8446f417adc9f 100644 (file)
@@ -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 (file)
index 0000000..be17bf4
--- /dev/null
@@ -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"
+       }
+}