OSDN Git Service

Better parsing of erroneous expression on left of :=.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Sep 2011 22:23:19 +0000 (22:23 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Sep 2011 22:23:19 +0000 (22:23 +0000)
Better parsing of erroneous non-type in type switch.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179133 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/parse.cc

index d914beb..8c42fa2 100644 (file)
@@ -3506,7 +3506,21 @@ Parse::simple_stat(bool may_be_composite_lit, bool* return_exp,
   else if (return_exp != NULL)
     return this->verify_not_sink(exp);
   else
-    this->expression_stat(this->verify_not_sink(exp));
+    {
+      exp = this->verify_not_sink(exp);
+
+      if (token->is_op(OPERATOR_COLONEQ))
+       {
+         if (!exp->is_error_expression())
+           error_at(token->location(), "non-name on left side of %<:=%>");
+         while (!token->is_op(OPERATOR_SEMICOLON)
+                && !token->is_eof())
+           token = this->advance_token();
+         return NULL;
+       }
+
+      this->expression_stat(exp);
+    }
 
   return NULL;
 }
@@ -4287,8 +4301,19 @@ Parse::type_switch_case(std::vector<Type*>* types, bool* is_default)
       while (true)
        {
          Type* t = this->type();
+
          if (!t->is_error_type())
            types->push_back(t);
+         else
+           {
+             token = this->peek_token();
+             while (!token->is_op(OPERATOR_COLON)
+                    && !token->is_op(OPERATOR_COMMA)
+                    && !token->is_op(OPERATOR_RCURLY)
+                    && !token->is_eof())
+               token = this->advance_token();
+           }
+
          if (!this->peek_token()->is_op(OPERATOR_COMMA))
            break;
          this->advance_token();