]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: recognize labels even if they have the same name as packages
authorRobert Griesemer <gri@golang.org>
Wed, 9 Dec 2015 01:23:23 +0000 (17:23 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 9 Dec 2015 02:02:11 +0000 (02:02 +0000)
Another (historic) artifact due to partially resolving symbols too early.

Fixes #13539.

Change-Id: Ie720c491cfa399599454f384b3a9735e75d4e8f1
Reviewed-on: https://go-review.googlesource.com/17600
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/parser.go
test/fixedbugs/issue13539.go [new file with mode: 0644]

index 16e0802e3e38c63b8a413697d43bfa6cf36ab9cd..a3f30793939f1528126a8c45ef0d2344596813ec 100644 (file)
@@ -668,10 +668,11 @@ func (p *parser) simple_stmt(labelOk, rangeOk bool) *Node {
                        // labelname ':' stmt
                        if labelOk {
                                // If we have a labelname, it was parsed by operand
-                               // (calling p.name()) and given an ONAME, ONONAME, or OTYPE node.
-                               if lhs.Op == ONAME || lhs.Op == ONONAME || lhs.Op == OTYPE {
+                               // (calling p.name()) and given an ONAME, ONONAME, OTYPE, or OPACK node.
+                               switch lhs.Op {
+                               case ONAME, ONONAME, OTYPE, OPACK:
                                        lhs = newname(lhs.Sym)
-                               } else {
+                               default:
                                        p.syntax_error("expecting semicolon or newline or }")
                                        // we already progressed, no need to advance
                                }
diff --git a/test/fixedbugs/issue13539.go b/test/fixedbugs/issue13539.go
new file mode 100644 (file)
index 0000000..72c3ab0
--- /dev/null
@@ -0,0 +1,20 @@
+// errorcheck
+
+// Copyright 2015 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.
+
+// Verify that a label named like a package is recognized
+// as a label rather than a package and that the package
+// remains unused.
+
+package main
+
+import "math" // ERROR "imported and not used"
+
+func main() {
+math:
+       for {
+               break math
+       }
+}