From ec935d559ef9dc3993bd8c08ebec1d9467c3bcfa Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Tue, 4 Apr 2017 18:55:05 +0200
Subject: [PATCH] Fix: Invalid argument matching for cbind2.

---
 .../com/oracle/truffle/r/nodes/builtin/base/Bind.java |  7 ++++++-
 .../com/oracle/truffle/r/test/ExpectedTestOutput.test | 11 +++++++++++
 .../truffle/r/test/builtins/TestBuiltin_cbind.java    |  6 ++++++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java
index 4f6dba39bc..acc4e16ed1 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java
@@ -585,7 +585,12 @@ public abstract class Bind extends RBaseNode {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
                     bind = insert(BindNodeGen.create(type));
                 }
-                return bind.execute(frame, deparseLevel, args.getArguments(), (RArgsValuesAndNames) RArguments.getArgument(frame, 0), precedence(args.getArguments()));
+                Object firstArg = RArguments.getArgument(frame, 0);
+                RArgsValuesAndNames promisedArgs = args;
+                if (firstArg instanceof RArgsValuesAndNames) {
+                    promisedArgs = (RArgsValuesAndNames) firstArg;
+                }
+                return bind.execute(frame, deparseLevel, args.getArguments(), promisedArgs, precedence(args.getArguments()));
             }
         }
 
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 322f7f2982..4a91d4b30c 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
@@ -13334,6 +13334,17 @@ structure(integer(0), .Dim = c(0L, 3L), .Dimnames = list(NULL,
 5th break 1201 1466
 6th break 1467 1600
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_cbind.testcbind6#
+#cbind2(3, 4)
+     [,1] [,2]
+[1,]    3    4
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_cbind.testcbind6#
+#cbind2(matrix(1:10, 2, 2), matrix(11:20, 2, 2))
+     [,1] [,2] [,3] [,4]
+[1,]    1    3   11   13
+[2,]    2    4   12   14
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_ceiling.testCeiling#
 #{ ceiling(c(0.2,-3.4,NA,0/0,1/0)) }
 [1]   1  -3  NA NaN Inf
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cbind.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cbind.java
index cccb74db2a..d675297dfd 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cbind.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cbind.java
@@ -49,6 +49,12 @@ public class TestBuiltin_cbind extends TestBase {
                         "do.call('cbind', argv)");
     }
 
+    @Test
+    public void testcbind6() {
+        assertEval("cbind2(3, 4)");
+        assertEval("cbind2(matrix(1:10, 2, 2), matrix(11:20, 2, 2))");
+    }
+
     @Test
     public void testCbind() {
         assertEval("{ cbind() }");
-- 
GitLab