Identify this assignment case and instead of the more general error
prog.go:6: cannot assign to students["sally"].age
produce
prog.go:6: cannot directly assign to struct field students["sally"].age in map
that explains why the assignment is not possible.
Fixes #13779.
Change-Id: I90c10b445f907834fc1735aa66e44a0f447aa74f
Reviewed-on: https://go-review.googlesource.com/21462
Reviewed-by: David Chase <drchase@google.com>
return
}
+ if n.Op == ODOT && n.Left.Op == OINDEXMAP {
+ Yyerror("cannot directly assign to struct field %v in map", n)
+ return
+ }
+
Yyerror("cannot assign to %v", n)
}
--- /dev/null
+// errorcheck
+
+// Copyright 2016 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 13779: provide better error message when directly assigning to struct field in map
+
+package main
+
+func main() {
+ type person struct{ age, weight, height int }
+ students := map[string]person{"sally": person{12, 50, 32}}
+ students["sally"].age = 3 // ERROR "cannot directly assign to struct field .* in map"
+}