From 8fa0d85b385b549fed163fe67342dfcd092e02c4 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 28 Nov 2016 22:34:50 -0800 Subject: [PATCH] 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 Run-TryBot: Robert Griesemer Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/syntax/parser.go | 29 ++++++++++------------- test/fixedbugs/issue18092.go | 15 ++++++++++++ 2 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 test/fixedbugs/issue18092.go diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index 41e7cbe56d..a2e307f46f 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -1809,24 +1809,19 @@ func (p *parser) commClause() *CommClause { switch p.tok { case _Case: p.next() - lhs := p.exprList() + c.Comm = p.simpleStmt(nil, false) - 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(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 index 0000000000..94fd2dd383 --- /dev/null +++ b/test/fixedbugs/issue18092.go @@ -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 :" +}