compiler: Better error messages for { on line after if/for/switch.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 12 Dec 2013 21:35:02 +0000 (21:35 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 12 Dec 2013 21:35:02 +0000 (21:35 +0000)
From-SVN: r205944

gcc/go/gofrontend/parse.cc

index 6e56f835699ee648c155fe09cd68ab6552d42b05..7614e6fc7957ec42586e3f97a3a3ee9a79f986e1 100644 (file)
@@ -4287,6 +4287,16 @@ Parse::if_stat()
        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());
   Location end_loc = this->block();
   Block* then_block = this->gogo_->finish_block(end_loc);
@@ -4431,7 +4441,7 @@ Parse::switch_stat(Label* label)
       Location token_loc = this->location();
       if (this->peek_token()->is_op(OPERATOR_SEMICOLON)
          && 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))
        {
          error_at(token_loc, "invalid variable name");
@@ -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
   // for break and continue statements.
 
@@ -5224,8 +5244,7 @@ Parse::for_clause(Expression** cond, Block** post)
     *cond = NULL;
   else if (this->peek_token()->is_op(OPERATOR_LCURLY))
     {
-      error_at(this->location(),
-              "unexpected semicolon or newline before %<{%>");
+      error_at(this->location(), "missing %<{%> after for clause");
       *cond = NULL;
       *post = NULL;
       return;