From 08402a6d65a25da348c28c0a539dd0923ff976d6 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Fri, 17 Feb 2006 17:08:18 +0100 Subject: [PATCH] sem_ch6.adb (Build_Body_To_Inline): Enforce the rule that in order to inline a function that returns an... 2006-02-17 Ed Schonberg * 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 | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 66a24306a85..33696df5200 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -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)) -- 2.30.2