Don't crash on invalid closure.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 14 Dec 2010 23:10:22 +0000 (23:10 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 14 Dec 2010 23:10:22 +0000 (23:10 +0000)
From-SVN: r167821

gcc/go/gofrontend/gogo-tree.cc

index d9bf69af0b52706936692b01001b8942c870387c..67f9949f695b735c0179ad79c0e6cbc974e9611e 100644 (file)
@@ -1313,14 +1313,19 @@ Function::get_or_make_decl(Gogo* gogo, Named_object* no, tree id)
              push_struct_function(decl);
 
              tree closure_decl = this->closure_var_->get_tree(gogo, no);
+             if (closure_decl == error_mark_node)
+               this->fndecl_ = error_mark_node;
+             else
+               {
+                 DECL_ARTIFICIAL(closure_decl) = 1;
+                 DECL_IGNORED_P(closure_decl) = 1;
+                 TREE_USED(closure_decl) = 1;
+                 DECL_ARG_TYPE(closure_decl) = TREE_TYPE(closure_decl);
+                 TREE_READONLY(closure_decl) = 1;
 
-             DECL_ARTIFICIAL(closure_decl) = 1;
-             DECL_IGNORED_P(closure_decl) = 1;
-             TREE_USED(closure_decl) = 1;
-             DECL_ARG_TYPE(closure_decl) = TREE_TYPE(closure_decl);
-             TREE_READONLY(closure_decl) = 1;
+                 DECL_STRUCT_FUNCTION(decl)->static_chain_decl = closure_decl;
+               }
 
-             DECL_STRUCT_FUNCTION(decl)->static_chain_decl = closure_decl;
              pop_cfun();
            }
        }