fpc/tests/tbs/tb0653.pp
yury 4682ac269d * Further improvement for r40180:
An uninitialized function Result of a managed type needs special handling.
    When passing it as a var parameter a warning need to be emitted, since a user
    may expect Result to be empty (nil) by default as it happens with local vars
    of a managed type. But this is not true for Result and may lead to serious issues.

    The only exception is SetLength(Result, ?) for a string Result. A user always
    expects undefined contents of the string after calling SetLength(). In such
    case a hint need to be emitted.
+ Tests for this.

git-svn-id: trunk@40216 -
2018-11-04 15:37:52 +00:00

65 lines
1.1 KiB
ObjectPascal

{ %norun }
{ %opt=-Sewn -vwn -O- }
{
Test for correct emitting of warnings/hints for uninitialized variables of management types
See also tbf/tb0258.pp
}
// Only hints about uninitialized managed variables must be issued for this code
{$mode objfpc}
type
TLongArray = array of longint;
procedure p;
var
a : TLongArray;
s: ansistring;
begin
setlength(a,100); // hint for local var
setlength(s,100); // hint for local var
a[1]:=1;
writeln(a[1]);
s[1]:='a';
writeln(s[1]);
end;
procedure svar(var s: ansistring; len: longint);
begin
setlength(s,len);
end;
procedure avar(var a: TLongArray; len: longint);
begin
setlength(a,len);
end;
procedure p2;
var
a : TLongArray;
s: ansistring;
begin
avar(a,100); // hint for local var
svar(s,100); // hint for local var
a[1]:=1;
writeln(a[1]);
s[1]:='a';
writeln(s[1]);
end;
function f2: ansistring;
begin
// Hint for the ansistring Result, since all contents of the Result
// after calling SetLength() is expected to be undefined.
setlength(Result,1);
Result[1]:='a';
end;
begin
p;
p2;
f2;
end.