===================================================================
@@ -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
===================================================================
@@ -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);
===================================================================
@@ -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
===================================================================
@@ -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");
===================================================================
@@ -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,
===================================================================
@@ -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}
===================================================================
@@ -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;
===================================================================
@@ -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);
===================================================================
@@ -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;
===================================================================
@@ -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 |
===================================================================
@@ -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
===================================================================
@@ -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,