fpc/tests/test/tmacbool.pp
Jonas Maebe 03302dc7c4 * fixed support for macpas & and | operators: they only work on booleans
now, and always perform short circuit boolean evaluation (also in {$b+})

git-svn-id: trunk@3745 -
2006-05-30 13:02:36 +00:00

190 lines
3.3 KiB
ObjectPascal

program macbool;
{$mode macpas}
{ checks boolean evaluation in macpas mode }
var
ftruecalled, ffalsecalled: boolean;
function ftrue: boolean;
begin
ftruecalled := true;
ftrue := true;
end;
function ffalse: boolean;
begin
ffalsecalled := true;
ffalse := false;
end;
begin
{ OR and |, short circuit }
{$b-}
ffalsecalled := false;
ftruecalled := false;
if (ftrue or ffalse) then
begin
if not(ftruecalled) then
halt(1);
if ffalsecalled then
halt(2);
end
else
halt(128);
ffalsecalled := false;
ftruecalled := false;
if not(ffalse or ftrue) then
halt(3);
if not(ffalsecalled) then
halt(4);
if not(ftruecalled) then
halt(5);
ffalsecalled := false;
ftruecalled := false;
if (ftrue | ffalse) then
begin
if not(ftruecalled) then
halt(6);
if ffalsecalled then
halt(7);
end
else
halt(129);
ffalsecalled := false;
ftruecalled := false;
if not(ffalse | ftrue) then
halt(8);
if not(ffalsecalled) then
halt(9);
if not(ftruecalled) then
halt(10);
{ OR and |, full evaluation }
{$b+}
ffalsecalled := false;
ftruecalled := false;
if (ftrue or ffalse) then
begin
if not(ftruecalled) then
halt(11);
if not(ffalsecalled) then
halt(12);
end
else
halt(130);
ffalsecalled := false;
ftruecalled := false;
if not(ffalse or ftrue) then
halt(13);
if not(ffalsecalled) then
halt(14);
if not(ftruecalled) then
halt(15);
ffalsecalled := false;
ftruecalled := false;
if (ftrue | ffalse) then
begin
if not(ftruecalled) then
halt(16);
if ffalsecalled then
halt(17);
end
else
halt(131);
ffalsecalled := false;
ftruecalled := false;
if not(ffalse | ftrue) then
halt(18);
if not(ffalsecalled) then
halt(19);
if not(ftruecalled) then
halt(20);
{ AND and &, short circuit }
{$b-}
ffalsecalled := false;
ftruecalled := false;
if (ftrue and ffalse) then
halt(21);
if not(ftruecalled) then
halt(211);
if not(ffalsecalled) then
halt(22);
ffalsecalled := false;
ftruecalled := false;
if (ffalse and ftrue) then
halt(23);
if not(ffalsecalled) then
halt(24);
if (ftruecalled) then
halt(25);
ffalsecalled := false;
ftruecalled := false;
if (ftrue & ffalse) then
halt(206);
if not(ftruecalled) then
halt(26);
if not(ffalsecalled) then
halt(27);
ffalsecalled := false;
ftruecalled := false;
if (ffalse & ftrue) then
halt(28);
if not(ffalsecalled) then
halt(29);
if (ftruecalled) then
halt(30);
{ AND and &, full evaluation }
{$b+}
ffalsecalled := false;
ftruecalled := false;
if (ftrue and ffalse) then
halt(31);
if not(ftruecalled) then
halt(111);
if not(ffalsecalled) then
halt(32);
ffalsecalled := false;
ftruecalled := false;
if (ffalse and ftrue) then
halt(33);
if not(ffalsecalled) then
halt(34);
if not(ftruecalled) then
halt(35);
ffalsecalled := false;
ftruecalled := false;
if (ftrue & ffalse) then
halt(133);
if not(ftruecalled) then
halt(36);
if not(ffalsecalled) then
halt(37);
ffalsecalled := false;
ftruecalled := false;
if (ffalse & ftrue) then
halt(38);
if not(ffalsecalled) then
halt(39);
if (ftruecalled) then
halt(40);
end.