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.