diff --git a/.gitattributes b/.gitattributes index c75b35afcb..1f0674029e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15271,6 +15271,8 @@ tests/webtbs/tw30936.pp svneol=native#text/pascal tests/webtbs/tw30936a.pp svneol=native#text/pascal tests/webtbs/tw30936b.pp svneol=native#text/pascal tests/webtbs/tw30936c.pp svneol=native#text/pascal +tests/webtbs/tw30939a.pp svneol=native#text/pascal +tests/webtbs/tw30939b.pp svneol=native#text/pascal tests/webtbs/tw30948.pp svneol=native#text/plain tests/webtbs/tw30978.pp svneol=native#text/pascal tests/webtbs/tw30978a.pp svneol=native#text/pascal diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index 8f5609a1fa..f4a5fed790 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -771,11 +771,12 @@ implementation error : boolean; genname, ugenname : tidstring; + module : tmodule; begin result:=false; if not assigned(genericparams) then exit; - specializename:=''; + specializename:='$'; prettyname:=''; error:=false; for i:=0 to genericparams.count-1 do @@ -794,7 +795,10 @@ implementation error:=true; continue; end; - specializename:=specializename+'$'+ttypesym(typesrsym).typedef.fulltypename; + module:=find_module_from_symtable(ttypesym(typesrsym).typedef.owner); + if not assigned(module) then + internalerror(2016112803); + specializename:=specializename+'_$'+hexstr(module.moduleid,8)+'$$'+ttypesym(typesrsym).typedef.unique_id_str; if i>0 then prettyname:=prettyname+','; prettyname:=prettyname+ttypesym(typesrsym).prettyname; diff --git a/compiler/pgenutil.pas b/compiler/pgenutil.pas index 8225bd4959..9ddc3415a7 100644 --- a/compiler/pgenutil.pas +++ b/compiler/pgenutil.pas @@ -295,6 +295,7 @@ uses tmpparampos : tfileposinfo; namepart : string; prettynamepart : ansistring; + module : tmodule; begin result:=true; if genericdeflist=nil then @@ -310,8 +311,12 @@ uses if assigned(parsedtype) then begin genericdeflist.Add(parsedtype); - specializename:='$'+parsedtype.fulltypename; - prettyname:=parsedtype.typesym.prettyname; + module:=find_module_from_symtable(parsedtype.owner); + if not assigned(module) then + internalerror(2016112801); + namepart:='_$'+hexstr(module.moduleid,8)+'$$'+parsedtype.unique_id_str; + specializename:='$'+namepart; + prettyname:=parsedtype.fullownerhierarchyname(true)+parsedtype.typesym.prettyname; if assigned(poslist) then begin New(parampos); @@ -321,7 +326,7 @@ uses end else begin - specializename:=''; + specializename:='$'; prettyname:=''; end; while not (token in [_GT,_RSHARPBRACKET]) do @@ -353,22 +358,23 @@ uses else if (typeparam.resultdef.typ<>errordef) then begin genericdeflist.Add(typeparam.resultdef); + module:=find_module_from_symtable(typeparam.resultdef.owner); + if not assigned(module) then + internalerror(2016112802); + namepart:='_$'+hexstr(module.moduleid,8)+'$$'+typeparam.resultdef.unique_id_str; { we use the full name of the type to uniquely identify it } if (symtablestack.top.symtabletype=parasymtable) and (symtablestack.top.defowner.typ=procdef) and (typeparam.resultdef.owner=symtablestack.top) then begin { special handling for specializations inside generic function declarations } - namepart:=tdef(symtablestack.top.defowner).unique_id_str; - namepart:='genproc'+namepart+'_'+tdef(symtablestack.top.defowner).fullownerhierarchyname(false)+'_'+tprocdef(symtablestack.top.defowner).procsym.realname+'_'+typeparam.resultdef.typename; - prettynamepart:=tdef(symtablestack.top.defowner).fullownerhierarchyname(false)+tprocdef(symtablestack.top.defowner).procsym.prettyname; + prettynamepart:=tdef(symtablestack.top.defowner).fullownerhierarchyname(true)+tprocdef(symtablestack.top.defowner).procsym.prettyname; end else begin - namepart:=typeparam.resultdef.fulltypename; - prettynamepart:=typeparam.resultdef.fullownerhierarchyname(false); + prettynamepart:=typeparam.resultdef.fullownerhierarchyname(true); end; - specializename:=specializename+'$'+namepart; + specializename:=specializename+namepart; if not first then prettyname:=prettyname+','; prettyname:=prettyname+prettynamepart+typeparam.resultdef.typesym.prettyname; diff --git a/tests/webtbs/tw30939a.pp b/tests/webtbs/tw30939a.pp new file mode 100644 index 0000000000..a65b23c654 --- /dev/null +++ b/tests/webtbs/tw30939a.pp @@ -0,0 +1,23 @@ +{ %NORUN } + +program tw30939a; + +{$MODESWITCH result} + +Type + generic TGData = record + b: T + end; + + generic TGWrapper = record + a: specialize TGData + end; + +generic Function DoSomething: specialize TGWrapper; + Begin + result.a.b := default(T) + End; + +Begin + specialize DoSomething; +End. diff --git a/tests/webtbs/tw30939b.pp b/tests/webtbs/tw30939b.pp new file mode 100644 index 0000000000..c4d84df789 --- /dev/null +++ b/tests/webtbs/tw30939b.pp @@ -0,0 +1,23 @@ +{ %NORUN } + +program tw30939a; + +{$MODE delphi} + +Type + TGData = record + b: T + end; + + TGWrapper = record + a: TGData + end; + +Function DoSomething: TGWrapper; + Begin + result.a.b := default(T) + End; + +Begin + DoSomething; +End.