The declarations of Remote_Types and Remote_Call_Interface packages are
allowed to depend on preelaborated packages, as specified in AI05-206,
as long as the dependence is made using a private with_clause. Before
this fix, the compiler was disallowing such a dependence for RCI packages,
and for Remote_Types packages it was incorrectly permitting dependence
via a normal with_clause.

The following packages must compile either quietly or with an error,
as shown below:

$ gcc -c -gnat05 rt_pkg_1.ads
rt_pkg_1.ads:1:06: must use private with clause for preelaborated unit 
"Preelab_Pkg"

$ gcc -c -gnat05 rt_pkg_2.ads
[no output]

$ gcc -c -gnat05 rci_pkg_1.ads
rci_pkg_1.ads:1:06: must use private with clause for preelaborated unit 
"Preelab_Pkg"

$ gcc -c -gnat05 rci_pkg_2.ads
[no output]


package Preelab_Pkg is

   pragma Preelaborate;

end Preelab_Pkg;


with Preelab_Pkg;  -- Should be rejected (per AI05-0206)

package RT_Pkg_1 is

   pragma Remote_Types;

end RT_Pkg_1;


private with Preelab_Pkg;  -- Should be accepted (per AI05-0206)

package RT_Pkg_2 is

   pragma Remote_Types;

end RT_Pkg_2;


with Preelab_Pkg;  -- Should be rejected (per AI05-0206)

package RCI_Pkg_1 is

   pragma Remote_Call_Interface;

end RCI_Pkg_1;


private with Preelab_Pkg;  -- Should be accepted (per AI05-0206)

package RCI_Pkg_2 is

   pragma Remote_Call_Interface;

end RCI_Pkg_2;

Tested on x86_64-pc-linux-gnu, committed on trunk

2012-07-09  Gary Dismukes  <dismu...@adacore.com>

        * sem_cat.adb (Check_Categorization_Dependencies):
        Allow dependence of both Remote_Types and Remote_Call_Interface
        declarations (not just Remote_Types units) on preelaborated
        units, but require that the dependence be made via a private
        with_clause. Issue a specialized error message.

Index: sem_cat.adb
===================================================================
--- sem_cat.adb (revision 189366)
+++ sem_cat.adb (working copy)
@@ -219,10 +219,14 @@
          then
             null;
 
-         --  Special case: Remote_Types can depend on Preelaborated per
-         --  Ada 2005 AI 0206.
+         --  Special case: Remote_Types and Remote_Call_Interface declarations
+         --  can depend on a preelaborated unit via a private with_clause, per
+         --  AI05-0206.
 
-         elsif Unit_Category = Remote_Types
+         elsif (Unit_Category = Remote_Types
+                 or else Unit_Category = Remote_Call_Interface)
+           and then (Nkind (N) = N_With_Clause
+                      and then Private_Present (N))
            and then Is_Preelaborated (Depended_Entity)
          then
             null;
@@ -263,6 +267,17 @@
          then
             return;
 
+         --  Dependence of Remote_Types or Remote_Call_Interface declaration
+         --  on a preelaborated unit with a normal with_clause.
+
+         elsif (Unit_Category = Remote_Types
+                 or else Unit_Category = Remote_Call_Interface)
+           and then Is_Preelaborated (Depended_Entity)
+         then
+            Error_Msg_NE
+              ("<must use private with clause for preelaborated unit& ",
+               N, Depended_Entity);
+
          --  Subunit case
 
          elsif Is_Subunit then

Reply via email to