The switch -gnates is no longer available, this mode must be set
using the configuration pragma, or -gnatd.M or is set automatically
in CodePeer mode. The pragma is now only allowed if Address is a
private type (since otherwise it makes no sense), and finally an
error is corrected which caused the following test to fail:

Given the following gnat.adc file:

   pragma Extend_System (Aux_AAMP);

where s-auxaam.ads contains the declarations:

   function "+"  (Left : Address; Right : Integer) return Address;
   function "+"  (Left : Integer; Right : Address) return Address;
   function "-"  (Left : Address; Right : Integer) return Address;
   function "-"  (Left : Integer; Right : Address) return Address;
   function "-"  (Left : Address; Right : Address) return Integer;

The following should compile silently with -gnatd.M

     1. with System; use System;
     2. package Sys is
     3.    Variable1 : Integer;
     4.    for Variable1 use at 16#43FFF0#;
     5.    Variable2 : System.Address;
     6.    Start_Address : constant System.Address := 16#1234#;
     7.    Max_Words     : constant := 32;
     8.    Addr  : System.Address :=
     9.              System.Address (Start_Address + Max_Words);
    10.    App_Start : System.Address := Variable1'Address;
    11.    App_End   : System.Address := Variable2'Address;
    12.    App_Block_Size : constant System.Address :=
    13.                       (App_End - App_Start + 1);
    14. end Sys;

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

2014-01-20  Robert Dewar  <de...@adacore.com>

        * gnat_rm.texi: Document that Allow_Integer_Address is permitted
        only if System.Address is a private type.
        * opt.ads (Allow_Integer_Address): No longer set by -gnates.
        * sem_prag.adb (Analyze_Pragma, case Allow_Integer_Address):
        Allowed only if type System.Address is private, since otherwise
        it makes no sense.
        * sem_res.adb: Fix failure to properly Analyze unchecked
        conversions that were introduced by Allow_Integer_Address.
        * switch-c.adb: Remove -gnates switch.
        * usage.adb: Remove -gnates switch.
        * gnat_ugn.texi: Remove documentation of -gnates flag.

Index: gnat_rm.texi
===================================================================
--- gnat_rm.texi        (revision 206825)
+++ gnat_rm.texi        (working copy)
@@ -1231,8 +1231,11 @@
 @end smallexample
 
 @noindent
-In most versions of GNAT, @code{System.Address} is a private type, which means
-that integer values are not allowed. If the configuration pragma
+This configuration pragma is allowed only
+if type @code{System.Address} is a private type,
+which is true in most versions of GNAT. which means that integer values,
+in particular integer literals, are not allowed as address values.
+If the configuration pragma
 @code{Allow_Integer_Address} is given, then integer expressions may
 be used anywhere a value of type @code{System.Address} is required.
 The effect is to introduce an implicit unchecked conversion from the
Index: gnat_ugn.texi
===================================================================
--- gnat_ugn.texi       (revision 206825)
+++ gnat_ugn.texi       (working copy)
@@ -3821,13 +3821,6 @@
 manner). This can be useful in some specialized circumstances such as the
 temporary use of special test software.
 
-@ifclear vms
-@item -gnates
-@cindex @option{-gnates} (@command{gcc})
-Activates @code{Allow_Integer_Address} mode as though the corresponding
-configuration pragma was present.
-@end ifclear
-
 @item -gnateS
 @cindex @option{-gnateS} (@command{gcc})
 Synonym of @option{-fdump-scos}, kept for backwards compatibility.
Index: opt.ads
===================================================================
--- opt.ads     (revision 206825)
+++ opt.ads     (working copy)
@@ -191,9 +191,8 @@
    Allow_Integer_Address : Boolean := False;
    --  GNAT
    --  Allow use of integer expression in a context requiring System.Address.
-   --  Set by the use of configuration pragma Allow_Integer_Address, or the
-   --  compiler switch -gnates. Also set in relaxed semantics mode for use
-   --  by CodePeer.
+   --  Set by the use of configuration pragma Allow_Integer_Address Also set
+   --  in relaxed semantics mode for use by CodePeer or when -gnatd.M is used.
 
    All_Sources : Boolean := False;
    --  GNATBIND
Index: sem_prag.adb
===================================================================
--- sem_prag.adb        (revision 206825)
+++ sem_prag.adb        (working copy)
@@ -9834,6 +9834,12 @@
          when Pragma_Allow_Integer_Address =>
             GNAT_Pragma;
             Check_Arg_Count (0);
+
+            if not Is_Private_Type (RTE (RE_Address)) then
+               Error_Pragma
+                 ("pragma% allowed only if Address is a private type");
+            end if;
+
             Opt.Allow_Integer_Address := True;
 
          --------------
Index: sem_res.adb
===================================================================
--- sem_res.adb (revision 206825)
+++ sem_res.adb (working copy)
@@ -2625,6 +2625,7 @@
                Rewrite
                  (N, Unchecked_Convert_To (RTE (RE_Address),
                   Relocate_Node (N)));
+               Analyze_And_Resolve (N, RTE (RE_Address));
                return;
 
             --  OK, not the special case go ahead and issue message
@@ -11645,6 +11646,7 @@
       then
          Rewrite (N,
            Unchecked_Convert_To (RTE (RE_Address), Relocate_Node (N)));
+         Analyze_And_Resolve (N, RTE (RE_Address));
          return True;
 
       --  Here we have a real conversion error
Index: switch-c.adb
===================================================================
--- switch-c.adb        (revision 206825)
+++ switch-c.adb        (working copy)
@@ -660,15 +660,6 @@
                   when 'P' =>
                      Treat_Categorization_Errors_As_Warnings := True;
 
-                  --  -gnates (allow integer expression for System.Address)
-
-                  --  Note: there is no VMS equivalent for this switch, since
-                  --  in VMS, System.Address is an integer type in any case.
-
-                  when 's' =>
-                     Allow_Integer_Address := True;
-                     Ptr := Ptr + 1;
-
                   --  -gnateS (generate SCO information)
 
                   --  Include Source Coverage Obligation information in ALI
Index: usage.adb
===================================================================
--- usage.adb   (revision 206825)
+++ usage.adb   (working copy)
@@ -236,11 +236,6 @@
    Write_Switch_Char ("eP");
    Write_Line ("Pure/Prelaborate errors generate warnings rather than errors");
 
-   --  Line fofr -gnates switch
-
-   Write_Switch_Char ("es");
-   Write_Line ("Allow integer expression for System.Address value");
-
    --  Line for -gnateS switch
 
    Write_Switch_Char ("eS");

Reply via email to