From 20532210cd1a8e0b3b2d6ec1bcaa8c0e928af5ca Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 3 Mar 2011 02:08:28 +0000 Subject: [PATCH] Determine call types even if first call result is not used. From-SVN: r170637 --- gcc/go/gofrontend/expressions.cc | 24 ++++++++++++++++++++++-- gcc/go/gofrontend/expressions.h | 13 +++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index a45e7acc247..28b7ee669bf 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -7250,6 +7250,9 @@ Builtin_call_expression::do_type() void Builtin_call_expression::do_determine_type(const Type_context* context) { + if (!this->determining_types()) + return; + this->fn()->determine_type_no_context(); const Expression_list* args = this->args(); @@ -8486,6 +8489,9 @@ Call_expression::do_type() void Call_expression::do_determine_type(const Type_context*) { + if (!this->determining_types()) + return; + this->fn_->determine_type_no_context(); Function_type* fntype = this->get_function_type(); const Typed_identifier_list* parameters = NULL; @@ -8512,6 +8518,21 @@ Call_expression::do_determine_type(const Type_context*) } } +// Called when determining types for a Call_expression. Return true +// if we should go ahead, false if they have already been determined. + +bool +Call_expression::determining_types() +{ + if (this->types_are_determined_) + return false; + else + { + this->types_are_determined_ = true; + return true; + } +} + // Check types for parameter I. bool @@ -9004,8 +9025,7 @@ Call_result_expression::do_check_types(Gogo*) void Call_result_expression::do_determine_type(const Type_context*) { - if (this->index_ == 0) - this->call_->determine_type_no_context(); + this->call_->determine_type_no_context(); } // Return the tree. diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h index c050a4a9c0c..b6fc9c012d9 100644 --- a/gcc/go/gofrontend/expressions.h +++ b/gcc/go/gofrontend/expressions.h @@ -1161,7 +1161,7 @@ class Call_expression : public Expression source_location location) : Expression(EXPRESSION_CALL, location), fn_(fn), args_(args), type_(NULL), tree_(NULL), is_varargs_(is_varargs), - is_value_discarded_(false), varargs_are_lowered_(false), + varargs_are_lowered_(false), types_are_determined_(false), is_deferred_(false) { } @@ -1220,7 +1220,7 @@ class Call_expression : public Expression void do_discarding_value() - { this->is_value_discarded_ = true; } + { } virtual Type* do_type(); @@ -1263,6 +1263,11 @@ class Call_expression : public Expression lower_varargs(Gogo*, Named_object* function, Type* varargs_type, size_t param_count); + // Let a builtin expression check whether types have been + // determined. + bool + determining_types(); + private: bool check_argument_type(int, const Type*, const Type*, source_location, bool); @@ -1286,10 +1291,10 @@ class Call_expression : public Expression tree tree_; // True if the last argument is a varargs argument (f(a...)). bool is_varargs_; - // True if the value is being discarded. - bool is_value_discarded_; // True if varargs have already been lowered. bool varargs_are_lowered_; + // True if types have been determined. + bool types_are_determined_; // True if the call is an argument to a defer statement. bool is_deferred_; }; -- 2.30.2