diff options
author | Russ Cox <rsc@golang.org> | 2011-02-01 08:29:21 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-02-01 08:29:21 -0500 |
commit | 0e47460915a887f7b251c0d9512ed25d3ff31624 (patch) | |
tree | 7eee850e9e285ad7dc6c98f00447f9f045ea1e4a | |
parent | 5887ef75713e3f3291f7880809ae2b91c9944ce9 (diff) | |
download | go-0e47460915a887f7b251c0d9512ed25d3ff31624.tar.gz go-0e47460915a887f7b251c0d9512ed25d3ff31624.zip |
gc: fix send precedence
Test and fix case found by Robert.
Add receive inside send to tree too.
R=ken2
CC=golang-dev
https://golang.org/cl/3973052
-rw-r--r-- | src/cmd/gc/go.y | 3 | ||||
-rw-r--r-- | test/chan/sendstmt.go | 37 |
2 files changed, 39 insertions, 1 deletions
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 1060fdd2bf..b711d360d2 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -93,9 +93,10 @@ static void fixlbrace(int); %type <type> hidden_type_func %type <type> hidden_type_recv_chan hidden_type_non_recv_chan +%left LCOMM /* outside the usual hierarchy; here for good error messages */ + %left LOROR %left LANDAND -%left LCOMM %left LEQ LNE LLE LGE LLT LGT %left '+' '-' '|' '^' %left '*' '/' '%' '&' LLSH LRSH LANDNOT diff --git a/test/chan/sendstmt.go b/test/chan/sendstmt.go new file mode 100644 index 0000000000..ee6f765cf8 --- /dev/null +++ b/test/chan/sendstmt.go @@ -0,0 +1,37 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out + +// Copyright 2011 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. + +// Test various parsing cases that are a little +// different now that send is a statement, not a expression. + +package main + +func main() { + chanchan() + sendprec() +} + +func chanchan() { + cc := make(chan chan int, 1) + c := make(chan int, 1) + cc <- c + select { + case <-cc <- 2: + default: + panic("nonblock") + } + if <-c != 2 { + panic("bad receive") + } +} + +func sendprec() { + c := make(chan bool, 1) + c <- false || true // not a syntax error: same as c <- (false || true) + if !<-c { + panic("sent false") + } +} |