summaryrefslogtreecommitdiff
path: root/src/pkg/go
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2010-01-25 12:03:53 -0800
committerRobert Griesemer <gri@golang.org>2010-01-25 12:03:53 -0800
commitab8ce920ff9774b4ee3facac70925a83dc794264 (patch)
treece50d0642d3c2ed557a803692ec5c641f9b4cb75 /src/pkg/go
parentf35f8245e8341df39e137290d698dadab041d965 (diff)
downloadgolang-ab8ce920ff9774b4ee3facac70925a83dc794264.tar.gz
A <- token in an expression may introduce a channel type.
Fixes issue 530. R=rsc CC=golang-dev http://codereview.appspot.com/193091
Diffstat (limited to 'src/pkg/go')
-rw-r--r--src/pkg/go/parser/parser.go17
-rw-r--r--src/pkg/go/parser/parser_test.go2
2 files changed, 17 insertions, 2 deletions
diff --git a/src/pkg/go/parser/parser.go b/src/pkg/go/parser/parser.go
index f5e8f839e..a680d862e 100644
--- a/src/pkg/go/parser/parser.go
+++ b/src/pkg/go/parser/parser.go
@@ -1221,14 +1221,27 @@ func (p *parser) parseUnaryExpr() ast.Expr {
}
switch p.tok {
- case token.ADD, token.SUB, token.NOT, token.XOR, token.ARROW, token.AND, token.RANGE:
+ case token.ADD, token.SUB, token.NOT, token.XOR, token.AND, token.RANGE:
pos, op := p.pos, p.tok
p.next()
x := p.parseUnaryExpr()
return &ast.UnaryExpr{pos, op, p.checkExpr(x)}
+ case token.ARROW:
+ // channel type or receive expression
+ pos := p.pos
+ p.next()
+ if p.tok == token.CHAN {
+ p.next()
+ value := p.parseType()
+ return &ast.ChanType{pos, ast.RECV, value}
+ }
+
+ x := p.parseUnaryExpr()
+ return &ast.UnaryExpr{pos, token.ARROW, p.checkExpr(x)}
+
case token.MUL:
- // unary "*" expression or pointer type
+ // pointer type or unary "*" expression
pos := p.pos
p.next()
x := p.parseUnaryExpr()
diff --git a/src/pkg/go/parser/parser_test.go b/src/pkg/go/parser/parser_test.go
index 2f7bace6f..9e3755162 100644
--- a/src/pkg/go/parser/parser_test.go
+++ b/src/pkg/go/parser/parser_test.go
@@ -32,6 +32,8 @@ var validPrograms = []interface{}{
`package main;`,
`package main; import "fmt"; func main() { fmt.Println("Hello, World!") }` + "\n",
`package main; func main() { if f(T{}) {} }` + "\n",
+ `package main; func main() { _ = (<-chan int)(x) }` + "\n",
+ `package main; func main() { _ = (<-chan <-chan int)(x) }` + "\n",
}