fpc/tests/test/tlenzero.pp
Rika Ichinose d63b6294b5 Compile “length(string or array) = 0” as “pointer(string or array) = nil” without further check, unless really required.
Also handle length <> 0, > 0, < 0, >= 0, <= 0, assuming lengths are never negative.
2024-10-16 16:53:59 +03:00

79 lines
2.5 KiB
ObjectPascal

{ %opt=-O2 }
{$mode objfpc} {$longstrings on}
var
somethingFailed: boolean = false;
procedure Expect(got, expected: boolean; const what: string);
begin
if got <> expected then
begin
writeln(what, ' is ', got, ', expected ', expected, '.');
somethingFailed := true;
end;
end;
var
s: string;
sideeffectOk: boolean;
function GetS: string; noinline;
begin
result := 'a';
sideeffectOk := true;
end;
{$ifdef windows}
function SysAllocStringLen(psz: pointer; len: dword): pointer; stdcall; external 'oleaut32.dll' name 'SysAllocStringLen';
var
ws: widestring;
{$endif}
begin
s := ''; if random(0) = 1 then s := 'a';
Expect(length(s) > 0, false, 'length('''') > 0');
Expect(length(s) <= 0, true, 'length('''') <= 0');
Expect(length(s) = 0, true, 'length('''') = 0');
Expect(length(s) <> 0, false, 'length('''') <> 0');
Expect(0 < length(s), false, '0 < length('''')');
Expect(0 >= length(s), true, '0 >= length('''')');
Expect(0 = length(s), true, '0 = length('''')');
Expect(0 <> length(s), false, '0 <> length('''')');
if random(0) = 0 then s := 'a';
Expect(length(s) > 0, true, 'length(''a'') > 0');
Expect(length(s) <= 0, false, 'length(''a'') <= 0');
Expect(length(s) = 0, false, 'length(''a'') = 0');
Expect(length(s) <> 0, true, 'length(''a'') <> 0');
Expect(0 < length(s), true, '0 < length(''a'')');
Expect(0 >= length(s), false, '0 >= length(''a'')');
Expect(0 = length(s), false, '0 = length(''a'')');
Expect(0 <> length(s), true, '0 <> length(''a'')');
Expect(length(s) >= 0, true, 'length(''a'') >= 0');
Expect(0 <= length(s), true, '0 <= length(''a'')');
Expect(length(s) < 0, false, 'length(''a'') < 0');
Expect(0 > length(s), false, '0 > length(''a'')');
Expect(IsConstValue(length(s) > 0), false, 'IsConstValue(length(''a'') > 0)');
Expect(IsConstValue(length(s) >= 0), true, 'IsConstValue(length(''a'') >= 0)');
Expect(IsConstValue(length(s) < 0), true, 'IsConstValue(length(''a'') < 0)');
Expect(IsConstValue(0 < length(s)), false, 'IsConstValue(0 < length(''a''))');
Expect(IsConstValue(0 <= length(s)), true, 'IsConstValue(0 <= length(''a''))');
Expect(IsConstValue(0 > length(s)), true, 'IsConstValue(0 > length(''a''))');
sideeffectOk := false;
if (Length(GetS) < 0) or not sideeffectOk then
begin
writeln('Length(GetS) is either < 0 or, more likely, ignored the side effect of GetS.');
somethingFailed := true;
end;
{$ifdef windows}
ws := '';
pointer(ws) := SysAllocStringLen(nil, 0);
Expect(length(ws) = 0, true, 'length(allocated but empty COM widestring) = 0');
{$endif}
if somethingFailed then halt(1);
end.