From 426bcc95cbaed399329579feb14f776d4c2e4525 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 15 Dec 2014 20:20:22 +0000 Subject: [PATCH] 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 --- gcc/go/gofrontend/expressions.cc | 37 ++++++++++++++++++++++++++------ gcc/go/gofrontend/expressions.h | 14 ++++++------ 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 90cea3943d1..f6d43811e16 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -6552,13 +6552,7 @@ class Builtin_call_expression : public Call_expression do_check_types(Gogo*); Expression* - do_copy() - { - return new Builtin_call_expression(this->gogo_, this->fn()->copy(), - this->args()->copy(), - this->is_varargs(), - this->location()); - } + do_copy(); Bexpression* do_get_backend(Translate_context*); @@ -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. Bexpression* @@ -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 // we evaluate this call expression in order. If the call returns no // results then it will inevitably be executed last. diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h index 398709ee386..cbac5044484 100644 --- a/gcc/go/gofrontend/expressions.h +++ b/gcc/go/gofrontend/expressions.h @@ -1683,6 +1683,11 @@ class Call_expression : public Expression is_varargs() const { 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. void set_varargs_are_lowered() @@ -1738,14 +1743,7 @@ class Call_expression : public Expression do_check_types(Gogo*); Expression* - do_copy() - { - return Expression::make_call(this->fn_->copy(), - (this->args_ == NULL - ? NULL - : this->args_->copy()), - this->is_varargs_, this->location()); - } + do_copy(); bool do_must_eval_in_order() const; -- 2.30.2