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();
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;
}
}
+// 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
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.
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)
{ }
void
do_discarding_value()
- { this->is_value_discarded_ = true; }
+ { }
virtual Type*
do_type();
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);
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_;
};