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 -
This commit is contained in:
svenbarth 2015-09-18 21:51:17 +00:00
parent d15cdefc37
commit 96a9273fba
2 changed files with 35 additions and 11 deletions

View File

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

View File

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