Bug 153142

Summary: IsMissing needs a note about use in conditions (no boolean short-circuit evaluation in Basic)
Product: LibreOffice Reporter: Mike Kaganski <mikekaganski>
Component: DocumentationAssignee: Not Assigned <libreoffice-bugs>
Status: NEW ---    
Severity: normal CC: andreas.heinisch, himajin100000, olivier.hallot, sokol
Priority: medium    
Version: unspecified   
Hardware: All   
OS: All   
See Also: https://bugs.documentfoundation.org/show_bug.cgi?id=149959
https://bugs.documentfoundation.org/show_bug.cgi?id=151503
Whiteboard:
Crash report or crash signature: Regression By:

Description Mike Kaganski 2023-01-21 16:00:30 UTC
There is a recurring programming error in Basic, when IsMissing is combined by a logical operator with a use of potentially absent variable, as in

> If Not IsAbsent(foo) And foo > bar Then ...

See e.g. code shown on the screenshot at https://ask.libreoffice.org/t/messagebox-weird-response/86789

We need a comment on IsMissing help page, discussing that this must be

> If Not IsAbsent(foo) Then If foo > bar Then ...
Comment 1 Andreas Heinisch 2023-01-22 08:51:31 UTC
Imho, the question is, should Basic support short circuting in boolean expressions or not?
Comment 2 Mike Kaganski 2023-03-18 21:53:12 UTC
(In reply to Andreas Heinisch from comment #1)

I would like to see it in Basic, but this would be an incompatible change, breaking any possible existing code that relies on side effects of unconditional evaluation of all expressions.
Comment 3 Andreas Heinisch 2023-03-19 08:14:58 UTC
How about introducing a new flag like OPTION EXPLICIT? So you have legacy code would be unaffected.
Comment 4 Mike Kaganski 2023-03-19 08:23:10 UTC
(In reply to Andreas Heinisch from comment #3)

This is exactly what is proposed in https://ask.libreoffice.org/t/if-conditions-continue-to-be-evaluated-even-after-the-if-has-been-satisfied/89385/. I am not opposed much, even though it feels like "do it just because we can" ;)
Comment 5 Andreas Heinisch 2023-03-19 09:08:33 UTC
Yep, you are correct. The huge drawback would be that code written with this flag would not work in older versions.
Comment 6 Vladimir Sokolinskiy 2023-03-19 14:11:32 UTC
I also believe that the absence of a short circuit must be written in the documentation. May be here: https://help.libreoffice.org/7.6/en-US/text/sbasic/shared/00000002.html?DbPAR=BASIC 
?
Comment 7 Vladimir Sokolinskiy 2023-03-19 14:18:43 UTC
There are many constructs of this type (except IsMissing), for example:

  If IsArray(arr) And UBound(arr) >= 1 Then
Comment 8 Vladimir Sokolinskiy 2023-03-19 14:29:51 UTC
Here is how Microsoft writes about it in the VBA documentation :)

https://learn.microsoft.com/en-us/openspecs/microsoft_general_purpose_programming_languages/ms-vbal/2d70780d-6e99-47d6-9759-2b3a46b8e862
Comment 9 Mike Kaganski 2023-03-19 16:11:34 UTC
Ah - thanks a lot! Indeed, the operators in Basic combine logical and bit operators - and so, before both sides are evaluated, it's impossible to resolve the result of expression. Hence, the short-circuiting is even impossible generally.
Comment 10 Jordi 2023-07-01 19:37:04 UTC
Has this change to disable short-circuiting already been implemented? Because this bug report still says NEW, but when I moved my code from 7.0.5.x to 7.4.7.2 (stable release) it failed in a couple of places.

PS: I was scratching my head why my code was failing all of a sudden and went looking into the release notes but google couldn't find anything there. Should it be there? Seems like a major change.