diff --git a/compiler/symdef.pas b/compiler/symdef.pas index ee40248d48..4a260c46b9 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -110,6 +110,7 @@ interface function alignment:shortint;override; function is_publishable : boolean;override; function needs_inittable : boolean;override; + function has_non_trivial_init_child(check_parent:boolean):boolean;override; function rtti_mangledname(rt:trttitype):TSymStr;override; function OwnerHierarchyName: string; override; function fullownerhierarchyname(skipprocparams:boolean):TSymStr;override; @@ -346,6 +347,7 @@ interface { debug } function needs_inittable : boolean;override; function needs_separate_initrtti:boolean;override; + function has_non_trivial_init_child(check_parent:boolean):boolean;override; end; trecorddefclass = class of trecorddef; @@ -458,6 +460,7 @@ interface function is_publishable : boolean;override; function needs_inittable : boolean;override; function needs_separate_initrtti : boolean;override; + function has_non_trivial_init_child(check_parent:boolean):boolean;override; function rtti_mangledname(rt:trttitype):TSymStr;override; function vmt_mangledname : TSymStr; function vmt_def: trecorddef; @@ -2102,6 +2105,12 @@ implementation end; + function tstoreddef.has_non_trivial_init_child(check_parent:boolean):boolean; + begin + result:=false; + end; + + function tstoreddef.is_intregable : boolean; var recsize,temp: longint; @@ -4546,6 +4555,12 @@ implementation end; + function trecorddef.has_non_trivial_init_child(check_parent:boolean):boolean; + begin + result:=trecordsymtable(symtable).has_non_trivial_init; + end; + + procedure trecorddef.buildderef; begin inherited buildderef; @@ -7248,6 +7263,19 @@ implementation result:=not (objecttype in [odt_interfacecom,odt_interfacecorba,odt_dispinterface]); end; + + function tobjectdef.has_non_trivial_init_child(check_parent:boolean):boolean; + begin + if objecttype in [odt_class,odt_object] then + begin + result:=tobjectsymtable(symtable).has_non_trivial_init or + (check_parent and assigned(childof) and childof.has_non_trivial_init_child(true)); + end + else + result:=false; + end; + + function tobjectdef.rtti_mangledname(rt: trttitype): TSymStr; begin if not(objecttype in [odt_objcclass,odt_objcprotocol]) then diff --git a/compiler/symtype.pas b/compiler/symtype.pas index 4491960e87..a59ba6ad43 100644 --- a/compiler/symtype.pas +++ b/compiler/symtype.pas @@ -88,6 +88,8 @@ interface function getsymtable(t:tgetsymtable):TSymtable;virtual; function is_publishable:boolean;virtual;abstract; function needs_inittable:boolean;virtual;abstract; + { contains a (managed) child that is not initialized to 0/Nil } + function has_non_trivial_init_child(check_parent:boolean):boolean;virtual;abstract; function needs_separate_initrtti:boolean;virtual;abstract; procedure ChangeOwner(st:TSymtable); function getreusablesymtab: tsymtable;