compiler: Simple statement in type switch is in different block.
From-SVN: r183496
This commit is contained in:
parent
1efaf134d4
commit
625d0ab2fd
|
@ -4057,6 +4057,7 @@ Parse::switch_stat(Label* label)
|
||||||
Expression* switch_val = NULL;
|
Expression* switch_val = NULL;
|
||||||
bool saw_send_stmt;
|
bool saw_send_stmt;
|
||||||
Type_switch type_switch;
|
Type_switch type_switch;
|
||||||
|
bool have_type_switch_block = false;
|
||||||
if (this->simple_stat_may_start_here())
|
if (this->simple_stat_may_start_here())
|
||||||
{
|
{
|
||||||
switch_val = this->simple_stat(false, &saw_send_stmt, NULL,
|
switch_val = this->simple_stat(false, &saw_send_stmt, NULL,
|
||||||
|
@ -4099,7 +4100,14 @@ Parse::switch_stat(Label* label)
|
||||||
id_loc));
|
id_loc));
|
||||||
if (is_coloneq)
|
if (is_coloneq)
|
||||||
{
|
{
|
||||||
// This must be a TypeSwitchGuard.
|
// This must be a TypeSwitchGuard. It is in a
|
||||||
|
// different block from any initial SimpleStat.
|
||||||
|
if (saw_simple_stat)
|
||||||
|
{
|
||||||
|
this->gogo_->start_block(id_loc);
|
||||||
|
have_type_switch_block = true;
|
||||||
|
}
|
||||||
|
|
||||||
switch_val = this->simple_stat(false, &saw_send_stmt, NULL,
|
switch_val = this->simple_stat(false, &saw_send_stmt, NULL,
|
||||||
&type_switch);
|
&type_switch);
|
||||||
if (!type_switch.found)
|
if (!type_switch.found)
|
||||||
|
@ -4142,13 +4150,23 @@ Parse::switch_stat(Label* label)
|
||||||
if (this->peek_token()->is_op(OPERATOR_SEMICOLON))
|
if (this->peek_token()->is_op(OPERATOR_SEMICOLON))
|
||||||
this->advance_token();
|
this->advance_token();
|
||||||
if (!this->peek_token()->is_op(OPERATOR_LCURLY))
|
if (!this->peek_token()->is_op(OPERATOR_LCURLY))
|
||||||
return;
|
{
|
||||||
|
if (have_type_switch_block)
|
||||||
|
this->gogo_->add_block(this->gogo_->finish_block(location),
|
||||||
|
location);
|
||||||
|
this->gogo_->add_block(this->gogo_->finish_block(location),
|
||||||
|
location);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (type_switch.found)
|
if (type_switch.found)
|
||||||
type_switch.expr = Expression::make_error(location);
|
type_switch.expr = Expression::make_error(location);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
error_at(this->location(), "expected %<{%>");
|
error_at(this->location(), "expected %<{%>");
|
||||||
|
if (have_type_switch_block)
|
||||||
|
this->gogo_->add_block(this->gogo_->finish_block(this->location()),
|
||||||
|
location);
|
||||||
this->gogo_->add_block(this->gogo_->finish_block(this->location()),
|
this->gogo_->add_block(this->gogo_->finish_block(this->location()),
|
||||||
location);
|
location);
|
||||||
return;
|
return;
|
||||||
|
@ -4165,6 +4183,10 @@ Parse::switch_stat(Label* label)
|
||||||
if (statement != NULL)
|
if (statement != NULL)
|
||||||
this->gogo_->add_statement(statement);
|
this->gogo_->add_statement(statement);
|
||||||
|
|
||||||
|
if (have_type_switch_block)
|
||||||
|
this->gogo_->add_block(this->gogo_->finish_block(this->location()),
|
||||||
|
location);
|
||||||
|
|
||||||
this->gogo_->add_block(this->gogo_->finish_block(this->location()),
|
this->gogo_->add_block(this->gogo_->finish_block(this->location()),
|
||||||
location);
|
location);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue