]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: hint on wrong case-field names in composite literals
authorEmmanuel Odeke <emm.odeke@gmail.com>
Sat, 18 Nov 2017 07:21:06 +0000 (00:21 -0700)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Mon, 20 Nov 2017 20:29:43 +0000 (20:29 +0000)
Improve the error message for wrong
case-field names in composite literals,
by mentioning the correct field name.

Given the program:
package main

type it struct {
        ID string
}

func main() {
        i1 := &it{id: "Bar"}
}

just like we do for usage of fields, we now
report wrongly cased fields as hints to give:

ts.go:8:14: unknown field 'id' in struct literal of type it (but does have ID)

instead of before:

ts.go:8:14: unknown field 'id' in struct literal of type it

Fixes #22794

Change-Id: I18cd70e75817025cb1df083503cae306e8d659fd
Reviewed-on: https://go-review.googlesource.com/78545
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue22794.go [new file with mode: 0644]

index b900faa10a249c932665ca6c96ac9b54739a0ab5..ec4db17b1c56065ef1cba528a77eb8b7874c4cae 100644 (file)
@@ -3105,7 +3105,11 @@ func typecheckcomplit(n *Node) *Node {
 
                                f := lookdot1(nil, l.Sym, t, t.Fields(), 0)
                                if f == nil {
-                                       yyerror("unknown field '%v' in struct literal of type %v", l.Sym, t)
+                                       if ci := lookdot1(nil, l.Sym, t, t.Fields(), 2); ci != nil { // Case-insensitive lookup.
+                                               yyerror("unknown field '%v' in struct literal of type %v (but does have %v)", l.Sym, t, ci.Sym)
+                                       } else {
+                                               yyerror("unknown field '%v' in struct literal of type %v", l.Sym, t)
+                                       }
                                        continue
                                }
                                fielddup(f.Sym.Name, hash)
diff --git a/test/fixedbugs/issue22794.go b/test/fixedbugs/issue22794.go
new file mode 100644 (file)
index 0000000..c7e9eb1
--- /dev/null
@@ -0,0 +1,20 @@
+// errorcheck
+
+// Copyright 2017 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 main
+
+type it struct {
+       Floats bool
+       inner  string
+}
+
+func main() {
+       i1 := it{Floats: true}
+       if i1.floats { // ERROR "(type it .* field or method floats, but does have Floats)"
+       }
+       i2 := &it{floats: false} // ERROR "(but does have Floats)"
+       _ = &it{InneR: "foo"}    // ERROR "(but does have inner)"
+}