Browse Source

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

Jonas Maebe 11 years ago
parent
commit
4e9c54278e
1 changed files with 7 additions and 5 deletions
  1. 7 5
      compiler/ncgutil.pas

+ 7 - 5
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;