]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't panic on syntax error in select statement
authorRobert Griesemer <gri@golang.org>
Tue, 29 Nov 2016 06:34:50 +0000 (22:34 -0800)
committerRobert Griesemer <gri@golang.org>
Tue, 29 Nov 2016 16:47:34 +0000 (16:47 +0000)
Fixes #18092.

Change-Id: I54e2da2e0f168c068f5e4a1b22ba508d78259168
Reviewed-on: https://go-review.googlesource.com/33658
TryBot-Result: Gobot Gobot <gobot@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/syntax/parser.go
test/fixedbugs/issue18092.go [new file with mode: 0644]

index 41e7cbe56d7e6314bc8f0c7a6964fa02c86d9896..a2e307f46f66b80a7929f3d40d4d6aa6ab646bc1 100644 (file)
@@ -1809,24 +1809,19 @@ func (p *parser) commClause() *CommClause {
        switch p.tok {
        case _Case:
                p.next()
-               lhs := p.exprList()
-
-               if _, ok := lhs.(*ListExpr); !ok && p.tok == _Arrow {
-                       // lhs <- x
-               } else {
-                       // lhs
-                       // lhs = <-x
-                       // lhs := <-x
-                       if p.tok == _Assign || p.tok == _Define {
-                               // TODO(gri) check that lhs has at most 2 entries
-                       } else if p.tok == _Colon {
-                               // TODO(gri) check that lhs has at most 1 entry
-                       } else {
-                               panic("unimplemented")
-                       }
-               }
+               c.Comm = p.simpleStmt(nil, false)
 
-               c.Comm = p.simpleStmt(lhs, false)
+               // The syntax restricts the possible simple statements here to:
+               //
+               //     lhs <- x (send statement)
+               //     <-x
+               //     lhs = <-x
+               //     lhs := <-x
+               //
+               // All these (and more) are recognized by simpleStmt and invalid
+               // syntax trees are flagged later, during type checking.
+               // TODO(gri) eventually may want to restrict valid syntax trees
+               // here.
 
        case _Default:
                p.next()
diff --git a/test/fixedbugs/issue18092.go b/test/fixedbugs/issue18092.go
new file mode 100644 (file)
index 0000000..94fd2dd
--- /dev/null
@@ -0,0 +1,15 @@
+// errorcheck
+
+// Copyright 2016 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
+
+func _() {
+       var ch chan bool
+       select {
+       default:
+       case <-ch { // don't crash here
+       }           // ERROR "expecting :"
+}