Commit 20532210 by Ian Lance Taylor

Determine call types even if first call result is not used.

From-SVN: r170637
parent 4bb90140
......@@ -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,7 +9025,6 @@ 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();
}
......
......@@ -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_;
};
......
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