diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-03-03 02:08:28 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-03-03 02:08:28 +0000 |
commit | 20532210cd1a8e0b3b2d6ec1bcaa8c0e928af5ca (patch) | |
tree | 7d49cdcbb57df867e17ec4561d2c016e94fd556c /gcc | |
parent | 4bb9014024c51476b9466e50287c37f917cf0736 (diff) | |
download | gcc-20532210cd1a8e0b3b2d6ec1bcaa8c0e928af5ca.zip gcc-20532210cd1a8e0b3b2d6ec1bcaa8c0e928af5ca.tar.gz gcc-20532210cd1a8e0b3b2d6ec1bcaa8c0e928af5ca.tar.bz2 |
Determine call types even if first call result is not used.
From-SVN: r170637
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 24 | ||||
-rw-r--r-- | 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 a45e7ac..28b7ee6 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 c050a4a..b6fc9c0 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_; }; |