re PR go/61255 (gccgo: spurious "error: argument 2 has incompatible type" [GoSmith])
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 15 Dec 2014 20:20:22 +0000 (20:20 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 15 Dec 2014 20:20:22 +0000 (20:20 +0000)
PR go/61255
compiler: Copied variadic calls should copy lowering state of arguments.

From-SVN: r218764

gcc/go/gofrontend/expressions.cc
gcc/go/gofrontend/expressions.h

index 90cea3943d1ac51bbbc8bc685936bd281c786d5d..f6d43811e161261b0becc59100614a93b359054a 100644 (file)
@@ -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.
index 398709ee386e90176462dd72eaf924b0537ff048..cbac5044484a2d7f9ccb4f3d68f8bc9c48e943ed 100644 (file)
@@ -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;