OSDN Git Service

Correctly parse select case <-c <- v.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Mar 2011 05:32:46 +0000 (05:32 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Mar 2011 05:32:46 +0000 (05:32 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171540 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/parse.cc

index cdee68a..18310cc 100644 (file)
@@ -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))
     {