From 27c1bb3beaa237e9813194205425c312b6308cbd Mon Sep 17 00:00:00 2001 From: Sven/Sarah Barth <pascaldragon@gmail.com> Date: Sun, 14 Aug 2022 15:42:32 +0200 Subject: [PATCH] * 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 --- compiler/symdef.pas | 3 ++- tests/tbs/tb0695.pp | 53 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/tbs/tb0695.pp diff --git a/compiler/symdef.pas b/compiler/symdef.pas index fbfc6bd7e6..dc369bd36b 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -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; diff --git a/tests/tbs/tb0695.pp b/tests/tbs/tb0695.pp new file mode 100644 index 0000000000..74081f2a68 --- /dev/null +++ b/tests/tbs/tb0695.pp @@ -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.