From 99bd094928fa0481562cf37cc14d0653ffe9ce0d Mon Sep 17 00:00:00 2001
From: Tomas Stupka <tomas.stupka@oracle.com>
Date: Fri, 9 Dec 2016 16:00:18 +0100
Subject: [PATCH] fixed some problems in NumericalFunctions.Sign: - wrong
 handling of logical values - wrong error msg for non-numeric arguments

---
 .../builtin/base/NumericalFunctions.java      |  4 +-
 .../truffle/r/test/ExpectedTestOutput.test    | 48 +++++++++++++++++++
 .../r/test/builtins/TestBuiltin_sign.java     | 16 +++++++
 3 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NumericalFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NumericalFunctions.java
index b955f97625..072c6f76b6 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NumericalFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NumericalFunctions.java
@@ -264,12 +264,12 @@ public class NumericalFunctions {
     public abstract static class Sign extends UnaryArithmeticBuiltinNode {
 
         public Sign() {
-            super(RType.Logical);
+            super(RType.Double, RError.Message.NON_NUMERIC_MATH, null);
         }
 
         @Override
         protected void createCasts(CastBuilder casts) {
-            casts.arg("x").defaultError(RError.Message.UNIMPLEMENTED_COMPLEX_FUN).mustBe(numericValue());
+            casts.arg("x").defaultError(RError.Message.NON_NUMERIC_MATH).mustBe(complexValue().not(), RError.Message.UNIMPLEMENTED_COMPLEX_FUN).mustBe(numericValue());
         }
 
         @Override
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 16c87fde48..7336777a88 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
@@ -45923,6 +45923,54 @@ integer(0)
 #argv <- list(29);sign(argv[[1]]);
 [1] 1
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign('1')
+Error in sign("1") : non-numeric argument to mathematical function
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign('1L')
+Error in sign("1L") : non-numeric argument to mathematical function
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign('a')
+Error in sign("a") : non-numeric argument to mathematical function
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(1i)
+Error in sign(0+1i) : unimplemented complex function
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(NA_real_)
+[1] NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(NULL)
+Error in sign(NULL) : non-numeric argument to mathematical function
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(NaN)
+[1] NaN
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(c(1, -1, FALSE))
+[1]  1 -1  0
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(c(1, -1, FALSE, 1i))
+Error in sign(c(1, -1, FALSE, 0+1i)) : unimplemented complex function
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(c(FALSE))
+[1] 0
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(c(FALSE, TRUE))
+[1] 0 1
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign10#
+#sign(list(c(1, -1, FALSE))[[1]])
+[1]  1 -1  0
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_sign.testsign2#
 #argv <- list(-29);sign(argv[[1]]);
 [1] -1
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sign.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sign.java
index 11d3565ddd..c116a18a64 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sign.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sign.java
@@ -61,4 +61,20 @@ public class TestBuiltin_sign extends TestBase {
     public void testsign9() {
         assertEval("argv <- list(numeric(0));sign(argv[[1]]);");
     }
+
+    @Test
+    public void testsign10() {
+        assertEval("sign(c(FALSE))");
+        assertEval("sign(c(FALSE, TRUE))");
+        assertEval("sign(c(1, -1, FALSE))");
+        assertEval("sign(list(c(1, -1, FALSE))[[1]])");
+        assertEval("sign(1i)");
+        assertEval("sign(c(1, -1, FALSE, 1i))");
+        assertEval("sign('a')");
+        assertEval("sign('1')");
+        assertEval("sign('1L')");
+        assertEval("sign(NULL)");
+        assertEval("sign(NaN)");
+        assertEval("sign(NA_real_)");
+    }
 }
-- 
GitLab