diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2010-12-14 23:10:22 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2010-12-14 23:10:22 +0000 |
commit | 42cbb8c17846290b82fd09ea79cab3e91454ba8d (patch) | |
tree | 11438e72ab7d38f129c7ad13faa05e91a005c4ca | |
parent | cad51bedb53a97dfce1915ff32d95e4aacf5bc93 (diff) | |
download | gcc-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.cc | 17 |
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(); } } |