From 2bbd8be0d2792c9655868d8958cd73057c489cec Mon Sep 17 00:00:00 2001 From: bl4ze4447 Date: Sat, 4 Apr 2026 16:11:33 +0300 Subject: [PATCH] tdf#166673 Fix Space(-1) behaviour Change-Id: I3ea3a538dec449f752ca17122091b410221b7fe7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/203225 Tested-by: Jenkins Reviewed-by: Neil Roberts (cherry picked from commit c15d89a0a67122879d6597df590fbfbc130c0c4b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/204119 --- basic/qa/basic_coverage/test_space_method.bas | 27 ++++++++++++++----- basic/qa/vba_tests/space.vb | 17 +++++++++++- basic/source/runtime/methods.cxx | 13 ++++++++- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/basic/qa/basic_coverage/test_space_method.bas b/basic/qa/basic_coverage/test_space_method.bas index 6c44482de128..79d91969e9fa 100644 --- a/basic/qa/basic_coverage/test_space_method.bas +++ b/basic/qa/basic_coverage/test_space_method.bas @@ -7,11 +7,24 @@ Option Explicit -Function doUnitTest as String - ' SPACE - If ( Space(3) <> " " ) Then - doUnitTest = "FAIL" - Else - doUnitTest = "OK" - End If +Function doUnitTest As String + TestUtil.Testinit + verify_testSpace + doUnitTest = TestUtil.GetResult() End Function + +Sub verify_testSpace() + On Error Goto errorHandler + + TestUtil.AssertEqual(Space(3), " ", "Space(3)") + TestUtil.AssertEqual(Space(2), " ", "Space(2)") + TestUtil.AssertEqual(Space(0), "", "Space(0)") + + ' Negative values generate an empty string + TestUtil.AssertEqual(Space(-1), "", "Space(-1)") + TestUtil.AssertEqual(Space(-4), "", "Space(-4)") + + Exit Sub +errorHandler: + TestUtil.ReportErrorHandler("verify_testSpace", Err, Error$, Erl) +End Sub diff --git a/basic/qa/vba_tests/space.vb b/basic/qa/vba_tests/space.vb index 70d09c3ea74e..abd3f3ddc47d 100644 --- a/basic/qa/vba_tests/space.vb +++ b/basic/qa/vba_tests/space.vb @@ -18,9 +18,24 @@ End Function Sub verify_testSpace() On Error GoTo errorHandler - TestUtil.AssertEqual(Space(2), " ", "Space(2)") + TestUtil.AssertEqual(Space(3), " ", "Space(3)") + TestUtil.AssertEqual(Space(2), " ", "Space(2)") + TestUtil.AssertEqual(Space(0), "", "Space(0)") + + ' in VBA it must throw when used with negative values + TestUtil.AssertEqual(GetNegativeSpaceError(-1), 5, "GetNegativeSpaceError(-1)") + TestUtil.AssertEqual(GetNegativeSpaceError(-4), 5, "GetNegativeSpaceError(-4)") Exit Sub errorHandler: TestUtil.ReportErrorHandler("verify_testSpace", Err, Error$, Erl) End Sub + +Function GetNegativeSpaceError(negativeValue) As Long +On Error GoTo errorHandler + Space(negativeValue) + GetNegativeSpaceError = 0 + Exit Function +errorHandler: + GetNegativeSpaceError = Err +End Function diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx index 7f7f8623d5ac..e2f0a945623d 100644 --- a/basic/source/runtime/methods.cxx +++ b/basic/source/runtime/methods.cxx @@ -1299,7 +1299,18 @@ void SbRtl_Space(StarBASIC *, SbxArray & rPar, bool) return StarBASIC::Error(ERRCODE_BASIC_BAD_ARGUMENT); } - const sal_Int32 nCount = rPar.Get(1)->GetLong(); + sal_Int32 nCount = rPar.Get(1)->GetLong(); + + if (nCount < 0) + { + if (SbiRuntime::isVBAEnabled()) + { + return StarBASIC::Error(ERRCODE_BASIC_BAD_ARGUMENT); + } + + nCount = 0; + } + rPar.Get(0)->PutString(OUString::Concat(RepeatedUChar(' ', nCount))); }