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

+ added tests
This commit is contained in:
Sven/Sarah Barth 2024-04-12 16:03:13 +02:00
parent 0e9efd07ef
commit 7a1ef994b4
3 changed files with 53 additions and 2 deletions

View File

@ -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
tests/webtbs/tw40712a.pp Normal file
View File

@ -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
tests/webtbs/tw40712b.pp Normal file
View File

@ -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.