瀏覽代碼

* fix #40721: correctly set up the generic defs when parsing fields, especially important when dealing with anonymous fields
+ added tests

Sven/Sarah Barth 1 年之前
父節點
當前提交
7a1ef994b4
共有 3 個文件被更改,包括 53 次插入2 次删除
  1. 18 2
      compiler/pdecvar.pas
  2. 18 0
      tests/webtbs/tw40712a.pp
  3. 17 0
      tests/webtbs/tw40712b.pp

+ 18 - 2
compiler/pdecvar.pas

@@ -1684,7 +1684,7 @@ implementation
          sc : TFPObjectList;
          i  : longint;
          hs,sorg : string;
-         hdef,casetype : tdef;
+         gendef,hdef,casetype : tdef;
          { maxsize contains the max. size of a variant }
          { startvarrec contains the start of the variant part of a record }
          maxsize, startvarrecsize : asizeint;
@@ -1782,7 +1782,23 @@ implementation
 
              typepos:=current_filepos;
 
-             read_anon_type(hdef,false,nil);
+             { make sure that the correct genericdef is set up, especially if
+               we're dealing with anonymous type declarations }
+             gendef:=nil;
+             if df_specialization in current_structdef.defoptions then
+               begin
+                 srsymtable:=current_structdef.genericdef.getsymtable(gs_record);
+                 if not assigned(srsymtable) then
+                   internalerror(2024041204);
+                 srsym:=tsym(srsymtable.find(tabstractvarsym(sc[0]).name));
+                 if not assigned(srsym) then
+                   internalerror(2024041205);
+                 if srsym.typ<>fieldvarsym then
+                   internalerror(2024041206);
+                 gendef:=tfieldvarsym(srsym).vardef;
+               end;
+
+             read_anon_type(hdef,false,tstoreddef(gendef));
              maybe_guarantee_record_typesym(hdef,symtablestack.top);
 {$ifdef wasm}
              if is_wasm_reference_type(hdef) then

+ 18 - 0
tests/webtbs/tw40712a.pp

@@ -0,0 +1,18 @@
+{ %NORUN }
+
+program tw40712a;
+{$mode objfpc}
+type
+  generic TSomeGeneric<T> = object
+  type
+      TMine = T;
+  var
+      data: record
+        value: TMine;
+      end;
+  end;
+  TSomeGeneric2 = object(specialize TSomeGeneric<Integer>)
+  end;
+begin
+end.
+

+ 17 - 0
tests/webtbs/tw40712b.pp

@@ -0,0 +1,17 @@
+{ %NORUN }
+
+program tw40712b;
+{$mode delphi}
+type
+    TSomeGeneric<T> = object
+    type
+      TMine = T;
+    var
+      data: record
+        value: T;
+      end;
+  end;
+  TSomeGeneric2 = object(TSomeGeneric<Integer>)
+  end;
+begin
+end.