From 9ed91cebef42dd20ca7f9f665d3f7b2b248a3584 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 22 Dec 2010 15:10:58 +0000 Subject: [PATCH] Fix handling of named results for functions which call recover. From-SVN: r168170 --- gcc/go/gofrontend/gogo.cc | 19 +++++++++++++++++++ gcc/go/gofrontend/gogo.h | 11 +++++++++++ 2 files changed, 30 insertions(+) diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index 32d5589feea0..be4de9ce097d 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -2177,6 +2177,10 @@ Build_recover_thunks::function(Named_object* orig_no) Convert_recover convert_recover(can_recover_no); new_func->traverse(&convert_recover); + // Update the function pointers in any named results. + new_func->update_named_result_variables(); + orig_func->update_named_result_variables(); + return TRAVERSE_CONTINUE; } @@ -2505,6 +2509,21 @@ Function::create_named_result_variables(Gogo* gogo) } } +// Update the named result variables when cloning a function which +// calls recover. + +void +Function::update_named_result_variables() +{ + if (this->named_results_ == NULL) + return; + + for (Named_results::iterator p = this->named_results_->begin(); + p != this->named_results_->end(); + ++p) + (*p)->result_var_value()->set_function(this); +} + // Return the closure variable, creating it if necessary. Named_object* diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h index 96729b2e7e20..dd7afc86a19d 100644 --- a/gcc/go/gofrontend/gogo.h +++ b/gcc/go/gofrontend/gogo.h @@ -787,6 +787,11 @@ class Function void create_named_result_variables(Gogo*); + // Update the named result variables when cloning a function which + // calls recover. + void + update_named_result_variables(); + // Add a new field to the closure variable. void add_closure_field(Named_object* var, source_location loc) @@ -1318,6 +1323,12 @@ class Result_variable is_in_heap() const { return this->is_address_taken_; } + // Set the function. This is used when cloning functions which call + // recover. + void + set_function(Function* function) + { this->function_ = function; } + private: // Type of result variable. Type* type_; -- 2.47.2