From e2e5c70f5c999df78a5d1edd8b87651d08d72400 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 26 Mar 2011 05:32:46 +0000 Subject: [PATCH] Correctly parse select case <-c <- v. From-SVN: r171540 --- gcc/go/gofrontend/parse.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/gcc/go/gofrontend/parse.cc b/gcc/go/gofrontend/parse.cc index cdee68ad6c2..18310ccac29 100644 --- a/gcc/go/gofrontend/parse.cc +++ b/gcc/go/gofrontend/parse.cc @@ -4375,16 +4375,24 @@ Parse::send_or_recv_stmt(bool* is_send, Expression** channel, Expression** val, // send or receive expression. If SAW_COMMA is true, then *VAL is // set and we just read a comma. - if (!saw_comma && this->peek_token()->is_op(OPERATOR_CHANOP)) + Expression* e; + if (saw_comma || !this->peek_token()->is_op(OPERATOR_CHANOP)) + e = this->expression(PRECEDENCE_NORMAL, true, true, NULL); + else { // case <-c: *is_send = false; this->advance_token(); *channel = this->expression(PRECEDENCE_NORMAL, false, true, NULL); - return true; - } - Expression* e = this->expression(PRECEDENCE_NORMAL, true, true, NULL); + // The next token should be ':'. If it is '<-', then we have + // case <-c <- v: + // which is to say, send on a channel received from a channel. + if (!this->peek_token()->is_op(OPERATOR_CHANOP)) + return true; + + e = Expression::make_receive(*channel, (*channel)->location()); + } if (this->peek_token()->is_op(OPERATOR_EQ)) {