From: Emmanuel Odeke Date: Sat, 18 Nov 2017 07:21:06 +0000 (-0700) Subject: cmd/compile: hint on wrong case-field names in composite literals X-Git-Tag: go1.10beta1~192 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5f29a7a705e706e307653db47c03df6dbbaf47bc;p=gostls13.git cmd/compile: hint on wrong case-field names in composite literals 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 TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index b900faa10a..ec4db17b1c 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -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 index 0000000000..c7e9eb1224 --- /dev/null +++ b/test/fixedbugs/issue22794.go @@ -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)" +}