mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 13:29:27 +02:00
* 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:
parent
be4a317cb4
commit
27c1bb3bea
@ -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
53
tests/tbs/tb0695.pp
Normal 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.
|
Loading…
Reference in New Issue
Block a user