From: Robert Griesemer Date: Fri, 5 May 2023 00:01:53 +0000 (-0700) Subject: go/types, types2: better error message for bad assignment X-Git-Tag: go1.21rc1~658 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=26899ef3ee7cd3d9e663e6f792c93bb411c863db;p=gostls13.git go/types, types2: better error message for bad assignment If the LHS of an assignment is neither addressable nor a map expression (and not the blank identifier), explicitly say so for a better error message. For #3117. Change-Id: I4bffc35574fe390a0567e89182b23585eb5a90de Reviewed-on: https://go-review.googlesource.com/c/go/+/492875 TryBot-Result: Gopher Robot Reviewed-by: Robert Findley Run-TryBot: Robert Griesemer Reviewed-by: Robert Griesemer Auto-Submit: Robert Griesemer --- diff --git a/src/cmd/compile/internal/types2/assignments.go b/src/cmd/compile/internal/types2/assignments.go index 15d2a89934..cba102e4f4 100644 --- a/src/cmd/compile/internal/types2/assignments.go +++ b/src/cmd/compile/internal/types2/assignments.go @@ -222,7 +222,7 @@ func (check *Checker) lhsVar(lhs syntax.Expr) Type { return Typ[Invalid] } } - check.errorf(&x, UnassignableOperand, "cannot assign to %s", &x) + check.errorf(&x, UnassignableOperand, "cannot assign to %s (neither addressable nor a map index expression)", x.expr) return Typ[Invalid] } diff --git a/src/go/types/assignments.go b/src/go/types/assignments.go index b0d11dfb82..1ea51142e0 100644 --- a/src/go/types/assignments.go +++ b/src/go/types/assignments.go @@ -221,7 +221,7 @@ func (check *Checker) lhsVar(lhs ast.Expr) Type { return Typ[Invalid] } } - check.errorf(&x, UnassignableOperand, "cannot assign to %s", &x) + check.errorf(&x, UnassignableOperand, "cannot assign to %s (neither addressable nor a map index expression)", x.expr) return Typ[Invalid] } diff --git a/src/internal/types/testdata/fixedbugs/issue3117.go b/src/internal/types/testdata/fixedbugs/issue3117.go new file mode 100644 index 0000000000..16c0afce81 --- /dev/null +++ b/src/internal/types/testdata/fixedbugs/issue3117.go @@ -0,0 +1,13 @@ +// Copyright 2023 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 + +type S struct { + a [1]int +} + +func _(m map[int]S, key int) { + m /* ERROR "cannot assign to m[key].a[0] (neither addressable nor a map index expression)" */ [key].a[0] = 0 +}