[fpc-pascal] precedence "is" and "and"

Michael Van Canneyt michael at freepascal.org
Sun Dec 9 01:01:08 CET 2018

On Sat, 8 Dec 2018, Mattias Gaertner via fpc-pascal wrote:

> On Sat, 8 Dec 2018 22:03:11 +0100 (CET)
> Michael Van Canneyt <michael at freepascal.org> wrote:
>> [...]
>> In delphi, AS is second level, and 'is' is fourth level.
>> http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Expressions_(Delphi)
>> If FPC does this differently, then I think this is an incompatibility.
> What has "as" to do with this thread?

Perhaps FPC treats "is" and "as" on the same level, it would explain the
error ?

>> >> logical (boolean) vs bitwise AND difference? 
>> >
>> > I don't see where the bitwise should be involved here. There is no
>> > integer.
>> > The docs do not mention a different precedence lvl for
>> > logical/bitwise "and". 
>> Because to the best of my knowledge, here isn't any difference in
>> precedence, so there is nothing to explain.
> Yes, that's my point. Even if bitwise "and" would play a role here, the
> precedence would still be the same.

Agreed. It was Marco who brought this up ?

>> > It does not explain difference between "and" and "or". 
>> Of course it does. See section on Logical operators
>> https://www.freepascal.org/docs-html/current/ref/refsu46.html
>> or boolean operators
>> https://www.freepascal.org/docs-html/current/ref/refsu47.html
> I looked at it, but I still don't understand.
> Perhaps you can explain the examples I gave?
> // compiles, but should fail:
> if o is TComponent and b then ; 
> if o is TComponent or b then ;

My hypothesis is that FPC treats 'is' and 'as' on level 2
(contrary to documentation). This is consistent with what you observe.

If 'is' is second level (i.e. the same as "as") then that would explain why
it compiles, because the 'o is TComponent' will be evaluated first:

in the first line because evaluation happens from left to right,
in the second line because 'is' takes precedence over 'or'.

> // compiles in fpc, but not in Delphi:
> if b or o is TComponent then ;

Delphi is consistent with 'is' being on a lover level: 
"is" is lower level, so b or O is treated first.

Again, FPC's behaviour is consistent with treating 'is'  on the same level as
'as': because 'is' takes precedence over 'or', you get no error.

> // does not compile, correct
> if b and o is TComponent then ;

Indeed. (b and O) is evaluated first (left to right)

All is consistent with "is" and "as" being on the same level.

This is not how delphi does it.

So we adapt the documentation, or make the compiler delphi compatible.

Given that this has been in the compiler for years, I guess most people use
brackets (I know I do)


More information about the fpc-pascal mailing list