aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2010-12-09 23:56:47 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2010-12-09 23:56:47 +0000
commit3338038aaa74287563c93f08334397fa0ac4a85e (patch)
tree5814b73fb811a0528975bc30e08b5d13e7778715
parentd3de3f21fd3322b5b595946c35ef65dd441de7cd (diff)
downloadgcc-3338038aaa74287563c93f08334397fa0ac4a85e.zip
gcc-3338038aaa74287563c93f08334397fa0ac4a85e.tar.gz
gcc-3338038aaa74287563c93f08334397fa0ac4a85e.tar.bz2
Avoid some crashes on erroneous programs.
From-SVN: r167670
-rw-r--r--gcc/go/gofrontend/expressions.cc9
-rw-r--r--gcc/go/gofrontend/types.cc2
2 files changed, 10 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 0387ee4..022f5ce 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -1146,7 +1146,11 @@ Func_expression::get_tree_without_closure(Gogo* gogo)
}
Named_object* no = this->function_;
- tree id = this->function_->get_id(gogo);
+
+ tree id = no->get_id(gogo);
+ if (id == error_mark_node)
+ return error_mark_node;
+
tree fndecl;
if (no->is_function())
fndecl = no->func_value()->get_or_make_decl(gogo, no, id);
@@ -1155,6 +1159,9 @@ Func_expression::get_tree_without_closure(Gogo* gogo)
else
gcc_unreachable();
+ if (fndecl == error_mark_node)
+ return error_mark_node;
+
return build_fold_addr_expr_loc(this->location(), fndecl);
}
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index b030a42..8d440a8 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -6864,6 +6864,8 @@ Named_type::do_get_tree(Gogo* gogo)
t = make_node(RECORD_TYPE);
this->named_tree_ = t;
t = this->type_->interface_type()->fill_in_tree(gogo, t);
+ if (t == error_mark_node)
+ return error_mark_node;
}
break;