From 6299e94c8f99fa043920d005c4111d657f690e7c Mon Sep 17 00:00:00 2001 From: Sven/Sarah Barth Date: Sat, 5 Feb 2022 20:41:44 +0100 Subject: [PATCH] * set the type symbol of the procvar while it is parsed so that a function reference can have itself as part of the parameters or the return type --- compiler/ptype.pas | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/compiler/ptype.pas b/compiler/ptype.pas index 74a6f792fd..5a39b5c815 100644 --- a/compiler/ptype.pas +++ b/compiler/ptype.pas @@ -1562,13 +1562,14 @@ implementation end; - function procvar_dec(genericdef:tstoreddef;genericlist:tfphashobjectlist;doregister:boolean):tdef; + function procvar_dec(genericdef:tstoreddef;genericlist:tfphashobjectlist;sym:tsym;doregister:boolean):tdef; var is_func:boolean; pd:tprocvardef; old_current_genericdef, old_current_specializedef: tstoreddef; old_parse_generic: boolean; + olddef : tdef; begin old_current_genericdef:=current_genericdef; old_current_specializedef:=current_specializedef; @@ -1581,6 +1582,13 @@ implementation consume(token); pd:=cprocvardef.create(normal_function_level,doregister); + if assigned(sym) then + begin + pd.typesym:=sym; + olddef:=ttypesym(sym).typedef; + ttypesym(sym).typedef:=pd; + end; + { usage of specialized type inside its generic template } if assigned(genericdef) then current_specializedef:=pd @@ -1640,6 +1648,12 @@ implementation current_genericdef:=old_current_genericdef; current_specializedef:=old_current_specializedef; + if assigned(sym) then + begin + pd.typesym:=nil; + ttypesym(sym).typedef:=olddef; + end; + result:=pd; end; @@ -1952,7 +1966,7 @@ implementation _PROCEDURE, _FUNCTION: begin - def:=procvar_dec(genericdef,genericlist,true); + def:=procvar_dec(genericdef,genericlist,nil,true); {$ifdef jvm} jvm_create_procvar_class(name,def); {$endif} @@ -1982,7 +1996,7 @@ implementation consume(_TO); { don't register the def as a non-cblock function reference will be converted to an interface } - def:=procvar_dec(genericdef,genericlist,false); + def:=procvar_dec(genericdef,genericlist,newsym,false); { could be errordef in case of a syntax error } if assigned(def) and (def.typ=procvardef) then