[Ada] New pragma Allow_Integer_Address

Arnaud Charlet charlet@adacore.com
Mon Jan 20 15:32:00 GMT 2014


The new configuration pragma Allow_Integer_Address sets a mode in which
expressions of an integer type may be used in constructs that normally
require an expression of type System.Address. The effect is to introduce
an implicit unchecked conversion from the integer type to type Address.

This mode is set automatically in the relaxed semantic mode activated by
debug flag -gnatd.M or when operating in codepeer mode.

The following package compiles without errors:

     1. pragma Allow_Integer_Address;
     2. with System; use System;
     3. package AddrAsInt is
     4.    X : Integer;
     5.    Y : Integer;
     6.    for X'Address use 16#1240#;
     7.    for Y use at 16#3230#;
     8.    m : Address := 16#4000#;
     9.    n : constant Address := 4000;
    10.    p : constant Address := Address (X + Y);
    11.    type R is new integer;
    12.    RR : R := 1000;
    13.    Z : Integer;
    14.    for Z'Address use RR;
    15. end AddrAsInt;

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

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

	* gnat1drv.adb: Set Allow_Integer_Address in relaxed semantics mode.
	* gnat_rm.texi: Document pragma Allow_Integer_Address.
	* gnat_ugn.texi: Document pragma Allow_Integer_Address, -gnates.
	* opt.ads: New flag Allow_Integer_Address.
	* par-prag.adb: Dummy entry for pragma Allow_Integer_Address.
	* sem_ch5.adb: Minor reformatting.
	* sem_prag.adb: Implement pragma Allow_Integer_Address.
	* sem_res.adb (Resolve): Allow integer address value if
	switch set.
	* sem_util.adb: Minor reformatting.
	* snames.ads-tmpl: Add entry for pragma Allow_Integer_Address.
	* switch-c.adb: Recognize flag -gnates.
	* usage.adb: Document flag -gnates.

-------------- next part --------------
Index: gnat_rm.texi
===================================================================
--- gnat_rm.texi	(revision 206821)
+++ gnat_rm.texi	(working copy)
@@ -104,6 +104,7 @@
 * Pragma Ada_2005::
 * Pragma Ada_12::
 * Pragma Ada_2012::
+* Pragma Allow_Integer_Address::
 * Pragma Annotate::
 * Pragma Assert::
 * Pragma Assert_And_Cut::
@@ -276,6 +277,7 @@
 * Aspect Abstract_State::
 * Aspect Ada_2005::
 * Aspect Ada_2012::
+* Pragma Allow_Integer_Address::
 * Aspect Compiler_Unit::
 * Aspect Contract_Cases::
 * Aspect Depends::
@@ -927,6 +929,7 @@
 * Pragma Ada_2005::
 * Pragma Ada_12::
 * Pragma Ada_2012::
+* Pragma Allow_Integer_Address::
 * Pragma Annotate::
 * Pragma Assert::
 * Pragma Assert_And_Cut::
@@ -1218,6 +1221,42 @@
 This configuration pragma is a synonym for pragma Ada_12 and has the
 same syntax and effect.
 
+@node Pragma Allow_Integer_Address
+@unnumberedsec Pragma Allow_Integer_Address
+@findex Allow_Integer_Address
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Allow_Integer_Address;
+@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
+@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
+integer value to type @code{System.Address}. The following example
+compiles without errors:
+
+@smallexample @c ada
+pragma Allow_Integer_Address;
+with System; use System;
+package AddrAsInt is
+   X : Integer;
+   Y : Integer;
+   for X'Address use 16#1240#;
+   for Y use at 16#3230#;
+   m : Address := 16#4000#;
+   n : constant Address := 4000;
+   p : constant Address := Address (X + Y);
+   type R is new integer;
+   RR : R := 1000;
+   Z : Integer;
+   for Z'Address use RR;
+end AddrAsInt;
+@end smallexample
+
 @node Pragma Annotate
 @unnumberedsec Pragma Annotate
 @findex Annotate
Index: sem_ch5.adb
===================================================================
--- sem_ch5.adb	(revision 206824)
+++ sem_ch5.adb	(working copy)
@@ -1695,8 +1695,8 @@
 
       Set_Ekind (Def_Id, E_Variable);
 
-      --  Provide a link between the iterator variable and the container,
-      --  for subequent use in cross-reference and modification information.
+      --  Provide a link between the iterator variable and the container, for
+      --  subsequent use in cross-reference and modification information.
 
       if Of_Present (N) then
          Set_Related_Expression (Def_Id, Iter_Name);
Index: switch-c.adb
===================================================================
--- switch-c.adb	(revision 206804)
+++ switch-c.adb	(working copy)
@@ -660,6 +660,15 @@
                   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 206804)
+++ usage.adb	(working copy)
@@ -236,6 +236,11 @@
    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");
Index: sem_prag.adb
===================================================================
--- sem_prag.adb	(revision 206821)
+++ sem_prag.adb	(working copy)
@@ -9825,6 +9825,17 @@
             end if;
          end All_Calls_Remote;
 
+         ---------------------------
+         -- Allow_Integer_Address --
+         ---------------------------
+
+         --  pragma Allow_Integer_Address;
+
+         when Pragma_Allow_Integer_Address =>
+            GNAT_Pragma;
+            Check_Arg_Count (0);
+            Opt.Allow_Integer_Address := True;
+
          --------------
          -- Annotate --
          --------------
@@ -22874,6 +22885,7 @@
       Pragma_Ada_12                         => -1,
       Pragma_Ada_2012                       => -1,
       Pragma_All_Calls_Remote               => -1,
+      Pragma_Allow_Integer_Address          => 0,
       Pragma_Annotate                       => -1,
       Pragma_Assert                         => -1,
       Pragma_Assert_And_Cut                 => -1,
Index: gnat_ugn.texi
===================================================================
--- gnat_ugn.texi	(revision 206823)
+++ gnat_ugn.texi	(working copy)
@@ -3821,9 +3821,16 @@
 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 backards compatibility.
+Synonym of @option{-fdump-scos}, kept for backwards compatibility.
 
 @item -gnatet=@var{path}
 @cindex @option{-gnatet=file} (@command{gcc})
@@ -11778,6 +11785,7 @@
    Ada_2005
    Ada_12
    Ada_2012
+   Allow_Integer_Address
    Annotate
    Assertion_Policy
    Assume_No_Invalid_Values
@@ -22818,6 +22826,8 @@
 
 @item  @code{Ada_2012}
 
+@item  @code{ALLOW_INTEGER_ADDRESS}
+
 @item  @code{ANNOTATE}
 
 @item  @code{ASSERT}
Index: sem_util.adb
===================================================================
--- sem_util.adb	(revision 206824)
+++ sem_util.adb	(working copy)
@@ -13081,7 +13081,7 @@
 
                   if Present (Related_Expression (Ent))
                     and then Nkind (Parent (Related_Expression (Ent))) =
-                      N_Iterator_Specification
+                                                   N_Iterator_Specification
                   then
                      Exp := Original_Node (Related_Expression (Ent));
                   end if;
Index: sem_res.adb
===================================================================
--- sem_res.adb	(revision 206824)
+++ sem_res.adb	(working copy)
@@ -2615,7 +2615,21 @@
             --  If an error message was issued already, Found got reset to
             --  True, so if it is still False, issue standard Wrong_Type msg.
 
-            if not Found then
+            --  First check for special case of Address wanted, integer found
+            --  with the configuration pragma Allow_Integer_Address active.
+
+            if Allow_Integer_Address
+              and then Is_RTE (Typ, RE_Address)
+              and then Is_Integer_Type (Etype (N))
+            then
+               Rewrite
+                 (N, Unchecked_Convert_To (RTE (RE_Address),
+                  Relocate_Node (N)));
+               return;
+
+            --  OK, not the special case go ahead and issue message
+
+            elsif not Found then
                if Is_Overloaded (N)
                  and then Nkind (N) = N_Function_Call
                then
@@ -11622,6 +11636,19 @@
             ("add ALL to }!", N, Target_Type);
          return False;
 
+      --  Deal with conversion of integer type to address if the pragma
+      --  Allow_Integer_Address is in effect.
+
+      elsif Allow_Integer_Address
+        and then Is_RTE (Etype (N), RE_Address)
+        and then Is_Integer_Type (Etype (Operand))
+      then
+         Rewrite (N,
+           Unchecked_Convert_To (RTE (RE_Address), Relocate_Node (N)));
+         return True;
+
+      --  Here we have a real conversion error
+
       else
          Conversion_Error_NE
            ("invalid conversion, not compatible with }", N, Opnd_Type);
Index: gnat1drv.adb
===================================================================
--- gnat1drv.adb	(revision 206817)
+++ gnat1drv.adb	(working copy)
@@ -293,6 +293,7 @@
       --  semantics mode.
 
       if Relaxed_RM_Semantics then
+         Opt.Allow_Integer_Address := True;
          Overriding_Renamings := True;
          Treat_Categorization_Errors_As_Warnings := True;
       end if;
Index: par-prag.adb
===================================================================
--- par-prag.adb	(revision 206804)
+++ par-prag.adb	(working copy)
@@ -1114,6 +1114,7 @@
            Pragma_Assume_No_Invalid_Values       |
            Pragma_AST_Entry                      |
            Pragma_All_Calls_Remote               |
+           Pragma_Allow_Integer_Address          |
            Pragma_Annotate                       |
            Pragma_Assert                         |
            Pragma_Assert_And_Cut                 |
Index: opt.ads
===================================================================
--- opt.ads	(revision 206815)
+++ opt.ads	(working copy)
@@ -188,6 +188,13 @@
    --  also repeated error messages for references to undefined identifiers
    --  and certain other repeated error messages. Set by use of -gnatf.
 
+   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.
+
    All_Sources : Boolean := False;
    --  GNATBIND
    --  Set to True to require all source files to be present. This flag is
Index: snames.ads-tmpl
===================================================================
--- snames.ads-tmpl	(revision 206804)
+++ snames.ads-tmpl	(working copy)
@@ -361,6 +361,7 @@
    Name_Ada_2005                       : constant Name_Id := N + $; -- GNAT
    Name_Ada_12                         : constant Name_Id := N + $; -- GNAT
    Name_Ada_2012                       : constant Name_Id := N + $; -- GNAT
+   Name_Allow_Integer_Address          : constant Name_Id := N + $; -- GNAT
    Name_Annotate                       : constant Name_Id := N + $; -- GNAT
    Name_Assertion_Policy               : constant Name_Id := N + $; -- Ada 05
    Name_Assume                         : constant Name_Id := N + $; -- GNAT
@@ -1709,6 +1710,7 @@
       Pragma_Ada_2005,
       Pragma_Ada_12,
       Pragma_Ada_2012,
+      Pragma_Allow_Integer_Address,
       Pragma_Annotate,
       Pragma_Assertion_Policy,
       Pragma_Assume,


More information about the Gcc-patches mailing list