Commit 6ac0aed8 by Ian Lance Taylor

compiler: correct parse of parenthesized select case

    
    We used to mishandle `select { case (<-c): }` and friends.
    
    The test case for this is https://golang.org/cl/91657.
    
    Fixes golang/go#20923
    
    Reviewed-on: https://go-review.googlesource.com/91695

From-SVN: r257374
parent 59597e37
9057b8f71e6078f140938fe60be9aaa7d59a3a2b 2f7ac42a3f83b78d97912ce1e86296b2af4f52b7
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -5160,7 +5160,18 @@ Parse::send_or_recv_stmt(bool* is_send, Expression** channel, Expression** val, ...@@ -5160,7 +5160,18 @@ Parse::send_or_recv_stmt(bool* is_send, Expression** channel, Expression** val,
Expression* e; Expression* e;
if (saw_comma || !this->peek_token()->is_op(OPERATOR_CHANOP)) if (saw_comma || !this->peek_token()->is_op(OPERATOR_CHANOP))
e = this->expression(PRECEDENCE_NORMAL, true, true, NULL, NULL); {
e = this->expression(PRECEDENCE_NORMAL, true, true, NULL, NULL);
if (e->receive_expression() != NULL)
{
*is_send = false;
*channel = e->receive_expression()->channel();
// This is 'case (<-c):'. We now expect ':'. If we see
// '<-', then we have case (<-c)<-v:
if (!this->peek_token()->is_op(OPERATOR_CHANOP))
return true;
}
}
else else
{ {
// case <-c: // case <-c:
...@@ -5189,14 +5200,17 @@ Parse::send_or_recv_stmt(bool* is_send, Expression** channel, Expression** val, ...@@ -5189,14 +5200,17 @@ Parse::send_or_recv_stmt(bool* is_send, Expression** channel, Expression** val,
if (this->peek_token()->is_op(OPERATOR_EQ)) if (this->peek_token()->is_op(OPERATOR_EQ))
{ {
if (!this->advance_token()->is_op(OPERATOR_CHANOP)) *is_send = false;
this->advance_token();
Location recvloc = this->location();
Expression* recvexpr = this->expression(PRECEDENCE_NORMAL, false,
true, NULL, NULL);
if (recvexpr->receive_expression() == NULL)
{ {
go_error_at(this->location(), "missing %<<-%>"); go_error_at(recvloc, "missing %<<-%>");
return false; return false;
} }
*is_send = false; *channel = recvexpr->receive_expression()->channel();
this->advance_token();
*channel = this->expression(PRECEDENCE_NORMAL, false, true, NULL, NULL);
if (saw_comma) if (saw_comma)
{ {
// case v, e = <-c: // case v, e = <-c:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment