cmd/compile: don't panic on syntax error in select statement

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>
This commit is contained in:
Robert Griesemer 2016-11-28 22:34:50 -08:00
parent 6f287fa2bb
commit 8fa0d85b38
2 changed files with 27 additions and 17 deletions

View file

@ -1809,24 +1809,19 @@ func (p *parser) commClause() *CommClause {
switch p.tok { switch p.tok {
case _Case: case _Case:
p.next() p.next()
lhs := p.exprList() c.Comm = p.simpleStmt(nil, false)
if _, ok := lhs.(*ListExpr); !ok && p.tok == _Arrow { // The syntax restricts the possible simple statements here to:
// lhs <- x //
} else { // lhs <- x (send statement)
// lhs // <-x
// lhs = <-x // lhs = <-x
// lhs := <-x // lhs := <-x
if p.tok == _Assign || p.tok == _Define { //
// TODO(gri) check that lhs has at most 2 entries // All these (and more) are recognized by simpleStmt and invalid
} else if p.tok == _Colon { // syntax trees are flagged later, during type checking.
// TODO(gri) check that lhs has at most 1 entry // TODO(gri) eventually may want to restrict valid syntax trees
} else { // here.
panic("unimplemented")
}
}
c.Comm = p.simpleStmt(lhs, false)
case _Default: case _Default:
p.next() p.next()

View file

@ -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 :"
}