From: Ian Lance Taylor Date: Sat, 26 Mar 2011 05:32:46 +0000 (+0000) Subject: Correctly parse select case <-c <- v. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e2e5c70f5c999df78a5d1edd8b87651d08d72400;p=gcc.git Correctly parse select case <-c <- v. From-SVN: r171540 --- 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)) {