From ce842ad6cdd96ec4475cd81b6258ae3c6c46f771 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 1 Mar 2012 05:14:10 +0000 Subject: [PATCH] compiler: Avoid some compiler crashes on invalid code. * go-gcc.cc (class Gcc_tree): Add set_tree method. (set_placeholder_pointer_type): When setting to a pointer to error, set to error_mark_node. From-SVN: r184684 --- gcc/go/ChangeLog | 6 ++++++ gcc/go/go-gcc.cc | 6 +++++- gcc/go/gofrontend/expressions.cc | 2 +- gcc/go/gofrontend/parse.cc | 5 +++-- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index 50ca12755ac..8b8e90c4b68 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,9 @@ +2012-02-29 Ian Lance Taylor + + * go-gcc.cc (class Gcc_tree): Add set_tree method. + (set_placeholder_pointer_type): When setting to a pointer to + error, set to error_mark_node. + 2012-02-23 Richard Guenther * go-gcc.cc (Gcc_backend::placeholder_pointer_type): Use diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc index b2b61eb1608..a19bb894a99 100644 --- a/gcc/go/go-gcc.cc +++ b/gcc/go/go-gcc.cc @@ -56,6 +56,10 @@ class Gcc_tree get_tree() const { return this->t_; } + void + set_tree(tree t) + { this->t_ = t; } + private: tree t_; }; @@ -626,7 +630,7 @@ Gcc_backend::set_placeholder_pointer_type(Btype* placeholder, tree tt = to_type->get_tree(); if (tt == error_mark_node) { - TREE_TYPE(pt) = tt; + placeholder->set_tree(error_mark_node); return false; } gcc_assert(TREE_CODE(tt) == POINTER_TYPE); diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index abcd5933fb4..39a162b93be 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -13878,7 +13878,7 @@ tree Heap_composite_expression::do_get_tree(Translate_context* context) { tree expr_tree = this->expr_->get_tree(context); - if (expr_tree == error_mark_node) + if (expr_tree == error_mark_node || TREE_TYPE(expr_tree) == error_mark_node) return error_mark_node; tree expr_size = TYPE_SIZE_UNIT(TREE_TYPE(expr_tree)); go_assert(TREE_CODE(expr_size) == INTEGER_CST); diff --git a/gcc/go/gofrontend/parse.cc b/gcc/go/gofrontend/parse.cc index df28d2baf4b..1a9c153a578 100644 --- a/gcc/go/gofrontend/parse.cc +++ b/gcc/go/gofrontend/parse.cc @@ -3948,8 +3948,9 @@ Parse::return_stat() ++p) { Named_object* no = this->gogo_->lookup((*p)->name(), NULL); - go_assert(no != NULL); - if (!no->is_result_variable()) + if (no == NULL) + go_assert(saw_errors()); + else if (!no->is_result_variable()) error_at(location, "%qs is shadowed during return", (*p)->message_name().c_str()); } -- 2.30.2