sem_ch6.adb (Check_Missing_Return): Do not report a missing return statement on a...
authorEd Schonberg <schonberg@adacore.com>
Fri, 23 Oct 2015 12:51:30 +0000 (12:51 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 23 Oct 2015 12:51:30 +0000 (14:51 +0200)
2015-10-23  Ed Schonberg  <schonberg@adacore.com>

* sem_ch6.adb (Check_Missing_Return): Do not report a missing
return statement on a function body constructed to complete a
package body for a premature instantiation.

2015-10-23  Ed Schonberg  <schonberg@adacore.com>

* exp_ch6.adb (Build_Procedure_Body_Form): Replace body of
original function with that of generated procedure, to simplify
processing and avoid scoping problems with local declarations.
(Rewrite_Function_Call_For_C): Handle properly the case of a
parameterless function.

From-SVN: r229249

gcc/ada/ChangeLog
gcc/ada/exp_ch6.adb
gcc/ada/sem_ch6.adb

index 161c024f3811990d3b7a72d5b8a65927b4f5914f..8bc9fb5cdca2b5e448827a9efa4734a880269ff9 100644 (file)
@@ -1,3 +1,17 @@
+2015-10-23  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch6.adb (Check_Missing_Return): Do not report a missing
+       return statement on a function body constructed to complete a
+       package body for a premature instantiation.
+
+2015-10-23  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_ch6.adb (Build_Procedure_Body_Form): Replace body of
+       original function with that of generated procedure, to simplify
+       processing and avoid scoping problems with local declarations.
+       (Rewrite_Function_Call_For_C): Handle properly the case of a
+       parameterless function.
+
 2015-10-23  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * a-exextr.adb, sem_ch6.adb, sem_ch13.adb: Minor reformatting.
index c385a2567f5b469dc3e02842fb9c5c0e69a3fb21..eb25c9b332b457da6fab5c896f954c3f54eee361 100644 (file)
@@ -4962,7 +4962,8 @@ package body Exp_Ch6 is
 
       procedure Build_Procedure_Body_Form (Func_Id : Entity_Id);
       --  Create a procedure body which emulates the behavior of function
-      --  Func_Id.
+      --  Func_Id. This body replaces the original function body, which is
+      --  not needed for the C program.
 
       ----------------
       -- Add_Return --
@@ -5123,7 +5124,7 @@ package body Exp_Ch6 is
       --  Start of processing for Build_Procedure_Body_Form
 
       begin
-         --  This routine performs the following expansion:
+         --  This routine replaces the original function body:
 
          --    function F (...) return Array_Typ is
          --    begin
@@ -5131,23 +5132,27 @@ package body Exp_Ch6 is
          --       return Something;
          --    end F;
 
+         --    with the following:
+
          --    procedure P (..., Result : out Array_Typ) is
          --    begin
          --       ...
          --       Result := Something;
          --    end P;
 
-         Stmts := New_Copy_List (Statements (HSS));
+         Stmts := Statements (HSS);
          Replace_Returns (Last_Entity (Proc_Id), Stmts);
 
-         Insert_After_And_Analyze (N,
+         Replace (N,
            Make_Subprogram_Body (Loc,
              Specification              =>
                Copy_Subprogram_Spec (Specification (Proc_Decl)),
-             Declarations               => New_Copy_List (Declarations (N)),
+             Declarations               => Declarations (N),
              Handled_Statement_Sequence =>
                Make_Handled_Sequence_Of_Statements (Loc,
                  Statements => Stmts)));
+
+         Analyze (N);
       end Build_Procedure_Body_Form;
 
       --  Local varaibles
@@ -5491,7 +5496,7 @@ package body Exp_Ch6 is
 
       procedure Build_Procedure_Form;
       --  Create a procedure declaration which emulates the behavior of
-      --  function Subp.
+      --  function Subp, for SPARK_To_C.
 
       --------------------------
       -- Build_Procedure_Form --
@@ -9593,6 +9598,12 @@ package body Exp_Ch6 is
    begin
       Actuals := Parameter_Associations (N);
 
+      --  Original function amy have been parameterless.
+
+      if No (Actuals) then
+         Actuals := New_List;
+      end if;
+
       --  If the function call is the expression of an assignment statement,
       --  transform the assignment into a procedure call. Generate:
 
index 8b5a9fde91828f0b945d832756adb972bdf41e96..30be33330c80ff2407f2dc6d1e23a6c6fd01ef9d 100644 (file)
@@ -2732,6 +2732,18 @@ package body Sem_Ch6 is
                   Set_Has_Missing_Return (Id);
                end if;
 
+            --  Within a premature instantiation of a package with no body, we
+            --  build completions of the functions therein, with a Raise
+            --  statement. No point in complaining about a missing return in
+            --  this case.
+
+            elsif Ekind (Id) = E_Function
+              and then In_Instance
+              and then Present (Statements (HSS))
+              and then Nkind (First (Statements (HSS))) = N_Raise_Program_Error
+            then
+               null;
+
             elsif Is_Generic_Subprogram (Id)
               or else not Is_Machine_Code_Subprogram (Id)
             then