From 96a9273fba2398f77d321064ca586ede0cd3722f Mon Sep 17 00:00:00 2001 From: svenbarth Date: Fri, 18 Sep 2015 21:51:17 +0000 Subject: [PATCH] pdecsub.pas: + export parse_proc_dec_finish() from the unit pgenutil.pas: * adjust generate_specialization_phase2() to correctly specialize procdefs git-svn-id: trunk@31772 - --- compiler/pdecsub.pas | 1 + compiler/pgenutil.pas | 45 ++++++++++++++++++++++++++++++++----------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index 40eab23fff..7311593486 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -79,6 +79,7 @@ interface procedure parse_record_proc_directives(pd:tabstractprocdef); function parse_proc_head(astruct:tabstractrecorddef;potype:tproctypeoption;isgeneric:boolean;genericdef:tdef;generictypelist:tfphashobjectlist;out pd:tprocdef):boolean; function parse_proc_dec(isclassmethod:boolean;astruct:tabstractrecorddef):tprocdef; + procedure parse_proc_dec_finish(pd:tprocdef;isclassmethod:boolean); { parse a record method declaration (not a (class) constructor/destructor) } function parse_record_method_dec(astruct: tabstractrecorddef; is_classdef: boolean): tprocdef; diff --git a/compiler/pgenutil.pas b/compiler/pgenutil.pas index afbe1920fe..331f36c5f6 100644 --- a/compiler/pgenutil.pas +++ b/compiler/pgenutil.pas @@ -892,7 +892,13 @@ uses old_block_type:=block_type; block_type:=bt_type; - if not assigned(genericdef.generictokenbuf) then + if ( + (genericdef.typ=procdef) and + not assigned(tprocdef(genericdef).genericdecltokenbuf) + ) or ( + (genericdef.typ<>procdef) and + not assigned(genericdef.generictokenbuf) + ) then internalerror(200511171); hmodule:=find_module_from_symtable(genericdef.owner); if hmodule=nil then @@ -909,17 +915,34 @@ uses else recordbuf:=nil; replaydepth:=current_scanner.replay_stack_depth; - current_scanner.startreplaytokens(genericdef.generictokenbuf); - hadtypetoken:=false; - read_named_type(result,srsym,genericdef,generictypelist,false,hadtypetoken); - current_filepos:=oldcurrent_filepos; - ttypesym(srsym).typedef:=result; - result.typesym:=srsym; - - if _prettyname<>'' then - ttypesym(result.typesym).fprettyname:=_prettyname + if genericdef.typ=procdef then + begin + current_scanner.startreplaytokens(tprocdef(genericdef).genericdecltokenbuf); + parse_proc_head(tprocdef(genericdef).struct,tprocdef(genericdef).proctypeoption,false,genericdef,generictypelist,pd); + if assigned(pd) then + begin + if assigned(psym) then + pd.procsym:=psym + else + pd.procsym:=srsym; + parse_proc_dec_finish(pd,po_classmethod in tprocdef(genericdef).procoptions); + end; + result:=pd; + end else - ttypesym(result.typesym).fprettyname:=prettyname; + begin + current_scanner.startreplaytokens(genericdef.generictokenbuf); + hadtypetoken:=false; + read_named_type(result,srsym,genericdef,generictypelist,false,hadtypetoken); + ttypesym(srsym).typedef:=result; + result.typesym:=srsym; + + if _prettyname<>'' then + ttypesym(result.typesym).fprettyname:=_prettyname + else + ttypesym(result.typesym).fprettyname:=prettyname; + end; + current_filepos:=oldcurrent_filepos; { Note regarding hint directives: There is no need to remove the flags for them from the