+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.
+
+2014-01-20 Thomas Quinot <quinot@adacore.com>
+
+ * s-tadeca.adb: Fix minor typos in comment.
+
2014-01-20 Pascal Obry <obry@adacore.com>
* s-win32.ads (FreeLibrary): New import.
-- semantics mode.
if Relaxed_RM_Semantics then
+ Opt.Allow_Integer_Address := True;
Overriding_Renamings := True;
Treat_Categorization_Errors_As_Warnings := True;
end if;
* Pragma Ada_2005::
* Pragma Ada_12::
* Pragma Ada_2012::
+* Pragma Allow_Integer_Address::
* Pragma Annotate::
* Pragma Assert::
* Pragma Assert_And_Cut::
* Aspect Abstract_State::
* Aspect Ada_2005::
* Aspect Ada_2012::
+* Pragma Allow_Integer_Address::
* Aspect Compiler_Unit::
* Aspect Contract_Cases::
* Aspect Depends::
* Pragma Ada_2005::
* Pragma Ada_12::
* Pragma Ada_2012::
+* Pragma Allow_Integer_Address::
* Pragma Annotate::
* Pragma Assert::
* Pragma Assert_And_Cut::
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
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})
Ada_2005
Ada_12
Ada_2012
+ Allow_Integer_Address
Annotate
Assertion_Policy
Assume_No_Invalid_Values
@item @code{Ada_2012}
+@item @code{ALLOW_INTEGER_ADDRESS}
+
@item @code{ANNOTATE}
@item @code{ASSERT}
-- 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
Pragma_Assume_No_Invalid_Values |
Pragma_AST_Entry |
Pragma_All_Calls_Remote |
+ Pragma_Allow_Integer_Address |
Pragma_Annotate |
Pragma_Assert |
Pragma_Assert_And_Cut |
end if;
-- T is expressed as a duration elapsed since the UNIX epoch, whereas
- -- Time_Enque expects duraction elapsed since the epoch of the Ada real-
+ -- Time_Enqueue expects duration elapsed since the epoch of the Ada real-
-- time clock: compensate if necessary.
-- Comparison "SOSC.CLOCK_RT_Ada = SOSC.CLOCK_REALTIME" is compile
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);
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 --
--------------
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,
-- 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
("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);
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;
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
Pragma_Ada_2005,
Pragma_Ada_12,
Pragma_Ada_2012,
+ Pragma_Allow_Integer_Address,
Pragma_Annotate,
Pragma_Assertion_Policy,
Pragma_Assume,
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
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");