Fix select setting a map expression.

Also fix select parsing when declaring a variable with no
statements.

From-SVN: r171690
This commit is contained in:
Ian Lance Taylor 2011-03-29 18:54:27 +00:00
parent 5b9e705e63
commit df740f400a
1 changed files with 28 additions and 26 deletions

View File

@ -4274,41 +4274,43 @@ Parse::comm_clause(Select_clauses* clauses, bool* saw_default)
bool got_case = this->comm_case(&is_send, &channel, &val, &closed,
&varname, &closedname, &is_default);
if (!is_send
&& varname.empty()
&& closedname.empty()
&& val != NULL
&& val->index_expression() != NULL)
val->index_expression()->set_is_lvalue();
if (this->peek_token()->is_op(OPERATOR_COLON))
this->advance_token();
else
error_at(this->location(), "expected colon");
Block* statements = NULL;
this->gogo_->start_block(this->location());
Named_object* var = NULL;
Named_object* closedvar = NULL;
if (this->peek_token()->is_op(OPERATOR_SEMICOLON))
this->advance_token();
else if (this->statement_list_may_start_here())
if (!varname.empty())
{
this->gogo_->start_block(this->location());
if (!varname.empty())
{
// FIXME: LOCATION is slightly wrong here.
Variable* v = new Variable(NULL, channel, false, false, false,
location);
v->set_type_from_chan_element();
var = this->gogo_->add_variable(varname, v);
}
if (!closedname.empty())
{
// FIXME: LOCATION is slightly wrong here.
Variable* v = new Variable(Type::lookup_bool_type(), NULL,
false, false, false, location);
closedvar = this->gogo_->add_variable(closedname, v);
}
this->statement_list();
statements = this->gogo_->finish_block(this->location());
// FIXME: LOCATION is slightly wrong here.
Variable* v = new Variable(NULL, channel, false, false, false,
location);
v->set_type_from_chan_element();
var = this->gogo_->add_variable(varname, v);
}
Named_object* closedvar = NULL;
if (!closedname.empty())
{
// FIXME: LOCATION is slightly wrong here.
Variable* v = new Variable(Type::lookup_bool_type(), NULL,
false, false, false, location);
closedvar = this->gogo_->add_variable(closedname, v);
}
this->statement_list();
Block* statements = this->gogo_->finish_block(this->location());
if (is_default)
{
if (*saw_default)