From: Matthew Dempsky Date: Tue, 27 Jun 2017 19:58:32 +0000 (-0700) Subject: cmd/compile: suppress errors after "cannot assign to X" X-Git-Tag: go1.9rc1~153 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f62c608abb7a2fd44f634b58cf24aa0d2e1d42d4;p=gostls13.git cmd/compile: suppress errors after "cannot assign to X" If the LHS is unassignable, there's no point in trying to make sure the RHS can be assigned to it or making sure they're realizable types. This is consistent with go/types. In particular, this prevents "1 = 2" from causing a panic when "1" still ends up with the type "untyped int", which is not realizable. Fixes #20813. Change-Id: I4710bdaac2e375ef12ec29b888b8ac84fb640e56 Reviewed-on: https://go-review.googlesource.com/46835 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index bff278b7ae..795bdcdd35 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -3288,10 +3288,10 @@ func checkassign(stmt *Node, n *Node) { if n.Op == ODOT && n.Left.Op == OINDEXMAP { yyerror("cannot assign to struct field %v in map", n) - return + } else { + yyerror("cannot assign to %v", n) } - - yyerror("cannot assign to %v", n) + n.Type = nil } func checkassignlist(stmt *Node, l Nodes) { diff --git a/test/fixedbugs/issue20813.go b/test/fixedbugs/issue20813.go new file mode 100644 index 0000000000..b931aea592 --- /dev/null +++ b/test/fixedbugs/issue20813.go @@ -0,0 +1,11 @@ +// 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 p + +func f() { + 1 = 2 // ERROR "cannot assign to 1" +}