]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix handling of named results for functions which call recover.
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 22 Dec 2010 15:10:58 +0000 (15:10 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 22 Dec 2010 15:10:58 +0000 (15:10 +0000)
From-SVN: r168170

gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/gogo.h

index 32d5589feea0aba514cc82806590c580f11742d4..be4de9ce097d561a69e38aa5221bb7c05b81de71 100644 (file)
@@ -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*
index 96729b2e7e20f9b48d09f565d13390ec2ad4c9ca..dd7afc86a19d8fc0ff5c56b19249c46e580926aa 100644 (file)
@@ -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_;