OSDN Git Service

Don't crash building erroneous variable initializer.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Dec 2010 01:14:41 +0000 (01:14 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Dec 2010 01:14:41 +0000 (01:14 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168155 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/gogo-tree.cc

index e43f64d..5a6f079 100644 (file)
@@ -757,7 +757,7 @@ Gogo::write_globals()
              pop_cfun();
            }
 
-         if (var_init_tree != NULL_TREE)
+         if (var_init_tree != NULL_TREE && var_init_tree != error_mark_node)
            {
              if (no->var_value()->init() == NULL
                  && !no->var_value()->has_pre_init())
@@ -1209,10 +1209,13 @@ Variable::get_init_block(Gogo* gogo, Named_object* function, tree var_decl)
 
   Translate_context context(gogo, function, NULL, NULL_TREE);
   tree block_tree = this->preinit_->get_tree(&context);
+  if (block_tree == error_mark_node)
+    return error_mark_node;
   gcc_assert(TREE_CODE(block_tree) == BIND_EXPR);
   tree statements = BIND_EXPR_BODY(block_tree);
-  while (TREE_CODE(statements) == TRY_FINALLY_EXPR
-        || TREE_CODE(statements) == TRY_CATCH_EXPR)
+  while (statements != NULL_TREE
+        && (TREE_CODE(statements) == TRY_FINALLY_EXPR
+            || TREE_CODE(statements) == TRY_CATCH_EXPR))
     statements = TREE_OPERAND(statements, 0);
 
   // It's possible to have pre-init statements without an initializer
@@ -1220,6 +1223,8 @@ Variable::get_init_block(Gogo* gogo, Named_object* function, tree var_decl)
   if (this->init_ != NULL)
     {
       tree rhs_tree = this->init_->get_tree(&context);
+      if (rhs_tree == error_mark_node)
+       return error_mark_node;
       if (var_decl == NULL_TREE)
        append_to_statement_list(rhs_tree, &statements);
       else
@@ -1228,6 +1233,8 @@ Variable::get_init_block(Gogo* gogo, Named_object* function, tree var_decl)
                                                        this->init_->type(),
                                                        rhs_tree,
                                                        this->location());
+         if (val == error_mark_node)
+           return error_mark_node;
          tree set = fold_build2_loc(this->location(), MODIFY_EXPR,
                                     void_type_node, var_decl, val);
          append_to_statement_list(set, &statements);