basic/qa/basic_coverage/test_optional_paramters_basic.bas      |   15 
++++++++++
 basic/qa/basic_coverage/test_optional_paramters_compatible.bas |   15 
++++++++++
 basic/source/runtime/runtime.cxx                               |    8 +++++
 3 files changed, 38 insertions(+)

New commits:
commit bdfcad586d7b1d4d26bcba50058af7fcb279558d
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Thu Oct 13 14:20:00 2022 +0200
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Fri Oct 14 10:06:38 2022 +0200

    tdf#151503 - Do not evaluate a missing optional variable to a boolean
    
    Change-Id: I671f857344f91de63612eabcbbdb2cab9b94cc0d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141296
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/basic/qa/basic_coverage/test_optional_paramters_basic.bas 
b/basic/qa/basic_coverage/test_optional_paramters_basic.bas
index a684fc256054..40475664fb7a 100644
--- a/basic/qa/basic_coverage/test_optional_paramters_basic.bas
+++ b/basic/qa/basic_coverage/test_optional_paramters_basic.bas
@@ -125,6 +125,12 @@ Sub verify_testOptionalsBasic()
     ' - Actual  : 448 (Actual value of the variable)
     TestUtil.AssertEqual(TestObjectError, 449, "TestObjectError")
 
+    ' tdf#151503 - error handling of missing optional parameters (boolean 
operations)
+    ' Without the fix in place, this test would have failed with:
+    ' - Expected: 449 (ERRCODE_BASIC_NOT_OPTIONAL - Argument not optional)
+    ' - Actual  : 0 (No error code since a missing parameter evaluates to true)
+    TestUtil.AssertEqual(TestBooleanOperations, 449, "TestBooleanOperations")
+
     Exit Sub
 errorHandler:
     TestUtil.ReportErrorHandler("verify_testOptionalsBasic", Err, Error$, Erl)
@@ -229,6 +235,15 @@ errorHandler:
     TestObjectError = Err()
 End Function
 
+Function TestBooleanOperations(Optional optBool As Boolean)
+On Error GoTo errorHandler
+    if optBool then
+        TestBooleanOperations = 0
+    end if
+errorHandler:
+    TestBooleanOperations = Err()
+End Function
+
 Function CollectionSum(C)
     Dim idx As Integer
     CollectionSum = 0
diff --git a/basic/qa/basic_coverage/test_optional_paramters_compatible.bas 
b/basic/qa/basic_coverage/test_optional_paramters_compatible.bas
index 56b314288e7a..fc3ca385951c 100644
--- a/basic/qa/basic_coverage/test_optional_paramters_compatible.bas
+++ b/basic/qa/basic_coverage/test_optional_paramters_compatible.bas
@@ -127,6 +127,12 @@ Sub verify_testOptionalsCompatible()
     ' - Actual  : 448 (Actual value of the variable)
     TestUtil.AssertEqual(TestObjectError, 449, "TestObjectError")
 
+    ' tdf#151503 - error handling of missing optional parameters (boolean 
operations)
+    ' Without the fix in place, this test would have failed with:
+    ' - Expected: 449 (ERRCODE_BASIC_NOT_OPTIONAL - Argument not optional)
+    ' - Actual  : 0 (No error code since a missing parameter evaluates to true)
+    TestUtil.AssertEqual(TestBooleanOperations, 449, "TestBooleanOperations")
+
     Exit Sub
 errorHandler:
     TestUtil.ReportErrorHandler("verify_testOptionalsCompatible", Err, Error$, 
Erl)
@@ -231,6 +237,15 @@ errorHandler:
     TestObjectError = Err()
 End Function
 
+Function TestBooleanOperations(Optional optBool As Boolean)
+On Error GoTo errorHandler
+    if optBool then
+        TestBooleanOperations = 0
+    end if
+errorHandler:
+    TestBooleanOperations = Err()
+End Function
+
 Function CollectionSum(C)
     Dim idx As Integer
     CollectionSum = 0
diff --git a/basic/source/runtime/runtime.cxx b/basic/source/runtime/runtime.cxx
index 5ff568140c75..4f77fecb56e2 100644
--- a/basic/source/runtime/runtime.cxx
+++ b/basic/source/runtime/runtime.cxx
@@ -3022,6 +3022,14 @@ bool SbiRuntime::EvaluateTopOfStackAsBool()
     {
         return false;
     }
+
+    // tdf#151503 - do not evaluate a missing optional variable to a boolean
+    if (tos->GetType() == SbxERROR && IsMissing(tos.get(), 1))
+    {
+        Error(ERRCODE_BASIC_NOT_OPTIONAL);
+        return false;
+    }
+
     if ( tos->IsObject() )
     {
         //GetBool applied to an Object attempts to dereference and evaluate

Reply via email to