aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2010-12-14 23:10:22 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2010-12-14 23:10:22 +0000
commit42cbb8c17846290b82fd09ea79cab3e91454ba8d (patch)
tree11438e72ab7d38f129c7ad13faa05e91a005c4ca
parentcad51bedb53a97dfce1915ff32d95e4aacf5bc93 (diff)
downloadgcc-42cbb8c17846290b82fd09ea79cab3e91454ba8d.zip
gcc-42cbb8c17846290b82fd09ea79cab3e91454ba8d.tar.gz
gcc-42cbb8c17846290b82fd09ea79cab3e91454ba8d.tar.bz2
Don't crash on invalid closure.
From-SVN: r167821
-rw-r--r--gcc/go/gofrontend/gogo-tree.cc17
1 files changed, 11 insertions, 6 deletions
diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc
index d9bf69a..67f9949 100644
--- a/gcc/go/gofrontend/gogo-tree.cc
+++ b/gcc/go/gofrontend/gogo-tree.cc
@@ -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();
}
}