From 7ebab0f72f6983fae0456b7a7555603abf8bb238 Mon Sep 17 00:00:00 2001
From: stepan <stepan.sindelar@oracle.com>
Date: Wed, 13 Dec 2017 14:06:54 +0100
Subject: [PATCH] Fix: rep ignores non-existing varargs

---
 .../src/com/oracle/truffle/r/nodes/builtin/base/Repeat.java  | 4 +++-
 .../src/com/oracle/truffle/r/test/ExpectedTestOutput.test    | 5 +++++
 .../com/oracle/truffle/r/test/builtins/TestBuiltin_rep.java  | 2 ++
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Repeat.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Repeat.java
index 83f22bc1cd..2f2187d7e1 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Repeat.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Repeat.java
@@ -115,7 +115,9 @@ public abstract class Repeat extends RBuiltinNode.Arg2 {
                         RError.Message.FIRST_ELEMENT_USED, "each").findFirst(1, RError.Message.FIRST_ELEMENT_USED,
                                         "each").replaceNA(1).mustBe(gte(0));
 
-        ArgumentsSignature signature = ArgumentsSignature.get("times", "length.out", "each");
+        // "..." in signature ensures that the matcher will not report additional arguments which
+        // are also ignored by GNUR
+        ArgumentsSignature signature = ArgumentsSignature.get("times", "length.out", "each", "...");
         ARG_IDX_TIMES = 0;
         ARG_IDX_LENGHT_OUT = 1;
         ARG_IDX_EACH = 2;
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index e523da3a81..7ef462cd65 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -51308,6 +51308,11 @@ attr(,"useBytes")
 #argv <- structure(list(x = c('A', 'B', 'C'), m = structure(c(1L,     -1L, 1L), match.length = c(1L, -1L, 1L), useBytes = TRUE),     value = c('A', 'C')), .Names = c('x', 'm', 'value'));do.call('regmatches<-', argv)
 [1] "A" "B" "C"
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_rep.testRep#
+#rep(' ', 20L, collapse = ' ')
+ [1] " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
+[20] " "
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_rep.testRep#
 #rep(x<-42)
 [1] 42
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_rep.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_rep.java
index 0d31bcabae..01f86871e8 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_rep.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_rep.java
@@ -239,5 +239,7 @@ public class TestBuiltin_rep extends TestBase {
 
         assertEval("{ rep(paste0('hello', 1:10), 10) }");
         assertEval("{ rep(paste0('hello', 1:10), 1:10) }");
+
+        assertEval("rep(' ', 20L, collapse = ' ')");
     }
 }
-- 
GitLab