{ 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

Reply via email to