]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: more accurate position for select case error message
authorRobert Griesemer <gri@golang.org>
Tue, 19 Jun 2018 17:20:35 +0000 (10:20 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 19 Jun 2018 17:52:23 +0000 (17:52 +0000)
Fixes #25958.

Change-Id: I1f4808a70c20334ecfc4eb1789f5389d94dcf00e
Reviewed-on: https://go-review.googlesource.com/119755
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/compile/internal/gc/select.go
test/fixedbugs/issue25958.go [new file with mode: 0644]

index eb37e32bf1dd2bce3598cd46df1d46b62065034b..4445edbe920962e4896c5b956694984b7b39510d 100644 (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
diff --git a/test/fixedbugs/issue25958.go b/test/fixedbugs/issue25958.go
new file mode 100644 (file)
index 0000000..ba7ee82
--- /dev/null
@@ -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"
+       }
+}