* an objectdef also requires an init for its members if a member (or a member of one of the parents) has a complex initialization

+ added test
This commit is contained in:
Sven/Sarah Barth 2022-08-14 15:42:32 +02:00
parent be4a317cb4
commit 27c1bb3bea
2 changed files with 55 additions and 1 deletions

View File

@ -8467,7 +8467,8 @@ implementation
function tobjectdef.members_need_inittable : boolean;
begin
members_need_inittable:=tObjectSymtable(symtable).needs_init_final;
members_need_inittable:=tObjectSymtable(symtable).needs_init_final or
has_non_trivial_init_child(true);
end;

53
tests/tbs/tb0695.pp Normal file
View File

@ -0,0 +1,53 @@
program tb0695;
{$APPTYPE CONSOLE}
{$IFDEF FPC}
{$MODE OBJFPC}
{$MODESWITCH ADVANCEDRECORDS}
{$ENDIF}
type
TState = record
strict private
FState: LongWord;
class operator Initialize({$IFDEF FPC}var{$ELSE}out{$ENDIF} Instance: TState);
public
property State: LongWord read FState;
end;
var
initdone: Boolean = False;
class operator TState.Initialize({$IFDEF FPC}var{$ELSE}out{$ENDIF} Instance: TState);
begin
Writeln('TState now being initialised');
initdone := True;
Instance.FState := 1;
end;
type
TSys0 = class(TObject)
FItem: TState;
constructor Create;
end;
TSys = class(TSys0)
//FItem2: TState;
end;
constructor TSys0.Create;
begin
inherited;
Writeln(ClassName + ' now being created');
Writeln('State=', FItem.State);
end;
var
C: TSys;
begin
Writeln('Create instance of TSys...');
C := TSys.Create;
if not InitDone then
Halt(1);
C.Free;
end.