From 4e9c54278e31c4bcb0855508415631d8183919f6 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sun, 2 Feb 2014 09:09:44 +0000 Subject: [PATCH] * the function result of constructors always is self, always is valid and is not stored in procdef.funcretsym -> fix check so that SSA is not performed on it in constructors when exit is used git-svn-id: trunk@26650 - --- compiler/ncgutil.pas | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas index 30f16d0513..db028f7eda 100644 --- a/compiler/ncgutil.pas +++ b/compiler/ncgutil.pas @@ -1945,13 +1945,15 @@ implementation exit; end; - if not is_void(current_procinfo.procdef.returndef) and + { self is implicitly returned from constructors, even if there are no + references to it; additionally, funcretsym is not set for constructor + procdefs } + if (current_procinfo.procdef.proctypeoption=potype_constructor) then + rr.ressym:=tsym(current_procinfo.procdef.parast.Find('self')) + else if not is_void(current_procinfo.procdef.returndef) and assigned(current_procinfo.procdef.funcretsym) and (tabstractvarsym(current_procinfo.procdef.funcretsym).refs <> 0) then - if (current_procinfo.procdef.proctypeoption=potype_constructor) then - rr.ressym:=tsym(current_procinfo.procdef.parast.Find('self')) - else - rr.ressym:=current_procinfo.procdef.funcretsym; + rr.ressym:=current_procinfo.procdef.funcretsym; if not foreachnodestatic(n,@doreplace,@rr) then exit;