{ This is a resubmission of https://lists.freepascal.org/pipermail/fpc-devel/2019-August/041915.html }
trecorddef.create_global_internal generates internal RecordDef names as '$InternalRec'+tostr(current_module.deflist.count) However, since such internal RecordDefs are not necessarily registered afterwards (i.e. deflist.count is not going to be bumped), such names do not contain actual DefIDs, and thus are not unique within a module. (See the original email for a test case.) 1) So, what is the point of that misleading numerical suffix? I propose that it be dropped. 2) My understanding is that a name should never be autogenerated for an internal RecordDef that is going to be registered with a DefID. I propose that this be asserted (two variants are offered). The same draft patch is attached. -- βþ
# HG changeset patch # User Blaise.ru # Date 1565724859 -10800 # 13.08.2019 22:34:19 +0300 # Node ID d56502f486fda6e205e1ce68f172c622a973662d # Parent 46bd9a9913f31e10286ae4d9320918040c217858 = trecorddef.create_global_internal: non-misleading autogenerated names diff -r 46bd9a9913f3 -r d56502f486fd symdef.pas --- a/symdef.pas 30.11.2019 14:35:10 +0300 +++ b/symdef.pas 13.08.2019 22:34:19 +0300 @@ -4789,8 +4789,8 @@ constructor trecorddef.create_global_internal(const n: string; packrecords, recordalignmin: shortint); + const internaltypeName: string = '$InternalRec'; var - name : string; pname : pshortstring; oldsymtablestack: tsymtablestack; where : tsymtable; @@ -4801,8 +4801,9 @@ pname:=@n else begin - name:='$InternalRec'+tostr(current_module.deflist.count); - pname:=@name; + if current_module.in_interface then + internalerror(2019081301); // do not register a nameless def + pname:=@internaltypeName; end; oldsymtablestack:=symtablestack; { do not simply push/pop current_module.localsymtable, because @@ -4826,7 +4827,10 @@ typed constant data) } ts.increfcount; where.insert(ts); - end; + end + else + if defid<>defid_not_registered then + internalerror(2019081301); // we registered a nameless def symtablestack:=oldsymtablestack; { don't create RTTI for internal types, these are not exported } defstates:=defstates+[ds_rtti_table_written,ds_init_table_written];
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel