From: Ian Lance Taylor Date: Tue, 21 Dec 2010 21:14:15 +0000 (+0000) Subject: Correct handling of methods which call recover. X-Git-Tag: releases/gcc-4.6.0~1699 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=686875c17265153c5ef239ec5e53e62850b8399e;p=thirdparty%2Fgcc.git Correct handling of methods which call recover. From-SVN: r168132 --- diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 39baf9d1c156..0745704741ad 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -8630,6 +8630,7 @@ Call_expression::do_get_tree(Translate_context* context) pe != this->args_->end(); ++pe, ++pp, ++i) { + gcc_assert(pp != params->end()); tree arg_val = (*pe)->get_tree(context); args[i] = Expression::convert_for_assignment(context, pp->type(), diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index 707111688b79..2e453844500b 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -2093,14 +2093,6 @@ Build_recover_thunks::function(Named_object* orig_no) Expression* fn = Expression::make_func_reference(new_no, closure, location); Expression_list* args = new Expression_list(); - if (orig_fntype->is_method()) - { - Named_object* rec_no = gogo->lookup(receiver_name, NULL); - gcc_assert(rec_no != NULL - && rec_no->is_variable() - && rec_no->var_value()->is_parameter()); - args->push_back(Expression::make_var_reference(rec_no, location)); - } if (new_params != NULL) { // Note that we skip the last parameter, which is the boolean @@ -2153,10 +2145,11 @@ Build_recover_thunks::function(Named_object* orig_no) && !orig_rec_no->var_value()->is_receiver()); orig_rec_no->var_value()->set_is_receiver(); - Named_object* new_rec_no = new_bindings->lookup_local(receiver_name); + const std::string& new_receiver_name(orig_fntype->receiver()->name()); + Named_object* new_rec_no = new_bindings->lookup_local(new_receiver_name); gcc_assert(new_rec_no != NULL && new_rec_no->is_variable() - && !new_rec_no->var_value()->is_receiver()); + && new_rec_no->var_value()->is_receiver()); new_rec_no->var_value()->set_is_not_receiver(); }