]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: better error when assigning to struct field in map
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Sat, 2 Apr 2016 14:27:02 +0000 (11:27 -0300)
committerDavid Chase <drchase@google.com>
Mon, 4 Apr 2016 14:07:47 +0000 (14:07 +0000)
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>
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue13779.go [new file with mode: 0644]

index 0b8eb8c75bdc830312d17c4c3635643e00bd0888..688936e926818bc41ce26e7bf8d0efe7398521cf 100644 (file)
@@ -3207,6 +3207,11 @@ func checkassign(stmt *Node, n *Node) {
                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)
 }
 
diff --git a/test/fixedbugs/issue13779.go b/test/fixedbugs/issue13779.go
new file mode 100644 (file)
index 0000000..94cf9c6
--- /dev/null
@@ -0,0 +1,15 @@
+// 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"
+}