cmd/compile: more accurate position for select case error message

Fixes #25958.

Change-Id: I1f4808a70c20334ecfc4eb1789f5389d94dcf00e
Reviewed-on: https://go-review.googlesource.com/119755
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Robert Griesemer 2018-06-19 10:20:35 -07:00
parent 1caa06299c
commit 707ca18d97
2 changed files with 26 additions and 1 deletions

View file

@ -33,7 +33,15 @@ func typecheckselect(sel *Node) {
ncase.List.Set(nil)
switch n.Op {
default:
yyerrorl(n.Pos, "select case must be receive, send or assign recv")
pos := n.Pos
if n.Op == ONAME {
// We don't have the right position for ONAME nodes (see #15459 and
// others). Using ncase.Pos for now as it will provide the correct
// line number (assuming the expression follows the "case" keyword
// on the same line). This matches the approach before 1.10.
pos = ncase.Pos
}
yyerrorl(pos, "select case must be receive, send or assign recv")
// convert x = <-c into OSELRECV(x, <-c).
// remove implicit conversions; the eventual assignment

View file

@ -0,0 +1,17 @@
// errorcheck
// Copyright 2018 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
// Verify that the "must be receive" error for "case done:" appears
// on the line of the case clause, not the line of the done declaration.
func f(done chan struct{}) {
select {
case done: // ERROR "must be receive", "not used"
case (chan struct{})(done): // ERROR "must be receive"
}
}