Commit 9ed91ceb by Ian Lance Taylor

Fix handling of named results for functions which call recover.

From-SVN: r168170
parent 46fc2305
......@@ -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*
......
......@@ -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_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment