sem_ch6.adb (Build_Body_To_Inline): Enforce the rule that in order to inline a functi...
authorEd Schonberg <schonberg@adacore.com>
Fri, 17 Feb 2006 16:08:18 +0000 (17:08 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 17 Feb 2006 16:08:18 +0000 (17:08 +0100)
2006-02-17  Ed Schonberg  <schonberg@adacore.com>

* sem_ch6.adb (Build_Body_To_Inline): Enforce the rule that in order
to inline a function that returns an unconstrained type, the return
expression must be the first variable declared in the body of the
function.

From-SVN: r111194

gcc/ada/sem_ch6.adb

index 66a24306a855273a2b520b5177b6ad014b9bada3..33696df5200a6a28e5972e105153649bcf0c2d73 100644 (file)
@@ -2163,7 +2163,10 @@ package body Sem_Ch6 is
       --  Start of processing for Has_Single_Return
 
       begin
-         return Check_All_Returns (N) = OK;
+         return Check_All_Returns (N) = OK
+           and then Present (Declarations (N))
+           and then Chars (Expression (Return_Statement)) =
+                    Chars (Defining_Identifier (First (Declarations (N))));
       end Has_Single_Return;
 
       --------------------
@@ -2231,20 +2234,24 @@ package body Sem_Ch6 is
       then
          return;    --  Done already.
 
-      --  Functions that return unconstrained composite types will require
-      --  secondary stack handling, and cannot currently be inlined.
-      --  Ditto for functions that return controlled types, where controlled
-      --  actions interfere in complex ways with inlining.
+      --  Functions that return unconstrained composite types require
+      --  secondary stack handling, and cannot currently be inlined, unless
+      --  all return statements return a local variable that is the first
+      --  local declaration in the body.
 
       elsif Ekind (Subp) = E_Function
         and then not Is_Scalar_Type (Etype (Subp))
         and then not Is_Access_Type (Etype (Subp))
         and then not Is_Constrained (Etype (Subp))
-        and then not Has_Single_Return
       then
-         Cannot_Inline
-           ("cannot inline & (unconstrained return type)?", N, Subp);
-         return;
+         if not Has_Single_Return then
+            Cannot_Inline
+              ("cannot inline & (unconstrained return type)?", N, Subp);
+            return;
+         end if;
+
+      --  Ditto for functions that return controlled types, where controlled
+      --  actions interfere in complex ways with inlining.
 
       elsif Ekind (Subp) = E_Function
         and then Controlled_Type (Etype (Subp))