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