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 b955f976259a0570876ef29af61ae0c96e28c07f..072c6f76b689b375b95430309b4f2bc7bb0a64d0 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 16c87fde481a0f8f4542f4f9f6f1e188b815b816..7336777a881f7bc6696caf0ac122b716143cccde 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 11d3565ddd47e8c2ea4c83f23dc23b2a5a512354..c116a18a6446c801c66d22aa5853e87a88a00f93 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_)"); + } }