cmd/compile/internal/syntax: better error when an assignment is used in value context

The error message is now positioned at the statement position (which is
an identifing token, such as the '=' for assignments); and in case of
assignments it emphasizes the assignment by putting the Lhs and Rhs
in parentheses. Finally, the wording is changed from "use of * as value"
to the stronger "cannot use * as value" (for which there is precedent
elsewhere in the parser).

Fixes #36858.

Change-Id: Ic3f101bba50f58e3a1d9b29645066634631f2d61
Reviewed-on: https://go-review.googlesource.com/c/go/+/218337
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Robert Griesemer 2020-02-06 15:32:40 -08:00
parent d532d5f0fa
commit ffc0573b85
5 changed files with 20 additions and 10 deletions

View file

@ -1886,11 +1886,16 @@ done:
// which turns an expression into an assignment. Provide
// a more explicit error message in that case to prevent
// further confusion.
str := String(s)
var str string
if as, ok := s.(*AssignStmt); ok && as.Op == 0 {
str = "assignment " + str
// Emphasize Lhs and Rhs of assignment with parentheses to highlight '='.
// Do it always - it's not worth going through the trouble of doing it
// only for "complex" left and right sides.
str = "assignment (" + String(as.Lhs) + ") = (" + String(as.Rhs) + ")"
} else {
str = String(s)
}
p.syntaxError(fmt.Sprintf("%s used as value", str))
p.syntaxErrorAt(s.Pos(), fmt.Sprintf("cannot use %s as value", str))
}
p.xnest = outer