Commit 3742998d by Ian Lance Taylor

compiler: Better error messages for { on line after if/for/switch.

From-SVN: r205944
parent ed6b1c92
...@@ -4287,6 +4287,16 @@ Parse::if_stat() ...@@ -4287,6 +4287,16 @@ Parse::if_stat()
cond = this->expression(PRECEDENCE_NORMAL, false, false, NULL, NULL); cond = this->expression(PRECEDENCE_NORMAL, false, false, NULL, NULL);
} }
// Check for the easy error of a newline before starting the block.
if (this->peek_token()->is_op(OPERATOR_SEMICOLON))
{
Location semi_loc = this->location();
if (this->advance_token()->is_op(OPERATOR_LCURLY))
error_at(semi_loc, "missing %<{%> after if clause");
// Otherwise we will get an error when we call this->block
// below.
}
this->gogo_->start_block(this->location()); this->gogo_->start_block(this->location());
Location end_loc = this->block(); Location end_loc = this->block();
Block* then_block = this->gogo_->finish_block(end_loc); Block* then_block = this->gogo_->finish_block(end_loc);
...@@ -4431,7 +4441,7 @@ Parse::switch_stat(Label* label) ...@@ -4431,7 +4441,7 @@ Parse::switch_stat(Label* label)
Location token_loc = this->location(); Location token_loc = this->location();
if (this->peek_token()->is_op(OPERATOR_SEMICOLON) if (this->peek_token()->is_op(OPERATOR_SEMICOLON)
&& this->advance_token()->is_op(OPERATOR_LCURLY)) && this->advance_token()->is_op(OPERATOR_LCURLY))
error_at(token_loc, "unexpected semicolon or newline before %<{%>"); error_at(token_loc, "missing %<{%> after switch clause");
else if (this->peek_token()->is_op(OPERATOR_COLONEQ)) else if (this->peek_token()->is_op(OPERATOR_COLONEQ))
{ {
error_at(token_loc, "invalid variable name"); error_at(token_loc, "invalid variable name");
...@@ -5158,6 +5168,16 @@ Parse::for_stat(Label* label) ...@@ -5158,6 +5168,16 @@ Parse::for_stat(Label* label)
} }
} }
// Check for the easy error of a newline before starting the block.
if (this->peek_token()->is_op(OPERATOR_SEMICOLON))
{
Location semi_loc = this->location();
if (this->advance_token()->is_op(OPERATOR_LCURLY))
error_at(semi_loc, "missing %<{%> after for clause");
// Otherwise we will get an error when we call this->block
// below.
}
// Build the For_statement and note that it is the current target // Build the For_statement and note that it is the current target
// for break and continue statements. // for break and continue statements.
...@@ -5224,8 +5244,7 @@ Parse::for_clause(Expression** cond, Block** post) ...@@ -5224,8 +5244,7 @@ Parse::for_clause(Expression** cond, Block** post)
*cond = NULL; *cond = NULL;
else if (this->peek_token()->is_op(OPERATOR_LCURLY)) else if (this->peek_token()->is_op(OPERATOR_LCURLY))
{ {
error_at(this->location(), error_at(this->location(), "missing %<{%> after for clause");
"unexpected semicolon or newline before %<{%>");
*cond = NULL; *cond = NULL;
*post = NULL; *post = NULL;
return; return;
......
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