2
0
Эх сурвалжийг харах

* 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

(cherry picked from commit 27c1bb3beaa237e9813194205425c312b6308cbd)

Sven/Sarah Barth 2 жил өмнө
parent
commit
8b90df2ce2

+ 2 - 1
compiler/symdef.pas

@@ -7523,7 +7523,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 - 0
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.