Browse Source

* fix #41458: when registering the procdef ensure that it's owner is set to the same symtable as the procsym's owner
+ added test

Sven/Sarah Barth 1 day ago
parent
commit
0f9dfa29ac
3 changed files with 52 additions and 2 deletions
  1. 8 2
      compiler/ncal.pas
  2. 9 0
      tests/webtbs/tw41458.pp
  3. 35 0
      tests/webtbs/uw41458.pp

+ 8 - 2
compiler/ncal.pas

@@ -4265,9 +4265,15 @@ implementation
 
                    { if the final procedure definition is not yet owned,
                      ensure that it is }
-                   procdefinition.register_def;
                    if (procdefinition.typ=procdef) and assigned(tprocdef(procdefinition).procsym) then
-                     tprocdef(procdefinition).procsym.register_sym;
+                     begin
+                       { if the procdef does not yet have an owner (e.g. because it has just been
+                         specialized) then insert it into the same owner as the procsym }
+                       if not assigned(procdefinition.owner) and assigned(tprocdef(procdefinition).procsym.owner) then
+                         tprocdef(procdefinition).procsym.owner.insertdef(procdefinition);
+                       tprocdef(procdefinition).procsym.register_sym;
+                     end;
+                   procdefinition.register_def;
 
                    if procdefinition.is_specialization and (procdefinition.typ=procdef) then
                      maybe_add_pending_specialization(procdefinition,candidates.para_anon_syms);

+ 9 - 0
tests/webtbs/tw41458.pp

@@ -0,0 +1,9 @@
+{ %NORUN }
+
+program tw41458;
+
+uses uw41458;
+
+begin
+end.
+

+ 35 - 0
tests/webtbs/uw41458.pp

@@ -0,0 +1,35 @@
+unit uw41458;
+{$ifdef FPC}{$mode delphi}{$endif}
+
+interface
+
+type
+  TUtils = record
+    class procedure GenericMethod<T>; static;
+  end;
+  TMyObj = record
+    FAnsiString: AnsiString;
+    procedure method;
+  end;
+
+var
+  GlobObj: TMyObj;
+
+implementation
+
+class procedure TUtils.GenericMethod<T>;
+begin
+end;
+
+procedure impl_proc(a: Double; b: String);
+begin
+  TUtils.GenericMethod<byte>;
+end;
+
+procedure TMyObj.method;
+begin
+  impl_proc(1.2, '-');
+end;
+
+end.
+