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.