diff options
author | Andreas Heinisch <andreas.heinisch@yahoo.de> | 2021-04-04 19:34:47 +0200 |
---|---|---|
committer | Andreas Heinisch <andreas.heinisch@yahoo.de> | 2021-04-05 16:38:44 +0200 |
commit | a9fcd2cf2bfb42693787e8c4197e5988e155e235 (patch) | |
tree | 3669cba466d1aacab10ff774eec5b7a6d9965701 /basic | |
parent | 86764b0eb065f3e076462c8c25ebc15a3a4ff33d (diff) |
tdf#141201 - Round MOD literals to Integer values
(regression from commit I8dbfdf4bb2eceac0b5afbddd3f35e1dcde2db68b
"tdf#84435: Mod operator does not deal with decimals as described in help").
Change-Id: I74b231d3814148579a3be0a92b7602fa4387281f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113571
Tested-by: Jenkins
Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de>
Diffstat (limited to 'basic')
-rw-r--r-- | basic/qa/basic_coverage/test_mod_operator.vb | 25 | ||||
-rw-r--r-- | basic/source/comp/exprnode.cxx | 13 |
2 files changed, 34 insertions, 4 deletions
diff --git a/basic/qa/basic_coverage/test_mod_operator.vb b/basic/qa/basic_coverage/test_mod_operator.vb new file mode 100644 index 000000000000..006d97558052 --- /dev/null +++ b/basic/qa/basic_coverage/test_mod_operator.vb @@ -0,0 +1,25 @@ +' +' This file is part of the LibreOffice project. +' +' This Source Code Form is subject to the terms of the Mozilla Public +' License, v. 2.0. If a copy of the MPL was not distributed with this +' file, You can obtain one at http://mozilla.org/MPL/2.0/. +' + +Function doUnitTest as Integer + + doUnitTest = 0 + + Dim a As Double, b as Double + a = 16.4 + b = 5.9 + + ' tdf#141201 - MOD operands are rounded to Integer values before the operation is performed + if (a MOD b <> 4) Then Exit Function + if (16.4 MOD 5.9 <> 4) Then Exit Function + if (15.9 MOD 6.4 <> 4) Then Exit Function + if (2147483647.4 MOD 4 <> 3) Then Exit Function + + doUnitTest = 1 + +End Function diff --git a/basic/source/comp/exprnode.cxx b/basic/source/comp/exprnode.cxx index 02f8801f1aea..1771da0017f3 100644 --- a/basic/source/comp/exprnode.cxx +++ b/basic/source/comp/exprnode.cxx @@ -27,6 +27,8 @@ #include <basic/sberrors.hxx> +#include <rtl/math.hxx> + SbiExprNode::SbiExprNode( std::unique_ptr<SbiExprNode> l, SbiToken t, std::unique_ptr<SbiExprNode> r ) : pLeft(std::move(l)), pRight(std::move(r)), @@ -294,8 +296,13 @@ void SbiExprNode::FoldConstantsBinaryNode(SbiParser* pParser) { double nl = pLeft->nVal; double nr = pRight->nVal; + // tdf#141201 - round MOD literals to Integer values + if (eTok == MOD) + { + nl = rtl::math::round(nl); + nr = rtl::math::round(nr); + } tools::Long ll = 0, lr = 0; - tools::Long llMod = 0, lrMod = 0; if( ( eTok >= AND && eTok <= IMP ) || eTok == IDIV || eTok == MOD ) { @@ -322,8 +329,6 @@ void SbiExprNode::FoldConstantsBinaryNode(SbiParser* pParser) nr = SbxMINLNG; } ll = static_cast<tools::Long>(nl); lr = static_cast<tools::Long>(nr); - llMod = static_cast<tools::Long>(nl); - lrMod = static_cast<tools::Long>(nr); if( bErr ) { pParser->Error( ERRCODE_BASIC_MATH_OVERFLOW ); @@ -388,7 +393,7 @@ void SbiExprNode::FoldConstantsBinaryNode(SbiParser* pParser) { pParser->Error( ERRCODE_BASIC_ZERODIV ); nVal = HUGE_VAL; bError = true; - } else nVal = llMod - lrMod * (llMod/lrMod); + } else nVal = ll - lr * (ll/lr); eType = SbxLONG; break; case AND: nVal = static_cast<double>( ll & lr ); eType = SbxLONG; break; |