Commit 426bcc95 by Ian Lance Taylor

re PR go/61255 (gccgo: spurious "error: argument 2 has incompatible type" [GoSmith])

	PR go/61255
compiler: Copied variadic calls should copy lowering state of arguments.

From-SVN: r218764
parent b07891da
...@@ -6552,13 +6552,7 @@ class Builtin_call_expression : public Call_expression ...@@ -6552,13 +6552,7 @@ class Builtin_call_expression : public Call_expression
do_check_types(Gogo*); do_check_types(Gogo*);
Expression* Expression*
do_copy() do_copy();
{
return new Builtin_call_expression(this->gogo_, this->fn()->copy(),
this->args()->copy(),
this->is_varargs(),
this->location());
}
Bexpression* Bexpression*
do_get_backend(Translate_context*); do_get_backend(Translate_context*);
...@@ -7986,6 +7980,20 @@ Builtin_call_expression::do_check_types(Gogo*) ...@@ -7986,6 +7980,20 @@ Builtin_call_expression::do_check_types(Gogo*)
} }
} }
Expression*
Builtin_call_expression::do_copy()
{
Call_expression* bce =
new Builtin_call_expression(this->gogo_, this->fn()->copy(),
this->args()->copy(),
this->is_varargs(),
this->location());
if (this->varargs_are_lowered())
bce->set_varargs_are_lowered();
return bce;
}
// Return the backend representation for a builtin function. // Return the backend representation for a builtin function.
Bexpression* Bexpression*
...@@ -9126,6 +9134,21 @@ Call_expression::do_check_types(Gogo*) ...@@ -9126,6 +9134,21 @@ Call_expression::do_check_types(Gogo*)
} }
} }
Expression*
Call_expression::do_copy()
{
Call_expression* call =
Expression::make_call(this->fn_->copy(),
(this->args_ == NULL
? NULL
: this->args_->copy()),
this->is_varargs_, this->location());
if (this->varargs_are_lowered_)
call->set_varargs_are_lowered();
return call;
}
// Return whether we have to use a temporary variable to ensure that // Return whether we have to use a temporary variable to ensure that
// we evaluate this call expression in order. If the call returns no // we evaluate this call expression in order. If the call returns no
// results then it will inevitably be executed last. // results then it will inevitably be executed last.
......
...@@ -1683,6 +1683,11 @@ class Call_expression : public Expression ...@@ -1683,6 +1683,11 @@ class Call_expression : public Expression
is_varargs() const is_varargs() const
{ return this->is_varargs_; } { return this->is_varargs_; }
// Return whether varargs have already been lowered.
bool
varargs_are_lowered() const
{ return this->varargs_are_lowered_; }
// Note that varargs have already been lowered. // Note that varargs have already been lowered.
void void
set_varargs_are_lowered() set_varargs_are_lowered()
...@@ -1738,14 +1743,7 @@ class Call_expression : public Expression ...@@ -1738,14 +1743,7 @@ class Call_expression : public Expression
do_check_types(Gogo*); do_check_types(Gogo*);
Expression* Expression*
do_copy() do_copy();
{
return Expression::make_call(this->fn_->copy(),
(this->args_ == NULL
? NULL
: this->args_->copy()),
this->is_varargs_, this->location());
}
bool bool
do_must_eval_in_order() const; do_must_eval_in_order() const;
......
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