aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/ada/gnat_rm.texi
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/ada/gnat_rm.texi')
-rw-r--r--gcc-4.9/gcc/ada/gnat_rm.texi22256
1 files changed, 22256 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/ada/gnat_rm.texi b/gcc-4.9/gcc/ada/gnat_rm.texi
new file mode 100644
index 000000000..138551df3
--- /dev/null
+++ b/gcc-4.9/gcc/ada/gnat_rm.texi
@@ -0,0 +1,22256 @@
+\input texinfo @c -*-texinfo-*-
+
+@c %**start of header
+
+@c oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
+@c o
+@c GNAT DOCUMENTATION o
+@c o
+@c G N A T _ RM o
+@c o
+@c GNAT is maintained by Ada Core Technologies Inc (http://www.gnat.com). o
+@c o
+@c oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
+
+@setfilename gnat_rm.info
+
+@copying
+Copyright @copyright{} 1995-2012, Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover Texts being ``GNAT Reference
+Manual'', and with no Back-Cover Texts. A copy of the license is
+included in the section entitled ``GNU Free Documentation License''.
+@end copying
+
+@set EDITION GNAT
+
+@settitle GNAT Reference Manual
+
+@setchapternewpage odd
+@syncodeindex fn cp
+
+@include gcc-common.texi
+
+@dircategory GNU Ada tools
+@direntry
+* GNAT Reference Manual: (gnat_rm). Reference Manual for GNU Ada tools.
+@end direntry
+
+@titlepage
+@title GNAT Reference Manual
+@subtitle GNAT, The GNU Ada Development Environment
+@versionsubtitle
+@author AdaCore
+@page
+@vskip 0pt plus 1filll
+
+@insertcopying
+
+@end titlepage
+
+@ifnottex
+@node Top, About This Guide, (dir), (dir)
+@top GNAT Reference Manual
+
+@noindent
+GNAT Reference Manual
+
+@noindent
+GNAT, The GNU Ada Development Environment@*
+GCC version @value{version-GCC}@*
+
+@noindent
+AdaCore
+
+@menu
+* About This Guide::
+* Implementation Defined Pragmas::
+* Implementation Defined Aspects::
+* Implementation Defined Attributes::
+* Standard and Implementation Defined Restrictions::
+* Implementation Advice::
+* Implementation Defined Characteristics::
+* Intrinsic Subprograms::
+* Representation Clauses and Pragmas::
+* Standard Library Routines::
+* The Implementation of Standard I/O::
+* The GNAT Library::
+* Interfacing to Other Languages::
+* Specialized Needs Annexes::
+* Implementation of Specific Ada Features::
+* Implementation of Ada 2012 Features::
+* Obsolescent Features::
+* GNU Free Documentation License::
+* Index::
+
+ --- The Detailed Node Listing ---
+
+About This Guide
+
+* What This Reference Manual Contains::
+* Related Information::
+
+Implementation Defined Pragmas
+
+* Pragma Abort_Defer::
+* Pragma Abstract_State::
+* Pragma Ada_83::
+* Pragma Ada_95::
+* Pragma Ada_05::
+* Pragma Ada_2005::
+* Pragma Ada_12::
+* Pragma Ada_2012::
+* Pragma Allow_Integer_Address::
+* Pragma Annotate::
+* Pragma Assert::
+* Pragma Assert_And_Cut::
+* Pragma Assertion_Policy::
+* Pragma Assume::
+* Pragma Assume_No_Invalid_Values::
+* Pragma Attribute_Definition::
+* Pragma Ast_Entry::
+* Pragma C_Pass_By_Copy::
+* Pragma Check::
+* Pragma Check_Float_Overflow::
+* Pragma Check_Name::
+* Pragma Check_Policy::
+* Pragma CIL_Constructor::
+* Pragma Comment::
+* Pragma Common_Object::
+* Pragma Compile_Time_Error::
+* Pragma Compile_Time_Warning::
+* Pragma Compiler_Unit::
+* Pragma Compiler_Unit_Warning::
+* Pragma Complete_Representation::
+* Pragma Complex_Representation::
+* Pragma Component_Alignment::
+* Pragma Contract_Cases::
+* Pragma Convention_Identifier::
+* Pragma CPP_Class::
+* Pragma CPP_Constructor::
+* Pragma CPP_Virtual::
+* Pragma CPP_Vtable::
+* Pragma CPU::
+* Pragma Debug::
+* Pragma Debug_Policy::
+* Pragma Default_Storage_Pool::
+* Pragma Depends::
+* Pragma Detect_Blocking::
+* Pragma Disable_Atomic_Synchronization::
+* Pragma Dispatching_Domain::
+* Pragma Elaboration_Checks::
+* Pragma Eliminate::
+* Pragma Enable_Atomic_Synchronization::
+* Pragma Export_Exception::
+* Pragma Export_Function::
+* Pragma Export_Object::
+* Pragma Export_Procedure::
+* Pragma Export_Value::
+* Pragma Export_Valued_Procedure::
+* Pragma Extend_System::
+* Pragma Extensions_Allowed::
+* Pragma External::
+* Pragma External_Name_Casing::
+* Pragma Fast_Math::
+* Pragma Favor_Top_Level::
+* Pragma Finalize_Storage_Only::
+* Pragma Float_Representation::
+* Pragma Global::
+* Pragma Ident::
+* Pragma Implementation_Defined::
+* Pragma Implemented::
+* Pragma Implicit_Packing::
+* Pragma Import_Exception::
+* Pragma Import_Function::
+* Pragma Import_Object::
+* Pragma Import_Procedure::
+* Pragma Import_Valued_Procedure::
+* Pragma Independent::
+* Pragma Independent_Components::
+* Pragma Initial_Condition::
+* Pragma Initialize_Scalars::
+* Pragma Initializes::
+* Pragma Inline_Always::
+* Pragma Inline_Generic::
+* Pragma Interface::
+* Pragma Interface_Name::
+* Pragma Interrupt_Handler::
+* Pragma Interrupt_State::
+* Pragma Invariant::
+* Pragma Java_Constructor::
+* Pragma Java_Interface::
+* Pragma Keep_Names::
+* Pragma License::
+* Pragma Link_With::
+* Pragma Linker_Alias::
+* Pragma Linker_Constructor::
+* Pragma Linker_Destructor::
+* Pragma Linker_Section::
+* Pragma Long_Float::
+* Pragma Loop_Invariant::
+* Pragma Loop_Optimize::
+* Pragma Loop_Variant::
+* Pragma Machine_Attribute::
+* Pragma Main::
+* Pragma Main_Storage::
+* Pragma No_Body::
+* Pragma No_Inline::
+* Pragma No_Return::
+* Pragma No_Run_Time::
+* Pragma No_Strict_Aliasing ::
+* Pragma Normalize_Scalars::
+* Pragma Obsolescent::
+* Pragma Optimize_Alignment::
+* Pragma Ordered::
+* Pragma Overflow_Mode::
+* Pragma Overriding_Renamings::
+* Pragma Partition_Elaboration_Policy::
+* Pragma Passive::
+* Pragma Persistent_BSS::
+* Pragma Polling::
+* Pragma Post::
+* Pragma Postcondition::
+* Pragma Post_Class::
+* Pragma Pre::
+* Pragma Precondition::
+* Pragma Predicate::
+* Pragma Preelaborable_Initialization::
+* Pragma Preelaborate_05::
+* Pragma Pre_Class::
+* Pragma Priority_Specific_Dispatching::
+* Pragma Profile::
+* Pragma Profile_Warnings::
+* Pragma Propagate_Exceptions::
+* Pragma Provide_Shift_Operators::
+* Pragma Psect_Object::
+* Pragma Pure_05::
+* Pragma Pure_12::
+* Pragma Pure_Function::
+* Pragma Ravenscar::
+* Pragma Refined_State::
+* Pragma Relative_Deadline::
+* Pragma Remote_Access_Type::
+* Pragma Restricted_Run_Time::
+* Pragma Restriction_Warnings::
+* Pragma Reviewable::
+* Pragma Share_Generic::
+* Pragma Shared::
+* Pragma Short_Circuit_And_Or::
+* Pragma Short_Descriptors::
+* Pragma Simple_Storage_Pool_Type::
+* Pragma Source_File_Name::
+* Pragma Source_File_Name_Project::
+* Pragma Source_Reference::
+* Pragma SPARK_Mode::
+* Pragma Static_Elaboration_Desired::
+* Pragma Stream_Convert::
+* Pragma Style_Checks::
+* Pragma Subtitle::
+* Pragma Suppress::
+* Pragma Suppress_All::
+* Pragma Suppress_Debug_Info::
+* Pragma Suppress_Exception_Locations::
+* Pragma Suppress_Initialization::
+* Pragma Task_Info::
+* Pragma Task_Name::
+* Pragma Task_Storage::
+* Pragma Test_Case::
+* Pragma Thread_Local_Storage::
+* Pragma Time_Slice::
+* Pragma Title::
+* Pragma Type_Invariant::
+* Pragma Type_Invariant_Class::
+* Pragma Unchecked_Union::
+* Pragma Unimplemented_Unit::
+* Pragma Universal_Aliasing ::
+* Pragma Universal_Data::
+* Pragma Unmodified::
+* Pragma Unreferenced::
+* Pragma Unreferenced_Objects::
+* Pragma Unreserve_All_Interrupts::
+* Pragma Unsuppress::
+* Pragma Use_VADS_Size::
+* Pragma Validity_Checks::
+* Pragma Volatile::
+* Pragma Warning_As_Error::
+* Pragma Warnings::
+* Pragma Weak_External::
+* Pragma Wide_Character_Encoding::
+
+Implementation Defined Aspects
+
+* Aspect Abstract_State::
+* Aspect Contract_Cases::
+* Aspect Depends::
+* Aspect Dimension::
+* Aspect Dimension_System::
+* Aspect Favor_Top_Level::
+* Aspect Global::
+* Aspect Initial_Condition::
+* Aspect Initializes::
+* Aspect Inline_Always::
+* Aspect Invariant::
+* Aspect Linker_Section::
+* Aspect Object_Size::
+* Aspect Persistent_BSS::
+* Aspect Predicate::
+* Aspect Preelaborate_05::
+* Aspect Pure_05::
+* Aspect Pure_12::
+* Aspect Pure_Function::
+* Aspect Refined_State::
+* Aspect Remote_Access_Type::
+* Aspect Scalar_Storage_Order::
+* Aspect Shared::
+* Aspect Simple_Storage_Pool::
+* Aspect Simple_Storage_Pool_Type::
+* Aspect SPARK_Mode::
+* Aspect Suppress_Debug_Info::
+* Aspect Test_Case::
+* Aspect Universal_Aliasing::
+* Aspect Universal_Data::
+* Aspect Unmodified::
+* Aspect Unreferenced::
+* Aspect Unreferenced_Objects::
+* Aspect Value_Size::
+* Aspect Warnings::
+
+Implementation Defined Attributes
+
+* Attribute Abort_Signal::
+* Attribute Address_Size::
+* Attribute Asm_Input::
+* Attribute Asm_Output::
+* Attribute AST_Entry::
+* Attribute Bit::
+* Attribute Bit_Position::
+* Attribute Compiler_Version::
+* Attribute Code_Address::
+* Attribute Default_Bit_Order::
+* Attribute Descriptor_Size::
+* Attribute Elaborated::
+* Attribute Elab_Body::
+* Attribute Elab_Spec::
+* Attribute Elab_Subp_Body::
+* Attribute Emax::
+* Attribute Enabled::
+* Attribute Enum_Rep::
+* Attribute Enum_Val::
+* Attribute Epsilon::
+* Attribute Fixed_Value::
+* Attribute Has_Access_Values::
+* Attribute Has_Discriminants::
+* Attribute Img::
+* Attribute Integer_Value::
+* Attribute Invalid_Value::
+* Attribute Large::
+* Attribute Library_Level::
+* Attribute Loop_Entry::
+* Attribute Machine_Size::
+* Attribute Mantissa::
+* Attribute Max_Interrupt_Priority::
+* Attribute Max_Priority::
+* Attribute Maximum_Alignment::
+* Attribute Mechanism_Code::
+* Attribute Null_Parameter::
+* Attribute Object_Size::
+* Attribute Passed_By_Reference::
+* Attribute Pool_Address::
+* Attribute Range_Length::
+* Attribute Ref::
+* Attribute Restriction_Set::
+* Attribute Result::
+* Attribute Safe_Emax::
+* Attribute Safe_Large::
+* Attribute Scalar_Storage_Order::
+* Attribute Simple_Storage_Pool::
+* Attribute Small::
+* Attribute Storage_Unit::
+* Attribute Stub_Type::
+* Attribute System_Allocator_Alignment::
+* Attribute Target_Name::
+* Attribute Tick::
+* Attribute To_Address::
+* Attribute Type_Class::
+* Attribute UET_Address::
+* Attribute Unconstrained_Array::
+* Attribute Universal_Literal_String::
+* Attribute Unrestricted_Access::
+* Attribute Update::
+* Attribute Valid_Scalars::
+* Attribute VADS_Size::
+* Attribute Value_Size::
+* Attribute Wchar_T_Size::
+* Attribute Word_Size::
+
+Standard and Implementation Defined Restrictions
+
+* Partition-Wide Restrictions::
+* Program Unit Level Restrictions::
+
+Partition-Wide Restrictions
+
+* Immediate_Reclamation::
+* Max_Asynchronous_Select_Nesting::
+* Max_Entry_Queue_Length::
+* Max_Protected_Entries::
+* Max_Select_Alternatives::
+* Max_Storage_At_Blocking::
+* Max_Task_Entries::
+* Max_Tasks::
+* No_Abort_Statements::
+* No_Access_Parameter_Allocators::
+* No_Access_Subprograms::
+* No_Allocators::
+* No_Anonymous_Allocators::
+* No_Calendar::
+* No_Coextensions::
+* No_Default_Initialization::
+* No_Delay::
+* No_Dependence::
+* No_Direct_Boolean_Operators::
+* No_Dispatch::
+* No_Dispatching_Calls::
+* No_Dynamic_Attachment::
+* No_Dynamic_Priorities::
+* No_Entry_Calls_In_Elaboration_Code::
+* No_Enumeration_Maps::
+* No_Exception_Handlers::
+* No_Exception_Propagation::
+* No_Exception_Registration::
+* No_Exceptions::
+* No_Finalization::
+* No_Fixed_Point::
+* No_Floating_Point::
+* No_Implicit_Conditionals::
+* No_Implicit_Dynamic_Code::
+* No_Implicit_Heap_Allocations::
+* No_Implicit_Loops::
+* No_Initialize_Scalars::
+* No_IO::
+* No_Local_Allocators::
+* No_Local_Protected_Objects::
+* No_Local_Timing_Events::
+* No_Nested_Finalization::
+* No_Protected_Type_Allocators::
+* No_Protected_Types::
+* No_Recursion::
+* No_Reentrancy::
+* No_Relative_Delay::
+* No_Requeue_Statements::
+* No_Secondary_Stack::
+* No_Select_Statements::
+* No_Specific_Termination_Handlers::
+* No_Specification_of_Aspect::
+* No_Standard_Allocators_After_Elaboration::
+* No_Standard_Storage_Pools::
+* No_Stream_Optimizations::
+* No_Streams::
+* No_Task_Allocators::
+* No_Task_Attributes_Package::
+* No_Task_Hierarchy::
+* No_Task_Termination::
+* No_Tasking::
+* No_Terminate_Alternatives::
+* No_Unchecked_Access::
+* Simple_Barriers::
+* Static_Priorities::
+* Static_Storage_Size::
+
+Program Unit Level Restrictions
+
+* No_Elaboration_Code::
+* No_Entry_Queue::
+* No_Implementation_Aspect_Specifications::
+* No_Implementation_Attributes::
+* No_Implementation_Identifiers::
+* No_Implementation_Pragmas::
+* No_Implementation_Restrictions::
+* No_Implementation_Units::
+* No_Implicit_Aliasing::
+* No_Obsolescent_Features::
+* No_Wide_Characters::
+* SPARK_05::
+
+The Implementation of Standard I/O
+
+* Standard I/O Packages::
+* FORM Strings::
+* Direct_IO::
+* Sequential_IO::
+* Text_IO::
+* Wide_Text_IO::
+* Wide_Wide_Text_IO::
+* Stream_IO::
+* Text Translation::
+* Shared Files::
+* Filenames encoding::
+* Open Modes::
+* Operations on C Streams::
+* Interfacing to C Streams::
+
+The GNAT Library
+
+* Ada.Characters.Latin_9 (a-chlat9.ads)::
+* Ada.Characters.Wide_Latin_1 (a-cwila1.ads)::
+* Ada.Characters.Wide_Latin_9 (a-cwila9.ads)::
+* Ada.Characters.Wide_Wide_Latin_1 (a-chzla1.ads)::
+* Ada.Characters.Wide_Wide_Latin_9 (a-chzla9.ads)::
+* Ada.Containers.Formal_Doubly_Linked_Lists (a-cfdlli.ads)::
+* Ada.Containers.Formal_Hashed_Maps (a-cfhama.ads)::
+* Ada.Containers.Formal_Hashed_Sets (a-cfhase.ads)::
+* Ada.Containers.Formal_Ordered_Maps (a-cforma.ads)::
+* Ada.Containers.Formal_Ordered_Sets (a-cforse.ads)::
+* Ada.Containers.Formal_Vectors (a-cofove.ads)::
+* Ada.Command_Line.Environment (a-colien.ads)::
+* Ada.Command_Line.Remove (a-colire.ads)::
+* Ada.Command_Line.Response_File (a-clrefi.ads)::
+* Ada.Direct_IO.C_Streams (a-diocst.ads)::
+* Ada.Exceptions.Is_Null_Occurrence (a-einuoc.ads)::
+* Ada.Exceptions.Last_Chance_Handler (a-elchha.ads)::
+* Ada.Exceptions.Traceback (a-exctra.ads)::
+* Ada.Sequential_IO.C_Streams (a-siocst.ads)::
+* Ada.Streams.Stream_IO.C_Streams (a-ssicst.ads)::
+* Ada.Strings.Unbounded.Text_IO (a-suteio.ads)::
+* Ada.Strings.Wide_Unbounded.Wide_Text_IO (a-swuwti.ads)::
+* Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO (a-szuzti.ads)::
+* Ada.Text_IO.C_Streams (a-tiocst.ads)::
+* Ada.Text_IO.Reset_Standard_Files (a-tirsfi.ads)::
+* Ada.Wide_Characters.Unicode (a-wichun.ads)::
+* Ada.Wide_Text_IO.C_Streams (a-wtcstr.ads)::
+* Ada.Wide_Text_IO.Reset_Standard_Files (a-wrstfi.ads)::
+* Ada.Wide_Wide_Characters.Unicode (a-zchuni.ads)::
+* Ada.Wide_Wide_Text_IO.C_Streams (a-ztcstr.ads)::
+* Ada.Wide_Wide_Text_IO.Reset_Standard_Files (a-zrstfi.ads)::
+* GNAT.Altivec (g-altive.ads)::
+* GNAT.Altivec.Conversions (g-altcon.ads)::
+* GNAT.Altivec.Vector_Operations (g-alveop.ads)::
+* GNAT.Altivec.Vector_Types (g-alvety.ads)::
+* GNAT.Altivec.Vector_Views (g-alvevi.ads)::
+* GNAT.Array_Split (g-arrspl.ads)::
+* GNAT.AWK (g-awk.ads)::
+* GNAT.Bounded_Buffers (g-boubuf.ads)::
+* GNAT.Bounded_Mailboxes (g-boumai.ads)::
+* GNAT.Bubble_Sort (g-bubsor.ads)::
+* GNAT.Bubble_Sort_A (g-busora.ads)::
+* GNAT.Bubble_Sort_G (g-busorg.ads)::
+* GNAT.Byte_Order_Mark (g-byorma.ads)::
+* GNAT.Byte_Swapping (g-bytswa.ads)::
+* GNAT.Calendar (g-calend.ads)::
+* GNAT.Calendar.Time_IO (g-catiio.ads)::
+* GNAT.Case_Util (g-casuti.ads)::
+* GNAT.CGI (g-cgi.ads)::
+* GNAT.CGI.Cookie (g-cgicoo.ads)::
+* GNAT.CGI.Debug (g-cgideb.ads)::
+* GNAT.Command_Line (g-comlin.ads)::
+* GNAT.Compiler_Version (g-comver.ads)::
+* GNAT.Ctrl_C (g-ctrl_c.ads)::
+* GNAT.CRC32 (g-crc32.ads)::
+* GNAT.Current_Exception (g-curexc.ads)::
+* GNAT.Debug_Pools (g-debpoo.ads)::
+* GNAT.Debug_Utilities (g-debuti.ads)::
+* GNAT.Decode_String (g-decstr.ads)::
+* GNAT.Decode_UTF8_String (g-deutst.ads)::
+* GNAT.Directory_Operations (g-dirope.ads)::
+* GNAT.Directory_Operations.Iteration (g-diopit.ads)::
+* GNAT.Dynamic_HTables (g-dynhta.ads)::
+* GNAT.Dynamic_Tables (g-dyntab.ads)::
+* GNAT.Encode_String (g-encstr.ads)::
+* GNAT.Encode_UTF8_String (g-enutst.ads)::
+* GNAT.Exception_Actions (g-excact.ads)::
+* GNAT.Exception_Traces (g-exctra.ads)::
+* GNAT.Exceptions (g-except.ads)::
+* GNAT.Expect (g-expect.ads)::
+* GNAT.Expect.TTY (g-exptty.ads)::
+* GNAT.Float_Control (g-flocon.ads)::
+* GNAT.Heap_Sort (g-heasor.ads)::
+* GNAT.Heap_Sort_A (g-hesora.ads)::
+* GNAT.Heap_Sort_G (g-hesorg.ads)::
+* GNAT.HTable (g-htable.ads)::
+* GNAT.IO (g-io.ads)::
+* GNAT.IO_Aux (g-io_aux.ads)::
+* GNAT.Lock_Files (g-locfil.ads)::
+* GNAT.MBBS_Discrete_Random (g-mbdira.ads)::
+* GNAT.MBBS_Float_Random (g-mbflra.ads)::
+* GNAT.MD5 (g-md5.ads)::
+* GNAT.Memory_Dump (g-memdum.ads)::
+* GNAT.Most_Recent_Exception (g-moreex.ads)::
+* GNAT.OS_Lib (g-os_lib.ads)::
+* GNAT.Perfect_Hash_Generators (g-pehage.ads)::
+* GNAT.Random_Numbers (g-rannum.ads)::
+* GNAT.Regexp (g-regexp.ads)::
+* GNAT.Registry (g-regist.ads)::
+* GNAT.Regpat (g-regpat.ads)::
+* GNAT.Secondary_Stack_Info (g-sestin.ads)::
+* GNAT.Semaphores (g-semaph.ads)::
+* GNAT.Serial_Communications (g-sercom.ads)::
+* GNAT.SHA1 (g-sha1.ads)::
+* GNAT.SHA224 (g-sha224.ads)::
+* GNAT.SHA256 (g-sha256.ads)::
+* GNAT.SHA384 (g-sha384.ads)::
+* GNAT.SHA512 (g-sha512.ads)::
+* GNAT.Signals (g-signal.ads)::
+* GNAT.Sockets (g-socket.ads)::
+* GNAT.Source_Info (g-souinf.ads)::
+* GNAT.Spelling_Checker (g-speche.ads)::
+* GNAT.Spelling_Checker_Generic (g-spchge.ads)::
+* GNAT.Spitbol.Patterns (g-spipat.ads)::
+* GNAT.Spitbol (g-spitbo.ads)::
+* GNAT.Spitbol.Table_Boolean (g-sptabo.ads)::
+* GNAT.Spitbol.Table_Integer (g-sptain.ads)::
+* GNAT.Spitbol.Table_VString (g-sptavs.ads)::
+* GNAT.SSE (g-sse.ads)::
+* GNAT.SSE.Vector_Types (g-ssvety.ads)::
+* GNAT.Strings (g-string.ads)::
+* GNAT.String_Split (g-strspl.ads)::
+* GNAT.Table (g-table.ads)::
+* GNAT.Task_Lock (g-tasloc.ads)::
+* GNAT.Threads (g-thread.ads)::
+* GNAT.Time_Stamp (g-timsta.ads)::
+* GNAT.Traceback (g-traceb.ads)::
+* GNAT.Traceback.Symbolic (g-trasym.ads)::
+* GNAT.UTF_32 (g-utf_32.ads)::
+* GNAT.UTF_32_Spelling_Checker (g-u3spch.ads)::
+* GNAT.Wide_Spelling_Checker (g-wispch.ads)::
+* GNAT.Wide_String_Split (g-wistsp.ads)::
+* GNAT.Wide_Wide_Spelling_Checker (g-zspche.ads)::
+* GNAT.Wide_Wide_String_Split (g-zistsp.ads)::
+* Interfaces.C.Extensions (i-cexten.ads)::
+* Interfaces.C.Streams (i-cstrea.ads)::
+* Interfaces.CPP (i-cpp.ads)::
+* Interfaces.Packed_Decimal (i-pacdec.ads)::
+* Interfaces.VxWorks (i-vxwork.ads)::
+* Interfaces.VxWorks.IO (i-vxwoio.ads)::
+* System.Address_Image (s-addima.ads)::
+* System.Assertions (s-assert.ads)::
+* System.Memory (s-memory.ads)::
+* System.Multiprocessors (s-multip.ads)::
+* System.Multiprocessors.Dispatching_Domains (s-mudido.ads)::
+* System.Partition_Interface (s-parint.ads)::
+* System.Pool_Global (s-pooglo.ads)::
+* System.Pool_Local (s-pooloc.ads)::
+* System.Restrictions (s-restri.ads)::
+* System.Rident (s-rident.ads)::
+* System.Strings.Stream_Ops (s-ststop.ads)::
+* System.Task_Info (s-tasinf.ads)::
+* System.Wch_Cnv (s-wchcnv.ads)::
+* System.Wch_Con (s-wchcon.ads)::
+
+Text_IO
+
+* Text_IO Stream Pointer Positioning::
+* Text_IO Reading and Writing Non-Regular Files::
+* Get_Immediate::
+* Treating Text_IO Files as Streams::
+* Text_IO Extensions::
+* Text_IO Facilities for Unbounded Strings::
+
+Wide_Text_IO
+
+* Wide_Text_IO Stream Pointer Positioning::
+* Wide_Text_IO Reading and Writing Non-Regular Files::
+
+Wide_Wide_Text_IO
+
+* Wide_Wide_Text_IO Stream Pointer Positioning::
+* Wide_Wide_Text_IO Reading and Writing Non-Regular Files::
+
+Interfacing to Other Languages
+
+* Interfacing to C::
+* Interfacing to C++::
+* Interfacing to COBOL::
+* Interfacing to Fortran::
+* Interfacing to non-GNAT Ada code::
+
+Specialized Needs Annexes
+
+Implementation of Specific Ada Features
+* Machine Code Insertions::
+* GNAT Implementation of Tasking::
+* GNAT Implementation of Shared Passive Packages::
+* Code Generation for Array Aggregates::
+* The Size of Discriminated Records with Default Discriminants::
+* Strict Conformance to the Ada Reference Manual::
+
+Implementation of Ada 2012 Features
+
+Obsolescent Features
+
+GNU Free Documentation License
+
+Index
+@end menu
+
+@end ifnottex
+
+@node About This Guide
+@unnumbered About This Guide
+
+@noindent
+This manual contains useful information in writing programs using the
+@value{EDITION} compiler. It includes information on implementation dependent
+characteristics of @value{EDITION}, including all the information required by
+Annex M of the Ada language standard.
+
+@value{EDITION} implements Ada 95, Ada 2005 and Ada 2012, and it may also be
+invoked in Ada 83 compatibility mode.
+By default, @value{EDITION} assumes Ada 2012,
+but you can override with a compiler switch
+to explicitly specify the language version.
+(Please refer to @ref{Compiling Different Versions of Ada,,, gnat_ugn,
+@value{EDITION} User's Guide}, for details on these switches.)
+Throughout this manual, references to ``Ada'' without a year suffix
+apply to all the Ada versions of the language.
+
+Ada is designed to be highly portable.
+In general, a program will have the same effect even when compiled by
+different compilers on different platforms.
+However, since Ada is designed to be used in a
+wide variety of applications, it also contains a number of system
+dependent features to be used in interfacing to the external world.
+@cindex Implementation-dependent features
+@cindex Portability
+
+Note: Any program that makes use of implementation-dependent features
+may be non-portable. You should follow good programming practice and
+isolate and clearly document any sections of your program that make use
+of these features in a non-portable manner.
+
+@ifset PROEDITION
+For ease of exposition, ``@value{EDITION}'' will be referred to simply as
+``GNAT'' in the remainder of this document.
+@end ifset
+
+@menu
+* What This Reference Manual Contains::
+* Conventions::
+* Related Information::
+@end menu
+
+@node What This Reference Manual Contains
+@unnumberedsec What This Reference Manual Contains
+
+@noindent
+This reference manual contains the following chapters:
+
+@itemize @bullet
+@item
+@ref{Implementation Defined Pragmas}, lists GNAT implementation-dependent
+pragmas, which can be used to extend and enhance the functionality of the
+compiler.
+
+@item
+@ref{Implementation Defined Attributes}, lists GNAT
+implementation-dependent attributes, which can be used to extend and
+enhance the functionality of the compiler.
+
+@item
+@ref{Standard and Implementation Defined Restrictions}, lists GNAT
+implementation-dependent restrictions, which can be used to extend and
+enhance the functionality of the compiler.
+
+@item
+@ref{Implementation Advice}, provides information on generally
+desirable behavior which are not requirements that all compilers must
+follow since it cannot be provided on all systems, or which may be
+undesirable on some systems.
+
+@item
+@ref{Implementation Defined Characteristics}, provides a guide to
+minimizing implementation dependent features.
+
+@item
+@ref{Intrinsic Subprograms}, describes the intrinsic subprograms
+implemented by GNAT, and how they can be imported into user
+application programs.
+
+@item
+@ref{Representation Clauses and Pragmas}, describes in detail the
+way that GNAT represents data, and in particular the exact set
+of representation clauses and pragmas that is accepted.
+
+@item
+@ref{Standard Library Routines}, provides a listing of packages and a
+brief description of the functionality that is provided by Ada's
+extensive set of standard library routines as implemented by GNAT@.
+
+@item
+@ref{The Implementation of Standard I/O}, details how the GNAT
+implementation of the input-output facilities.
+
+@item
+@ref{The GNAT Library}, is a catalog of packages that complement
+the Ada predefined library.
+
+@item
+@ref{Interfacing to Other Languages}, describes how programs
+written in Ada using GNAT can be interfaced to other programming
+languages.
+
+@ref{Specialized Needs Annexes}, describes the GNAT implementation of all
+of the specialized needs annexes.
+
+@item
+@ref{Implementation of Specific Ada Features}, discusses issues related
+to GNAT's implementation of machine code insertions, tasking, and several
+other features.
+
+@item
+@ref{Implementation of Ada 2012 Features}, describes the status of the
+GNAT implementation of the Ada 2012 language standard.
+
+@item
+@ref{Obsolescent Features} documents implementation dependent features,
+including pragmas and attributes, which are considered obsolescent, since
+there are other preferred ways of achieving the same results. These
+obsolescent forms are retained for backwards compatibility.
+
+@end itemize
+
+@cindex Ada 95 Language Reference Manual
+@cindex Ada 2005 Language Reference Manual
+@noindent
+This reference manual assumes a basic familiarity with the Ada 95 language, as
+described in the International Standard ANSI/ISO/IEC-8652:1995,
+January 1995.
+It does not require knowledge of the new features introduced by Ada 2005,
+(officially known as ISO/IEC 8652:1995 with Technical Corrigendum 1
+and Amendment 1).
+Both reference manuals are included in the GNAT documentation
+package.
+
+@node Conventions
+@unnumberedsec Conventions
+@cindex Conventions, typographical
+@cindex Typographical conventions
+
+@noindent
+Following are examples of the typographical and graphic conventions used
+in this guide:
+
+@itemize @bullet
+@item
+@code{Functions}, @code{utility program names}, @code{standard names},
+and @code{classes}.
+
+@item
+@code{Option flags}
+
+@item
+@file{File names}, @samp{button names}, and @samp{field names}.
+
+@item
+@code{Variables}, @env{environment variables}, and @var{metasyntactic
+variables}.
+
+@item
+@emph{Emphasis}.
+
+@item
+[optional information or parameters]
+
+@item
+Examples are described by text
+@smallexample
+and then shown this way.
+@end smallexample
+@end itemize
+
+@noindent
+Commands that are entered by the user are preceded in this manual by the
+characters @samp{$ } (dollar sign followed by space). If your system uses this
+sequence as a prompt, then the commands will appear exactly as you see them
+in the manual. If your system uses some other prompt, then the command will
+appear with the @samp{$} replaced by whatever prompt character you are using.
+
+@node Related Information
+@unnumberedsec Related Information
+@noindent
+See the following documents for further information on GNAT:
+
+@itemize @bullet
+@item
+@xref{Top, @value{EDITION} User's Guide, About This Guide, gnat_ugn,
+@value{EDITION} User's Guide}, which provides information on how to use the
+GNAT compiler system.
+
+@item
+@cite{Ada 95 Reference Manual}, which contains all reference
+material for the Ada 95 programming language.
+
+@item
+@cite{Ada 95 Annotated Reference Manual}, which is an annotated version
+of the Ada 95 standard. The annotations describe
+detailed aspects of the design decision, and in particular contain useful
+sections on Ada 83 compatibility.
+
+@item
+@cite{Ada 2005 Reference Manual}, which contains all reference
+material for the Ada 2005 programming language.
+
+@item
+@cite{Ada 2005 Annotated Reference Manual}, which is an annotated version
+of the Ada 2005 standard. The annotations describe
+detailed aspects of the design decision, and in particular contain useful
+sections on Ada 83 and Ada 95 compatibility.
+
+@item
+@cite{DEC Ada, Technical Overview and Comparison on DIGITAL Platforms},
+which contains specific information on compatibility between GNAT and
+DEC Ada 83 systems.
+
+@item
+@cite{DEC Ada, Language Reference Manual, part number AA-PYZAB-TK} which
+describes in detail the pragmas and attributes provided by the DEC Ada 83
+compiler system.
+
+@end itemize
+
+@node Implementation Defined Pragmas
+@chapter Implementation Defined Pragmas
+
+@noindent
+Ada defines a set of pragmas that can be used to supply additional
+information to the compiler. These language defined pragmas are
+implemented in GNAT and work as described in the Ada Reference Manual.
+
+In addition, Ada allows implementations to define additional pragmas
+whose meaning is defined by the implementation. GNAT provides a number
+of these implementation-defined pragmas, which can be used to extend
+and enhance the functionality of the compiler. This section of the GNAT
+Reference Manual describes these additional pragmas.
+
+Note that any program using these pragmas might not be portable to other
+compilers (although GNAT implements this set of pragmas on all
+platforms). Therefore if portability to other compilers is an important
+consideration, the use of these pragmas should be minimized.
+
+@menu
+* Pragma Abort_Defer::
+* Pragma Abstract_State::
+* Pragma Ada_83::
+* Pragma Ada_95::
+* Pragma Ada_05::
+* Pragma Ada_2005::
+* Pragma Ada_12::
+* Pragma Ada_2012::
+* Pragma Allow_Integer_Address::
+* Pragma Annotate::
+* Pragma Assert::
+* Pragma Assert_And_Cut::
+* Pragma Assertion_Policy::
+* Pragma Assume::
+* Pragma Assume_No_Invalid_Values::
+* Pragma Attribute_Definition::
+* Pragma Ast_Entry::
+* Pragma C_Pass_By_Copy::
+* Pragma Check::
+* Pragma Check_Float_Overflow::
+* Pragma Check_Name::
+* Pragma Check_Policy::
+* Pragma CIL_Constructor::
+* Pragma Comment::
+* Pragma Common_Object::
+* Pragma Compile_Time_Error::
+* Pragma Compile_Time_Warning::
+* Pragma Compiler_Unit::
+* Pragma Compiler_Unit_Warning::
+* Pragma Complete_Representation::
+* Pragma Complex_Representation::
+* Pragma Component_Alignment::
+* Pragma Contract_Cases::
+* Pragma Convention_Identifier::
+* Pragma CPP_Class::
+* Pragma CPP_Constructor::
+* Pragma CPP_Virtual::
+* Pragma CPP_Vtable::
+* Pragma CPU::
+* Pragma Debug::
+* Pragma Debug_Policy::
+* Pragma Default_Storage_Pool::
+* Pragma Depends::
+* Pragma Detect_Blocking::
+* Pragma Disable_Atomic_Synchronization::
+* Pragma Dispatching_Domain::
+* Pragma Elaboration_Checks::
+* Pragma Eliminate::
+* Pragma Enable_Atomic_Synchronization::
+* Pragma Export_Exception::
+* Pragma Export_Function::
+* Pragma Export_Object::
+* Pragma Export_Procedure::
+* Pragma Export_Value::
+* Pragma Export_Valued_Procedure::
+* Pragma Extend_System::
+* Pragma Extensions_Allowed::
+* Pragma External::
+* Pragma External_Name_Casing::
+* Pragma Fast_Math::
+* Pragma Favor_Top_Level::
+* Pragma Finalize_Storage_Only::
+* Pragma Float_Representation::
+* Pragma Global::
+* Pragma Ident::
+* Pragma Implementation_Defined::
+* Pragma Implemented::
+* Pragma Implicit_Packing::
+* Pragma Import_Exception::
+* Pragma Import_Function::
+* Pragma Import_Object::
+* Pragma Import_Procedure::
+* Pragma Import_Valued_Procedure::
+* Pragma Independent::
+* Pragma Independent_Components::
+* Pragma Initial_Condition::
+* Pragma Initialize_Scalars::
+* Pragma Initializes::
+* Pragma Inline_Always::
+* Pragma Inline_Generic::
+* Pragma Interface::
+* Pragma Interface_Name::
+* Pragma Interrupt_Handler::
+* Pragma Interrupt_State::
+* Pragma Invariant::
+* Pragma Java_Constructor::
+* Pragma Java_Interface::
+* Pragma Keep_Names::
+* Pragma License::
+* Pragma Link_With::
+* Pragma Linker_Alias::
+* Pragma Linker_Constructor::
+* Pragma Linker_Destructor::
+* Pragma Linker_Section::
+* Pragma Long_Float::
+* Pragma Loop_Invariant::
+* Pragma Loop_Optimize::
+* Pragma Loop_Variant::
+* Pragma Machine_Attribute::
+* Pragma Main::
+* Pragma Main_Storage::
+* Pragma No_Body::
+* Pragma No_Inline::
+* Pragma No_Return::
+* Pragma No_Run_Time::
+* Pragma No_Strict_Aliasing::
+* Pragma Normalize_Scalars::
+* Pragma Obsolescent::
+* Pragma Optimize_Alignment::
+* Pragma Ordered::
+* Pragma Overflow_Mode::
+* Pragma Overriding_Renamings::
+* Pragma Partition_Elaboration_Policy::
+* Pragma Passive::
+* Pragma Persistent_BSS::
+* Pragma Polling::
+* Pragma Post::
+* Pragma Postcondition::
+* Pragma Post_Class::
+* Pragma Pre::
+* Pragma Precondition::
+* Pragma Predicate::
+* Pragma Preelaborable_Initialization::
+* Pragma Preelaborate_05::
+* Pragma Pre_Class::
+* Pragma Priority_Specific_Dispatching::
+* Pragma Profile::
+* Pragma Profile_Warnings::
+* Pragma Propagate_Exceptions::
+* Pragma Provide_Shift_Operators::
+* Pragma Psect_Object::
+* Pragma Pure_05::
+* Pragma Pure_12::
+* Pragma Pure_Function::
+* Pragma Ravenscar::
+* Pragma Refined_State::
+* Pragma Relative_Deadline::
+* Pragma Remote_Access_Type::
+* Pragma Restricted_Run_Time::
+* Pragma Restriction_Warnings::
+* Pragma Reviewable::
+* Pragma Share_Generic::
+* Pragma Shared::
+* Pragma Short_Circuit_And_Or::
+* Pragma Short_Descriptors::
+* Pragma Simple_Storage_Pool_Type::
+* Pragma Source_File_Name::
+* Pragma Source_File_Name_Project::
+* Pragma Source_Reference::
+* Pragma SPARK_Mode::
+* Pragma Static_Elaboration_Desired::
+* Pragma Stream_Convert::
+* Pragma Style_Checks::
+* Pragma Subtitle::
+* Pragma Suppress::
+* Pragma Suppress_All::
+* Pragma Suppress_Debug_Info::
+* Pragma Suppress_Exception_Locations::
+* Pragma Suppress_Initialization::
+* Pragma Task_Info::
+* Pragma Task_Name::
+* Pragma Task_Storage::
+* Pragma Test_Case::
+* Pragma Thread_Local_Storage::
+* Pragma Time_Slice::
+* Pragma Title::
+* Pragma Type_Invariant::
+* Pragma Type_Invariant_Class::
+* Pragma Unchecked_Union::
+* Pragma Unimplemented_Unit::
+* Pragma Universal_Aliasing ::
+* Pragma Universal_Data::
+* Pragma Unmodified::
+* Pragma Unreferenced::
+* Pragma Unreferenced_Objects::
+* Pragma Unreserve_All_Interrupts::
+* Pragma Unsuppress::
+* Pragma Use_VADS_Size::
+* Pragma Validity_Checks::
+* Pragma Volatile::
+* Pragma Warning_As_Error::
+* Pragma Warnings::
+* Pragma Weak_External::
+* Pragma Wide_Character_Encoding::
+@end menu
+
+@node Pragma Abort_Defer
+@unnumberedsec Pragma Abort_Defer
+@findex Abort_Defer
+@cindex Deferring aborts
+@noindent
+Syntax:
+@smallexample
+pragma Abort_Defer;
+@end smallexample
+
+@noindent
+This pragma must appear at the start of the statement sequence of a
+handled sequence of statements (right after the @code{begin}). It has
+the effect of deferring aborts for the sequence of statements (but not
+for the declarations or handlers, if any, associated with this statement
+sequence).
+
+@node Pragma Abstract_State
+@unnumberedsec Pragma Abstract_State
+@findex Abstract_State
+@noindent
+For the description of this pragma, see SPARK 2014 Reference Manual,
+section 7.1.4.
+
+@node Pragma Ada_83
+@unnumberedsec Pragma Ada_83
+@findex Ada_83
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Ada_83;
+@end smallexample
+
+@noindent
+A configuration pragma that establishes Ada 83 mode for the unit to
+which it applies, regardless of the mode set by the command line
+switches. In Ada 83 mode, GNAT attempts to be as compatible with
+the syntax and semantics of Ada 83, as defined in the original Ada
+83 Reference Manual as possible. In particular, the keywords added by Ada 95
+and Ada 2005 are not recognized, optional package bodies are allowed,
+and generics may name types with unknown discriminants without using
+the @code{(<>)} notation. In addition, some but not all of the additional
+restrictions of Ada 83 are enforced.
+
+Ada 83 mode is intended for two purposes. Firstly, it allows existing
+Ada 83 code to be compiled and adapted to GNAT with less effort.
+Secondly, it aids in keeping code backwards compatible with Ada 83.
+However, there is no guarantee that code that is processed correctly
+by GNAT in Ada 83 mode will in fact compile and execute with an Ada
+83 compiler, since GNAT does not enforce all the additional checks
+required by Ada 83.
+
+@node Pragma Ada_95
+@unnumberedsec Pragma Ada_95
+@findex Ada_95
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Ada_95;
+@end smallexample
+
+@noindent
+A configuration pragma that establishes Ada 95 mode for the unit to which
+it applies, regardless of the mode set by the command line switches.
+This mode is set automatically for the @code{Ada} and @code{System}
+packages and their children, so you need not specify it in these
+contexts. This pragma is useful when writing a reusable component that
+itself uses Ada 95 features, but which is intended to be usable from
+either Ada 83 or Ada 95 programs.
+
+@node Pragma Ada_05
+@unnumberedsec Pragma Ada_05
+@findex Ada_05
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Ada_05;
+pragma Ada_05 (local_NAME);
+@end smallexample
+
+@noindent
+A configuration pragma that establishes Ada 2005 mode for the unit to which
+it applies, regardless of the mode set by the command line switches.
+This pragma is useful when writing a reusable component that
+itself uses Ada 2005 features, but which is intended to be usable from
+either Ada 83 or Ada 95 programs.
+
+The one argument form (which is not a configuration pragma)
+is used for managing the transition from
+Ada 95 to Ada 2005 in the run-time library. If an entity is marked
+as Ada_2005 only, then referencing the entity in Ada_83 or Ada_95
+mode will generate a warning. In addition, in Ada_83 or Ada_95
+mode, a preference rule is established which does not choose
+such an entity unless it is unambiguously specified. This avoids
+extra subprograms marked this way from generating ambiguities in
+otherwise legal pre-Ada_2005 programs. The one argument form is
+intended for exclusive use in the GNAT run-time library.
+
+@node Pragma Ada_2005
+@unnumberedsec Pragma Ada_2005
+@findex Ada_2005
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Ada_2005;
+@end smallexample
+
+@noindent
+This configuration pragma is a synonym for pragma Ada_05 and has the
+same syntax and effect.
+
+@node Pragma Ada_12
+@unnumberedsec Pragma Ada_12
+@findex Ada_12
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Ada_12;
+pragma Ada_12 (local_NAME);
+@end smallexample
+
+@noindent
+A configuration pragma that establishes Ada 2012 mode for the unit to which
+it applies, regardless of the mode set by the command line switches.
+This mode is set automatically for the @code{Ada} and @code{System}
+packages and their children, so you need not specify it in these
+contexts. This pragma is useful when writing a reusable component that
+itself uses Ada 2012 features, but which is intended to be usable from
+Ada 83, Ada 95, or Ada 2005 programs.
+
+The one argument form, which is not a configuration pragma,
+is used for managing the transition from Ada
+2005 to Ada 2012 in the run-time library. If an entity is marked
+as Ada_201 only, then referencing the entity in any pre-Ada_2012
+mode will generate a warning. In addition, in any pre-Ada_2012
+mode, a preference rule is established which does not choose
+such an entity unless it is unambiguously specified. This avoids
+extra subprograms marked this way from generating ambiguities in
+otherwise legal pre-Ada_2012 programs. The one argument form is
+intended for exclusive use in the GNAT run-time library.
+
+@node Pragma Ada_2012
+@unnumberedsec Pragma Ada_2012
+@findex Ada_2005
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Ada_2012;
+@end smallexample
+
+@noindent
+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 almost all versions of GNAT, @code{System.Address} is a private
+type in accordance with the implementation advice in the RM. This
+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
+integer value to type @code{System.Address}. The reverse case of using
+an address where an integer type is required is handled analogously.
+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);
+ v : Integer := y'Address;
+ w : constant Integer := Integer (Y'Address);
+ type R is new integer;
+ RR : R := 1000;
+ Z : Integer;
+ for Z'Address use RR;
+end AddrAsInt;
+@end smallexample
+
+@noindent
+Note that pragma @code{Allow_Integer_Address} is ignored if
+@code{System.Address}
+is not a private type. In implementations of @code{GNAT} where
+System.Address is a visible integer type (notably the implementations
+for @code{OpenVMS}), this pragma serves no purpose but is ignored
+rather than rejected to allow common sets of sources to be used
+in the two situations.
+
+@node Pragma Annotate
+@unnumberedsec Pragma Annotate
+@findex Annotate
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Annotate (IDENTIFIER [,IDENTIFIER @{, ARG@}]);
+
+ARG ::= NAME | EXPRESSION
+@end smallexample
+
+@noindent
+This pragma is used to annotate programs. @var{identifier} identifies
+the type of annotation. GNAT verifies that it is an identifier, but does
+not otherwise analyze it. The second optional identifier is also left
+unanalyzed, and by convention is used to control the action of the tool to
+which the annotation is addressed. The remaining @var{arg} arguments
+can be either string literals or more generally expressions.
+String literals are assumed to be either of type
+@code{Standard.String} or else @code{Wide_String} or @code{Wide_Wide_String}
+depending on the character literals they contain.
+All other kinds of arguments are analyzed as expressions, and must be
+unambiguous.
+
+The analyzed pragma is retained in the tree, but not otherwise processed
+by any part of the GNAT compiler, except to generate corresponding note
+lines in the generated ALI file. For the format of these note lines, see
+the compiler source file lib-writ.ads. This pragma is intended for use by
+external tools, including ASIS@. The use of pragma Annotate does not
+affect the compilation process in any way. This pragma may be used as
+a configuration pragma.
+
+@node Pragma Assert
+@unnumberedsec Pragma Assert
+@findex Assert
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Assert (
+ boolean_EXPRESSION
+ [, string_EXPRESSION]);
+@end smallexample
+
+@noindent
+The effect of this pragma depends on whether the corresponding command
+line switch is set to activate assertions. The pragma expands into code
+equivalent to the following:
+
+@smallexample @c ada
+if assertions-enabled then
+ if not boolean_EXPRESSION then
+ System.Assertions.Raise_Assert_Failure
+ (string_EXPRESSION);
+ end if;
+end if;
+@end smallexample
+
+@noindent
+The string argument, if given, is the message that will be associated
+with the exception occurrence if the exception is raised. If no second
+argument is given, the default message is @samp{@var{file}:@var{nnn}},
+where @var{file} is the name of the source file containing the assert,
+and @var{nnn} is the line number of the assert. A pragma is not a
+statement, so if a statement sequence contains nothing but a pragma
+assert, then a null statement is required in addition, as in:
+
+@smallexample @c ada
+@dots{}
+if J > 3 then
+ pragma Assert (K > 3, "Bad value for K");
+ null;
+end if;
+@end smallexample
+
+@noindent
+Note that, as with the @code{if} statement to which it is equivalent, the
+type of the expression is either @code{Standard.Boolean}, or any type derived
+from this standard type.
+
+Assert checks can be either checked or ignored. By default they are ignored.
+They will be checked if either the command line switch @option{-gnata} is
+used, or if an @code{Assertion_Policy} or @code{Check_Policy} pragma is used
+to enable @code{Assert_Checks}.
+
+If assertions are ignored, then there
+is no run-time effect (and in particular, any side effects from the
+expression will not occur at run time). (The expression is still
+analyzed at compile time, and may cause types to be frozen if they are
+mentioned here for the first time).
+
+If assertions are checked, then the given expression is tested, and if
+it is @code{False} then @code{System.Assertions.Raise_Assert_Failure} is called
+which results in the raising of @code{Assert_Failure} with the given message.
+
+You should generally avoid side effects in the expression arguments of
+this pragma, because these side effects will turn on and off with the
+setting of the assertions mode, resulting in assertions that have an
+effect on the program. However, the expressions are analyzed for
+semantic correctness whether or not assertions are enabled, so turning
+assertions on and off cannot affect the legality of a program.
+
+Note that the implementation defined policy @code{DISABLE}, given in a
+pragma @code{Assertion_Policy}, can be used to suppress this semantic analysis.
+
+Note: this is a standard language-defined pragma in versions
+of Ada from 2005 on. In GNAT, it is implemented in all versions
+of Ada, and the DISABLE policy is an implementation-defined
+addition.
+
+@node Pragma Assert_And_Cut
+@unnumberedsec Pragma Assert_And_Cut
+@findex Assert_And_Cut
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Assert_And_Cut (
+ boolean_EXPRESSION
+ [, string_EXPRESSION]);
+@end smallexample
+
+@noindent
+The effect of this pragma is identical to that of pragma @code{Assert},
+except that in an @code{Assertion_Policy} pragma, the identifier
+@code{Assert_And_Cut} is used to control whether it is ignored or checked
+(or disabled).
+
+The intention is that this be used within a subprogram when the
+given test expresion sums up all the work done so far in the
+subprogram, so that the rest of the subprogram can be verified
+(informally or formally) using only the entry preconditions,
+and the expression in this pragma. This allows dividing up
+a subprogram into sections for the purposes of testing or
+formal verification. The pragma also serves as useful
+documentation.
+
+@node Pragma Assertion_Policy
+@unnumberedsec Pragma Assertion_Policy
+@findex Assertion_Policy
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Assertion_Policy (CHECK | DISABLE | IGNORE);
+
+pragma Assertion_Policy (
+ ASSERTION_KIND => POLICY_IDENTIFIER
+ @{, ASSERTION_KIND => POLICY_IDENTIFIER@});
+
+ASSERTION_KIND ::= RM_ASSERTION_KIND | ID_ASSERTION_KIND
+
+RM_ASSERTION_KIND ::= Assert |
+ Static_Predicate |
+ Dynamic_Predicate |
+ Pre |
+ Pre'Class |
+ Post |
+ Post'Class |
+ Type_Invariant |
+ Type_Invariant'Class
+
+ID_ASSERTION_KIND ::= Assertions |
+ Assert_And_Cut |
+ Assume |
+ Contract_Cases |
+ Debug |
+ Invariant |
+ Invariant'Class |
+ Loop_Invariant |
+ Loop_Variant |
+ Postcondition |
+ Precondition |
+ Predicate |
+ Refined_Post |
+ Statement_Assertions
+
+POLICY_IDENTIFIER ::= Check | Disable | Ignore
+@end smallexample
+
+@noindent
+This is a standard Ada 2012 pragma that is available as an
+implementation-defined pragma in earlier versions of Ada.
+The assertion kinds @code{RM_ASSERTION_KIND} are those defined in
+the Ada standard. The assertion kinds @code{ID_ASSERTION_KIND}
+are implementation defined additions recognized by the GNAT compiler.
+
+The pragma applies in both cases to pragmas and aspects with matching
+names, e.g. @code{Pre} applies to the Pre aspect, and @code{Precondition}
+applies to both the @code{Precondition} pragma
+and the aspect @code{Precondition}. Note that the identifiers for
+pragmas Pre_Class and Post_Class are Pre'Class and Post'Class (not
+Pre_Class and Post_Class), since these pragmas are intended to be
+identical to the corresponding aspects).
+
+If the policy is @code{CHECK}, then assertions are enabled, i.e.
+the corresponding pragma or aspect is activated.
+If the policy is @code{IGNORE}, then assertions are ignored, i.e.
+the corresponding pragma or aspect is deactivated.
+This pragma overrides the effect of the @option{-gnata} switch on the
+command line.
+
+The implementation defined policy @code{DISABLE} is like
+@code{IGNORE} except that it completely disables semantic
+checking of the corresponding pragma or aspect. This is
+useful when the pragma or aspect argument references subprograms
+in a with'ed package which is replaced by a dummy package
+for the final build.
+
+The implementation defined policy @code{Assertions} applies to all
+assertion kinds. The form with no assertion kind given implies this
+choice, so it applies to all assertion kinds (RM defined, and
+implementation defined).
+
+The implementation defined policy @code{Statement_Assertions}
+applies to @code{Assert}, @code{Assert_And_Cut},
+@code{Assume}, @code{Loop_Invariant}, and @code{Loop_Variant}.
+
+@node Pragma Assume
+@unnumberedsec Pragma Assume
+@findex Assume
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Assume (
+ boolean_EXPRESSION
+ [, string_EXPRESSION]);
+@end smallexample
+
+@noindent
+The effect of this pragma is identical to that of pragma @code{Assert},
+except that in an @code{Assertion_Policy} pragma, the identifier
+@code{Assume} is used to control whether it is ignored or checked
+(or disabled).
+
+The intention is that this be used for assumptions about the
+external environment. So you cannot expect to verify formally
+or informally that the condition is met, this must be
+established by examining things outside the program itself.
+For example, we may have code that depends on the size of
+@code{Long_Long_Integer} being at least 64. So we could write:
+
+@smallexample @c ada
+pragma Assume (Long_Long_Integer'Size >= 64);
+@end smallexample
+
+@noindent
+This assumption cannot be proved from the program itself,
+but it acts as a useful run-time check that the assumption
+is met, and documents the need to ensure that it is met by
+reference to information outside the program.
+
+@node Pragma Assume_No_Invalid_Values
+@unnumberedsec Pragma Assume_No_Invalid_Values
+@findex Assume_No_Invalid_Values
+@cindex Invalid representations
+@cindex Invalid values
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Assume_No_Invalid_Values (On | Off);
+@end smallexample
+
+@noindent
+This is a configuration pragma that controls the assumptions made by the
+compiler about the occurrence of invalid representations (invalid values)
+in the code.
+
+The default behavior (corresponding to an Off argument for this pragma), is
+to assume that values may in general be invalid unless the compiler can
+prove they are valid. Consider the following example:
+
+@smallexample @c ada
+V1 : Integer range 1 .. 10;
+V2 : Integer range 11 .. 20;
+...
+for J in V2 .. V1 loop
+ ...
+end loop;
+@end smallexample
+
+@noindent
+if V1 and V2 have valid values, then the loop is known at compile
+time not to execute since the lower bound must be greater than the
+upper bound. However in default mode, no such assumption is made,
+and the loop may execute. If @code{Assume_No_Invalid_Values (On)}
+is given, the compiler will assume that any occurrence of a variable
+other than in an explicit @code{'Valid} test always has a valid
+value, and the loop above will be optimized away.
+
+The use of @code{Assume_No_Invalid_Values (On)} is appropriate if
+you know your code is free of uninitialized variables and other
+possible sources of invalid representations, and may result in
+more efficient code. A program that accesses an invalid representation
+with this pragma in effect is erroneous, so no guarantees can be made
+about its behavior.
+
+It is peculiar though permissible to use this pragma in conjunction
+with validity checking (-gnatVa). In such cases, accessing invalid
+values will generally give an exception, though formally the program
+is erroneous so there are no guarantees that this will always be the
+case, and it is recommended that these two options not be used together.
+
+@node Pragma Ast_Entry
+@unnumberedsec Pragma Ast_Entry
+@cindex OpenVMS
+@findex Ast_Entry
+@noindent
+Syntax:
+@smallexample @c ada
+pragma AST_Entry (entry_IDENTIFIER);
+@end smallexample
+
+@noindent
+This pragma is implemented only in the OpenVMS implementation of GNAT@. The
+argument is the simple name of a single entry; at most one @code{AST_Entry}
+pragma is allowed for any given entry. This pragma must be used in
+conjunction with the @code{AST_Entry} attribute, and is only allowed after
+the entry declaration and in the same task type specification or single task
+as the entry to which it applies. This pragma specifies that the given entry
+may be used to handle an OpenVMS asynchronous system trap (@code{AST})
+resulting from an OpenVMS system service call. The pragma does not affect
+normal use of the entry. For further details on this pragma, see the
+DEC Ada Language Reference Manual, section 9.12a.
+
+@node Pragma Attribute_Definition
+@unnumberedsec Pragma Attribute_Definition
+@findex Attribute_Definition
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Attribute_Definition
+ ([Attribute =>] ATTRIBUTE_DESIGNATOR,
+ [Entity =>] LOCAL_NAME,
+ [Expression =>] EXPRESSION | NAME);
+@end smallexample
+
+@noindent
+If @code{Attribute} is a known attribute name, this pragma is equivalent to
+the attribute definition clause:
+
+@smallexample @c ada
+ for Entity'Attribute use Expression;
+@end smallexample
+
+If @code{Attribute} is not a recognized attribute name, the pragma is
+ignored, and a warning is emitted. This allows source
+code to be written that takes advantage of some new attribute, while remaining
+compilable with earlier compilers.
+
+@node Pragma C_Pass_By_Copy
+@unnumberedsec Pragma C_Pass_By_Copy
+@cindex Passing by copy
+@findex C_Pass_By_Copy
+@noindent
+Syntax:
+@smallexample @c ada
+pragma C_Pass_By_Copy
+ ([Max_Size =>] static_integer_EXPRESSION);
+@end smallexample
+
+@noindent
+Normally the default mechanism for passing C convention records to C
+convention subprograms is to pass them by reference, as suggested by RM
+B.3(69). Use the configuration pragma @code{C_Pass_By_Copy} to change
+this default, by requiring that record formal parameters be passed by
+copy if all of the following conditions are met:
+
+@itemize @bullet
+@item
+The size of the record type does not exceed the value specified for
+@code{Max_Size}.
+@item
+The record type has @code{Convention C}.
+@item
+The formal parameter has this record type, and the subprogram has a
+foreign (non-Ada) convention.
+@end itemize
+
+@noindent
+If these conditions are met the argument is passed by copy, i.e.@: in a
+manner consistent with what C expects if the corresponding formal in the
+C prototype is a struct (rather than a pointer to a struct).
+
+You can also pass records by copy by specifying the convention
+@code{C_Pass_By_Copy} for the record type, or by using the extended
+@code{Import} and @code{Export} pragmas, which allow specification of
+passing mechanisms on a parameter by parameter basis.
+
+@node Pragma Check
+@unnumberedsec Pragma Check
+@cindex Assertions
+@cindex Named assertions
+@findex Check
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Check (
+ [Name =>] CHECK_KIND,
+ [Check =>] Boolean_EXPRESSION
+ [, [Message =>] string_EXPRESSION] );
+
+CHECK_KIND ::= IDENTIFIER |
+ Pre'Class |
+ Post'Class |
+ Type_Invariant'Class |
+ Invariant'Class
+@end smallexample
+
+@noindent
+This pragma is similar to the predefined pragma @code{Assert} except that an
+extra identifier argument is present. In conjunction with pragma
+@code{Check_Policy}, this can be used to define groups of assertions that can
+be independently controlled. The identifier @code{Assertion} is special, it
+refers to the normal set of pragma @code{Assert} statements.
+
+Checks introduced by this pragma are normally deactivated by default. They can
+be activated either by the command line option @option{-gnata}, which turns on
+all checks, or individually controlled using pragma @code{Check_Policy}.
+
+The identifiers @code{Assertions} and @code{Statement_Assertions} are not
+permitted as check kinds, since this would cause confusion with the use
+of these identifiers in @code{Assertion_Policy} and @code{Check_Policy}
+pragmas, where they are used to refer to sets of assertions.
+
+@node Pragma Check_Float_Overflow
+@unnumberedsec Pragma Check_Float_Overflow
+@cindex Floating-point overflow
+@findex Check_Float_Overflow
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Check_Float_Overflow;
+@end smallexample
+
+@noindent
+In Ada, the predefined floating-point types (@code{Short_Float},
+@code{Float}, @code{Long_Float}, @code{Long_Long_Float}) are
+defined to be @emph{unconstrained}. This means that even though each
+has a well-defined base range, an operation that delivers a result
+outside this base range is not required to raise an exception.
+This implementation permission accommodates the notion
+of infinities in IEEE floating-point, and corresponds to the
+efficient execution mode on most machines. GNAT will not raise
+overflow exceptions on these machines; instead it will generate
+infinities and NaN's as defined in the IEEE standard.
+
+Generating infinities, although efficient, is not always desirable.
+Often the preferable approach is to check for overflow, even at the
+(perhaps considerable) expense of run-time performance.
+This can be accomplished by defining your own constrained floating-point subtypes -- i.e., by supplying explicit
+range constraints -- and indeed such a subtype
+can have the same base range as its base type. For example:
+
+@smallexample @c ada
+subtype My_Float is Float range Float'Range;
+@end smallexample
+
+@noindent
+Here @code{My_Float} has the same range as
+@code{Float} but is constrained, so operations on
+@code{My_Float} values will be checked for overflow
+against this range.
+
+This style will achieve the desired goal, but
+it is often more convenient to be able to simply use
+the standard predefined floating-point types as long
+as overflow checking could be guaranteed.
+The @code{Check_Float_Overflow}
+configuration pragma achieves this effect. If a unit is compiled
+subject to this configuration pragma, then all operations
+on predefined floating-point types will be treated as
+though those types were constrained, and overflow checks
+will be generated. The @code{Constraint_Error}
+exception is raised if the result is out of range.
+
+This mode can also be set by use of the compiler
+switch @option{-gnateF}.
+
+@node Pragma Check_Name
+@unnumberedsec Pragma Check_Name
+@cindex Defining check names
+@cindex Check names, defining
+@findex Check_Name
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Check_Name (check_name_IDENTIFIER);
+@end smallexample
+
+@noindent
+This is a configuration pragma that defines a new implementation
+defined check name (unless IDENTIFIER matches one of the predefined
+check names, in which case the pragma has no effect). Check names
+are global to a partition, so if two or more configuration pragmas
+are present in a partition mentioning the same name, only one new
+check name is introduced.
+
+An implementation defined check name introduced with this pragma may
+be used in only three contexts: @code{pragma Suppress},
+@code{pragma Unsuppress},
+and as the prefix of a @code{Check_Name'Enabled} attribute reference. For
+any of these three cases, the check name must be visible. A check
+name is visible if it is in the configuration pragmas applying to
+the current unit, or if it appears at the start of any unit that
+is part of the dependency set of the current unit (e.g., units that
+are mentioned in @code{with} clauses).
+
+Check names introduced by this pragma are subject to control by compiler
+switches (in particular -gnatp) in the usual manner.
+
+@node Pragma Check_Policy
+@unnumberedsec Pragma Check_Policy
+@cindex Controlling assertions
+@cindex Assertions, control
+@cindex Check pragma control
+@cindex Named assertions
+@findex Check
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Check_Policy
+ ([Name =>] CHECK_KIND,
+ [Policy =>] POLICY_IDENTIFIER);
+
+pragma Check_Policy (
+ CHECK_KIND => POLICY_IDENTIFIER
+ @{, CHECK_KIND => POLICY_IDENTIFIER@});
+
+ASSERTION_KIND ::= RM_ASSERTION_KIND | ID_ASSERTION_KIND
+
+CHECK_KIND ::= IDENTIFIER |
+ Pre'Class |
+ Post'Class |
+ Type_Invariant'Class |
+ Invariant'Class
+
+The identifiers Name and Policy are not allowed as CHECK_KIND values. This
+avoids confusion between the two possible syntax forms for this pragma.
+
+POLICY_IDENTIFIER ::= ON | OFF | CHECK | DISABLE | IGNORE
+@end smallexample
+
+@noindent
+This pragma is used to set the checking policy for assertions (specified
+by aspects or pragmas), the @code{Debug} pragma, or additional checks
+to be checked using the @code{Check} pragma. It may appear either as
+a configuration pragma, or within a declarative part of package. In the
+latter case, it applies from the point where it appears to the end of
+the declarative region (like pragma @code{Suppress}).
+
+The @code{Check_Policy} pragma is similar to the
+predefined @code{Assertion_Policy} pragma,
+and if the check kind corresponds to one of the assertion kinds that
+are allowed by @code{Assertion_Policy}, then the effect is identical.
+
+If the first argument is Debug, then the policy applies to Debug pragmas,
+disabling their effect if the policy is @code{OFF}, @code{DISABLE}, or
+@code{IGNORE}, and allowing them to execute with normal semantics if
+the policy is @code{ON} or @code{CHECK}. In addition if the policy is
+@code{DISABLE}, then the procedure call in @code{Debug} pragmas will
+be totally ignored and not analyzed semantically.
+
+Finally the first argument may be some other identifier than the above
+possibilities, in which case it controls a set of named assertions
+that can be checked using pragma @code{Check}. For example, if the pragma:
+
+@smallexample @c ada
+pragma Check_Policy (Critical_Error, OFF);
+@end smallexample
+
+@noindent
+is given, then subsequent @code{Check} pragmas whose first argument is also
+@code{Critical_Error} will be disabled.
+
+The check policy is @code{OFF} to turn off corresponding checks, and @code{ON}
+to turn on corresponding checks. The default for a set of checks for which no
+@code{Check_Policy} is given is @code{OFF} unless the compiler switch
+@option{-gnata} is given, which turns on all checks by default.
+
+The check policy settings @code{CHECK} and @code{IGNORE} are recognized
+as synonyms for @code{ON} and @code{OFF}. These synonyms are provided for
+compatibility with the standard @code{Assertion_Policy} pragma. The check
+policy setting @code{DISABLE} causes the second argument of a corresponding
+@code{Check} pragma to be completely ignored and not analyzed.
+
+@node Pragma CIL_Constructor
+@unnumberedsec Pragma CIL_Constructor
+@findex CIL_Constructor
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma CIL_Constructor ([Entity =>] function_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma is used to assert that the specified Ada function should be
+mapped to the .NET constructor for some Ada tagged record type.
+
+See section 4.1 of the
+@code{GNAT User's Guide: Supplement for the .NET Platform.}
+for related information.
+
+@node Pragma Comment
+@unnumberedsec Pragma Comment
+@findex Comment
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Comment (static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+This is almost identical in effect to pragma @code{Ident}. It allows the
+placement of a comment into the object file and hence into the
+executable file if the operating system permits such usage. The
+difference is that @code{Comment}, unlike @code{Ident}, has
+no limitations on placement of the pragma (it can be placed
+anywhere in the main source unit), and if more than one pragma
+is used, all comments are retained.
+
+@node Pragma Common_Object
+@unnumberedsec Pragma Common_Object
+@findex Common_Object
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Common_Object (
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Size =>] EXTERNAL_SYMBOL] );
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+@end smallexample
+
+@noindent
+This pragma enables the shared use of variables stored in overlaid
+linker areas corresponding to the use of @code{COMMON}
+in Fortran. The single
+object @var{LOCAL_NAME} is assigned to the area designated by
+the @var{External} argument.
+You may define a record to correspond to a series
+of fields. The @var{Size} argument
+is syntax checked in GNAT, but otherwise ignored.
+
+@code{Common_Object} is not supported on all platforms. If no
+support is available, then the code generator will issue a message
+indicating that the necessary attribute for implementation of this
+pragma is not available.
+
+@node Pragma Compile_Time_Error
+@unnumberedsec Pragma Compile_Time_Error
+@findex Compile_Time_Error
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Compile_Time_Error
+ (boolean_EXPRESSION, static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma can be used to generate additional compile time
+error messages. It
+is particularly useful in generics, where errors can be issued for
+specific problematic instantiations. The first parameter is a boolean
+expression. The pragma is effective only if the value of this expression
+is known at compile time, and has the value True. The set of expressions
+whose values are known at compile time includes all static boolean
+expressions, and also other values which the compiler can determine
+at compile time (e.g., the size of a record type set by an explicit
+size representation clause, or the value of a variable which was
+initialized to a constant and is known not to have been modified).
+If these conditions are met, an error message is generated using
+the value given as the second argument. This string value may contain
+embedded ASCII.LF characters to break the message into multiple lines.
+
+@node Pragma Compile_Time_Warning
+@unnumberedsec Pragma Compile_Time_Warning
+@findex Compile_Time_Warning
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Compile_Time_Warning
+ (boolean_EXPRESSION, static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+Same as pragma Compile_Time_Error, except a warning is issued instead
+of an error message. Note that if this pragma is used in a package that
+is with'ed by a client, the client will get the warning even though it
+is issued by a with'ed package (normally warnings in with'ed units are
+suppressed, but this is a special exception to that rule).
+
+One typical use is within a generic where compile time known characteristics
+of formal parameters are tested, and warnings given appropriately. Another use
+with a first parameter of True is to warn a client about use of a package,
+for example that it is not fully implemented.
+
+@node Pragma Compiler_Unit
+@unnumberedsec Pragma Compiler_Unit
+@findex Compiler_Unit
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Compiler_Unit;
+@end smallexample
+
+@noindent
+This pragma is obsolete. It is equivalent to Compiler_Unit_Warning. It is
+retained so that old versions of the GNAT run-time that use this pragma can
+be compiled with newer versions of the compiler.
+
+@node Pragma Compiler_Unit_Warning
+@unnumberedsec Pragma Compiler_Unit_Warning
+@findex Compiler_Unit_Warning
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Compiler_Unit_Warning;
+@end smallexample
+
+@noindent
+This pragma is intended only for internal use in the GNAT run-time library.
+It indicates that the unit is used as part of the compiler build. The effect
+is to generate warnings for the use of constructs (for example, conditional
+expressions) that would cause trouble when bootstrapping using an older
+version of GNAT. For the exact list of restrictions, see the compiler sources
+and references to Check_Compiler_Unit.
+
+@node Pragma Complete_Representation
+@unnumberedsec Pragma Complete_Representation
+@findex Complete_Representation
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Complete_Representation;
+@end smallexample
+
+@noindent
+This pragma must appear immediately within a record representation
+clause. Typical placements are before the first component clause
+or after the last component clause. The effect is to give an error
+message if any component is missing a component clause. This pragma
+may be used to ensure that a record representation clause is
+complete, and that this invariant is maintained if fields are
+added to the record in the future.
+
+@node Pragma Complex_Representation
+@unnumberedsec Pragma Complex_Representation
+@findex Complex_Representation
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Complex_Representation
+ ([Entity =>] LOCAL_NAME);
+@end smallexample
+
+@noindent
+The @var{Entity} argument must be the name of a record type which has
+two fields of the same floating-point type. The effect of this pragma is
+to force gcc to use the special internal complex representation form for
+this record, which may be more efficient. Note that this may result in
+the code for this type not conforming to standard ABI (application
+binary interface) requirements for the handling of record types. For
+example, in some environments, there is a requirement for passing
+records by pointer, and the use of this pragma may result in passing
+this type in floating-point registers.
+
+@node Pragma Component_Alignment
+@unnumberedsec Pragma Component_Alignment
+@cindex Alignments of components
+@findex Component_Alignment
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Component_Alignment (
+ [Form =>] ALIGNMENT_CHOICE
+ [, [Name =>] type_LOCAL_NAME]);
+
+ALIGNMENT_CHOICE ::=
+ Component_Size
+| Component_Size_4
+| Storage_Unit
+| Default
+@end smallexample
+
+@noindent
+Specifies the alignment of components in array or record types.
+The meaning of the @var{Form} argument is as follows:
+
+@table @code
+@findex Component_Size
+@item Component_Size
+Aligns scalar components and subcomponents of the array or record type
+on boundaries appropriate to their inherent size (naturally
+aligned). For example, 1-byte components are aligned on byte boundaries,
+2-byte integer components are aligned on 2-byte boundaries, 4-byte
+integer components are aligned on 4-byte boundaries and so on. These
+alignment rules correspond to the normal rules for C compilers on all
+machines except the VAX@.
+
+@findex Component_Size_4
+@item Component_Size_4
+Naturally aligns components with a size of four or fewer
+bytes. Components that are larger than 4 bytes are placed on the next
+4-byte boundary.
+
+@findex Storage_Unit
+@item Storage_Unit
+Specifies that array or record components are byte aligned, i.e.@:
+aligned on boundaries determined by the value of the constant
+@code{System.Storage_Unit}.
+
+@cindex OpenVMS
+@item Default
+Specifies that array or record components are aligned on default
+boundaries, appropriate to the underlying hardware or operating system or
+both. For OpenVMS VAX systems, the @code{Default} choice is the same as
+the @code{Storage_Unit} choice (byte alignment). For all other systems,
+the @code{Default} choice is the same as @code{Component_Size} (natural
+alignment).
+@end table
+
+@noindent
+If the @code{Name} parameter is present, @var{type_LOCAL_NAME} must
+refer to a local record or array type, and the specified alignment
+choice applies to the specified type. The use of
+@code{Component_Alignment} together with a pragma @code{Pack} causes the
+@code{Component_Alignment} pragma to be ignored. The use of
+@code{Component_Alignment} together with a record representation clause
+is only effective for fields not specified by the representation clause.
+
+If the @code{Name} parameter is absent, the pragma can be used as either
+a configuration pragma, in which case it applies to one or more units in
+accordance with the normal rules for configuration pragmas, or it can be
+used within a declarative part, in which case it applies to types that
+are declared within this declarative part, or within any nested scope
+within this declarative part. In either case it specifies the alignment
+to be applied to any record or array type which has otherwise standard
+representation.
+
+If the alignment for a record or array type is not specified (using
+pragma @code{Pack}, pragma @code{Component_Alignment}, or a record rep
+clause), the GNAT uses the default alignment as described previously.
+
+@node Pragma Contract_Cases
+@unnumberedsec Pragma Contract_Cases
+@cindex Contract cases
+@findex Contract_Cases
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Contract_Cases (
+ Condition => Consequence
+ @{,Condition => Consequence@});
+@end smallexample
+
+@noindent
+The @code{Contract_Cases} pragma allows defining fine-grain specifications
+that can complement or replace the contract given by a precondition and a
+postcondition. Additionally, the @code{Contract_Cases} pragma can be used
+by testing and formal verification tools. The compiler checks its validity and,
+depending on the assertion policy at the point of declaration of the pragma,
+it may insert a check in the executable. For code generation, the contract
+cases
+
+@smallexample @c ada
+pragma Contract_Cases (
+ Cond1 => Pred1,
+ Cond2 => Pred2);
+@end smallexample
+
+@noindent
+are equivalent to
+
+@smallexample @c ada
+C1 : constant Boolean := Cond1; -- evaluated at subprogram entry
+C2 : constant Boolean := Cond2; -- evaluated at subprogram entry
+pragma Precondition ((C1 and not C2) or (C2 and not C1));
+pragma Postcondition (if C1 then Pred1);
+pragma Postcondition (if C2 then Pred2);
+@end smallexample
+
+@noindent
+The precondition ensures that one and only one of the conditions is
+satisfied on entry to the subprogram.
+The postcondition ensures that for the condition that was True on entry,
+the corrresponding consequence is True on exit. Other consequence expressions
+are not evaluated.
+
+A precondition @code{P} and postcondition @code{Q} can also be
+expressed as contract cases:
+
+@smallexample @c ada
+pragma Contract_Cases (P => Q);
+@end smallexample
+
+The placement and visibility rules for @code{Contract_Cases} pragmas are
+identical to those described for preconditions and postconditions.
+
+The compiler checks that boolean expressions given in conditions and
+consequences are valid, where the rules for conditions are the same as
+the rule for an expression in @code{Precondition} and the rules for
+consequences are the same as the rule for an expression in
+@code{Postcondition}. In particular, attributes @code{'Old} and
+@code{'Result} can only be used within consequence expressions.
+The condition for the last contract case may be @code{others}, to denote
+any case not captured by the previous cases. The
+following is an example of use within a package spec:
+
+@smallexample @c ada
+package Math_Functions is
+ ...
+ function Sqrt (Arg : Float) return Float;
+ pragma Contract_Cases ((Arg in 0 .. 99) => Sqrt'Result < 10,
+ Arg >= 100 => Sqrt'Result >= 10,
+ others => Sqrt'Result = 0);
+ ...
+end Math_Functions;
+@end smallexample
+
+@noindent
+The meaning of contract cases is that only one case should apply at each
+call, as determined by the corresponding condition evaluating to True,
+and that the consequence for this case should hold when the subprogram
+returns.
+
+@node Pragma Convention_Identifier
+@unnumberedsec Pragma Convention_Identifier
+@findex Convention_Identifier
+@cindex Conventions, synonyms
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Convention_Identifier (
+ [Name =>] IDENTIFIER,
+ [Convention =>] convention_IDENTIFIER);
+@end smallexample
+
+@noindent
+This pragma provides a mechanism for supplying synonyms for existing
+convention identifiers. The @code{Name} identifier can subsequently
+be used as a synonym for the given convention in other pragmas (including
+for example pragma @code{Import} or another @code{Convention_Identifier}
+pragma). As an example of the use of this, suppose you had legacy code
+which used Fortran77 as the identifier for Fortran. Then the pragma:
+
+@smallexample @c ada
+pragma Convention_Identifier (Fortran77, Fortran);
+@end smallexample
+
+@noindent
+would allow the use of the convention identifier @code{Fortran77} in
+subsequent code, avoiding the need to modify the sources. As another
+example, you could use this to parameterize convention requirements
+according to systems. Suppose you needed to use @code{Stdcall} on
+windows systems, and @code{C} on some other system, then you could
+define a convention identifier @code{Library} and use a single
+@code{Convention_Identifier} pragma to specify which convention
+would be used system-wide.
+
+@node Pragma CPP_Class
+@unnumberedsec Pragma CPP_Class
+@findex CPP_Class
+@cindex Interfacing with C++
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma CPP_Class ([Entity =>] LOCAL_NAME);
+@end smallexample
+
+@noindent
+The argument denotes an entity in the current declarative region that is
+declared as a record type. It indicates that the type corresponds to an
+externally declared C++ class type, and is to be laid out the same way
+that C++ would lay out the type. If the C++ class has virtual primitives
+then the record must be declared as a tagged record type.
+
+Types for which @code{CPP_Class} is specified do not have assignment or
+equality operators defined (such operations can be imported or declared
+as subprograms as required). Initialization is allowed only by constructor
+functions (see pragma @code{CPP_Constructor}). Such types are implicitly
+limited if not explicitly declared as limited or derived from a limited
+type, and an error is issued in that case.
+
+See @ref{Interfacing to C++} for related information.
+
+Note: Pragma @code{CPP_Class} is currently obsolete. It is supported
+for backward compatibility but its functionality is available
+using pragma @code{Import} with @code{Convention} = @code{CPP}.
+
+@node Pragma CPP_Constructor
+@unnumberedsec Pragma CPP_Constructor
+@cindex Interfacing with C++
+@findex CPP_Constructor
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma CPP_Constructor ([Entity =>] LOCAL_NAME
+ [, [External_Name =>] static_string_EXPRESSION ]
+ [, [Link_Name =>] static_string_EXPRESSION ]);
+@end smallexample
+
+@noindent
+This pragma identifies an imported function (imported in the usual way
+with pragma @code{Import}) as corresponding to a C++ constructor. If
+@code{External_Name} and @code{Link_Name} are not specified then the
+@code{Entity} argument is a name that must have been previously mentioned
+in a pragma @code{Import} with @code{Convention} = @code{CPP}. Such name
+must be of one of the following forms:
+
+@itemize @bullet
+@item
+@code{function @var{Fname} return @var{T}}
+
+@itemize @bullet
+@item
+@code{function @var{Fname} return @var{T}'Class}
+
+@item
+@code{function @var{Fname} (@dots{}) return @var{T}}
+@end itemize
+
+@item
+@code{function @var{Fname} (@dots{}) return @var{T}'Class}
+@end itemize
+
+@noindent
+where @var{T} is a limited record type imported from C++ with pragma
+@code{Import} and @code{Convention} = @code{CPP}.
+
+The first two forms import the default constructor, used when an object
+of type @var{T} is created on the Ada side with no explicit constructor.
+The latter two forms cover all the non-default constructors of the type.
+See the @value{EDITION} User's Guide for details.
+
+If no constructors are imported, it is impossible to create any objects
+on the Ada side and the type is implicitly declared abstract.
+
+Pragma @code{CPP_Constructor} is intended primarily for automatic generation
+using an automatic binding generator tool (such as the @code{-fdump-ada-spec}
+GCC switch).
+See @ref{Interfacing to C++} for more related information.
+
+Note: The use of functions returning class-wide types for constructors is
+currently obsolete. They are supported for backward compatibility. The
+use of functions returning the type T leave the Ada sources more clear
+because the imported C++ constructors always return an object of type T;
+that is, they never return an object whose type is a descendant of type T.
+
+@node Pragma CPP_Virtual
+@unnumberedsec Pragma CPP_Virtual
+@cindex Interfacing to C++
+@findex CPP_Virtual
+@noindent
+This pragma is now obsolete and, other than generating a warning if warnings
+on obsolescent features are enabled, is completely ignored.
+It is retained for compatibility
+purposes. It used to be required to ensure compoatibility with C++, but
+is no longer required for that purpose because GNAT generates
+the same object layout as the G++ compiler by default.
+
+See @ref{Interfacing to C++} for related information.
+
+@node Pragma CPP_Vtable
+@unnumberedsec Pragma CPP_Vtable
+@cindex Interfacing with C++
+@findex CPP_Vtable
+@noindent
+This pragma is now obsolete and, other than generating a warning if warnings
+on obsolescent features are enabled, is completely ignored.
+It used to be required to ensure compatibility with C++, but
+is no longer required for that purpose because GNAT generates
+the same object layout than the G++ compiler by default.
+
+See @ref{Interfacing to C++} for related information.
+
+@node Pragma CPU
+@unnumberedsec Pragma CPU
+@findex CPU
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma CPU (EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2012, but is available in all earlier
+versions of Ada as an implementation-defined pragma.
+See Ada 2012 Reference Manual for details.
+
+@node Pragma Debug
+@unnumberedsec Pragma Debug
+@findex Debug
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Debug ([CONDITION, ]PROCEDURE_CALL_WITHOUT_SEMICOLON);
+
+PROCEDURE_CALL_WITHOUT_SEMICOLON ::=
+ PROCEDURE_NAME
+| PROCEDURE_PREFIX ACTUAL_PARAMETER_PART
+@end smallexample
+
+@noindent
+The procedure call argument has the syntactic form of an expression, meeting
+the syntactic requirements for pragmas.
+
+If debug pragmas are not enabled or if the condition is present and evaluates
+to False, this pragma has no effect. If debug pragmas are enabled, the
+semantics of the pragma is exactly equivalent to the procedure call statement
+corresponding to the argument with a terminating semicolon. Pragmas are
+permitted in sequences of declarations, so you can use pragma @code{Debug} to
+intersperse calls to debug procedures in the middle of declarations. Debug
+pragmas can be enabled either by use of the command line switch @option{-gnata}
+or by use of the pragma @code{Check_Policy} with a first argument of
+@code{Debug}.
+
+@node Pragma Debug_Policy
+@unnumberedsec Pragma Debug_Policy
+@findex Debug_Policy
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Debug_Policy (CHECK | DISABLE | IGNORE | ON | OFF);
+@end smallexample
+
+@noindent
+This pragma is equivalent to a corresponding @code{Check_Policy} pragma
+with a first argument of @code{Debug}. It is retained for historical
+compatibility reasons.
+
+@node Pragma Default_Storage_Pool
+@unnumberedsec Pragma Default_Storage_Pool
+@findex Default_Storage_Pool
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Default_Storage_Pool (storage_pool_NAME | null);
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2012, but is available in all earlier
+versions of Ada as an implementation-defined pragma.
+See Ada 2012 Reference Manual for details.
+
+@node Pragma Depends
+@unnumberedsec Pragma Depends
+@findex Depends
+@noindent
+For the description of this pragma, see SPARK 2014 Reference Manual,
+section 6.1.5.
+
+@node Pragma Detect_Blocking
+@unnumberedsec Pragma Detect_Blocking
+@findex Detect_Blocking
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Detect_Blocking;
+@end smallexample
+
+@noindent
+This is a standard pragma in Ada 2005, that is available in all earlier
+versions of Ada as an implementation-defined pragma.
+
+This is a configuration pragma that forces the detection of potentially
+blocking operations within a protected operation, and to raise Program_Error
+if that happens.
+
+@node Pragma Disable_Atomic_Synchronization
+@unnumberedsec Pragma Disable_Atomic_Synchronization
+@cindex Atomic Synchronization
+@findex Disable_Atomic_Synchronization
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Disable_Atomic_Synchronization [(Entity)];
+@end smallexample
+
+@noindent
+Ada requires that accesses (reads or writes) of an atomic variable be
+regarded as synchronization points in the case of multiple tasks.
+Particularly in the case of multi-processors this may require special
+handling, e.g. the generation of memory barriers. This capability may
+be turned off using this pragma in cases where it is known not to be
+required.
+
+The placement and scope rules for this pragma are the same as those
+for @code{pragma Suppress}. In particular it can be used as a
+configuration pragma, or in a declaration sequence where it applies
+till the end of the scope. If an @code{Entity} argument is present,
+the action applies only to that entity.
+
+@node Pragma Dispatching_Domain
+@unnumberedsec Pragma Dispatching_Domain
+@findex Dispatching_Domain
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Dispatching_Domain (EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2012, but is available in all earlier
+versions of Ada as an implementation-defined pragma.
+See Ada 2012 Reference Manual for details.
+
+@node Pragma Elaboration_Checks
+@unnumberedsec Pragma Elaboration_Checks
+@cindex Elaboration control
+@findex Elaboration_Checks
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Elaboration_Checks (Dynamic | Static);
+@end smallexample
+
+@noindent
+This is a configuration pragma that provides control over the
+elaboration model used by the compilation affected by the
+pragma. If the parameter is @code{Dynamic},
+then the dynamic elaboration
+model described in the Ada Reference Manual is used, as though
+the @option{-gnatE} switch had been specified on the command
+line. If the parameter is @code{Static}, then the default GNAT static
+model is used. This configuration pragma overrides the setting
+of the command line. For full details on the elaboration models
+used by the GNAT compiler, see @ref{Elaboration Order Handling in GNAT,,,
+gnat_ugn, @value{EDITION} User's Guide}.
+
+@node Pragma Eliminate
+@unnumberedsec Pragma Eliminate
+@cindex Elimination of unused subprograms
+@findex Eliminate
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Eliminate ([Entity =>] DEFINING_DESIGNATOR,
+ [Source_Location =>] STRING_LITERAL);
+@end smallexample
+
+@noindent
+The string literal given for the source location is a string which
+specifies the line number of the occurrence of the entity, using
+the syntax for SOURCE_TRACE given below:
+
+@smallexample @c ada
+ SOURCE_TRACE ::= SOURCE_REFERENCE [LBRACKET SOURCE_TRACE RBRACKET]
+
+ LBRACKET ::= [
+ RBRACKET ::= ]
+
+ SOURCE_REFERENCE ::= FILE_NAME : LINE_NUMBER
+
+ LINE_NUMBER ::= DIGIT @{DIGIT@}
+@end smallexample
+
+@noindent
+Spaces around the colon in a @code{Source_Reference} are optional.
+
+The @code{DEFINING_DESIGNATOR} matches the defining designator used in an
+explicit subprogram declaration, where the @code{entity} name in this
+designator appears on the source line specified by the source location.
+
+The source trace that is given as the @code{Source_Location} shall obey the
+following rules. The @code{FILE_NAME} is the short name (with no directory
+information) of an Ada source file, given using exactly the required syntax
+for the underlying file system (e.g. case is important if the underlying
+operating system is case sensitive). @code{LINE_NUMBER} gives the line
+number of the occurrence of the @code{entity}
+as a decimal literal without an exponent or point. If an @code{entity} is not
+declared in a generic instantiation (this includes generic subprogram
+instances), the source trace includes only one source reference. If an entity
+is declared inside a generic instantiation, its source trace (when parsing
+from left to right) starts with the source location of the declaration of the
+entity in the generic unit and ends with the source location of the
+instantiation (it is given in square brackets). This approach is recursively
+used in case of nested instantiations: the rightmost (nested most deeply in
+square brackets) element of the source trace is the location of the outermost
+instantiation, the next to left element is the location of the next (first
+nested) instantiation in the code of the corresponding generic unit, and so
+on, and the leftmost element (that is out of any square brackets) is the
+location of the declaration of the entity to eliminate in a generic unit.
+
+Note that the @code{Source_Location} argument specifies which of a set of
+similarly named entities is being eliminated, dealing both with overloading,
+and also appearance of the same entity name in different scopes.
+
+This pragma indicates that the given entity is not used in the program to be
+compiled and built. The effect of the pragma is to allow the compiler to
+eliminate the code or data associated with the named entity. Any reference to
+an eliminated entity causes a compile-time or link-time error.
+
+The intention of pragma @code{Eliminate} is to allow a program to be compiled
+in a system-independent manner, with unused entities eliminated, without
+needing to modify the source text. Normally the required set of
+@code{Eliminate} pragmas is constructed automatically using the gnatelim tool.
+
+Any source file change that removes, splits, or
+adds lines may make the set of Eliminate pragmas invalid because their
+@code{Source_Location} argument values may get out of date.
+
+Pragma @code{Eliminate} may be used where the referenced entity is a dispatching
+operation. In this case all the subprograms to which the given operation can
+dispatch are considered to be unused (are never called as a result of a direct
+or a dispatching call).
+
+@node Pragma Enable_Atomic_Synchronization
+@unnumberedsec Pragma Enable_Atomic_Synchronization
+@cindex Atomic Synchronization
+@findex Enable_Atomic_Synchronization
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Enable_Atomic_Synchronization [(Entity)];
+@end smallexample
+
+@noindent
+Ada requires that accesses (reads or writes) of an atomic variable be
+regarded as synchronization points in the case of multiple tasks.
+Particularly in the case of multi-processors this may require special
+handling, e.g. the generation of memory barriers. This synchronization
+is performed by default, but can be turned off using
+@code{pragma Disable_Atomic_Synchronization}. The
+@code{Enable_Atomic_Synchronization} pragma can be used to turn
+it back on.
+
+The placement and scope rules for this pragma are the same as those
+for @code{pragma Unsuppress}. In particular it can be used as a
+configuration pragma, or in a declaration sequence where it applies
+till the end of the scope. If an @code{Entity} argument is present,
+the action applies only to that entity.
+
+@node Pragma Export_Exception
+@unnumberedsec Pragma Export_Exception
+@cindex OpenVMS
+@findex Export_Exception
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Export_Exception (
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Form =>] Ada | VMS]
+ [, [Code =>] static_integer_EXPRESSION]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+@end smallexample
+
+@noindent
+This pragma is implemented only in the OpenVMS implementation of GNAT@. It
+causes the specified exception to be propagated outside of the Ada program,
+so that it can be handled by programs written in other OpenVMS languages.
+This pragma establishes an external name for an Ada exception and makes the
+name available to the OpenVMS Linker as a global symbol. For further details
+on this pragma, see the
+DEC Ada Language Reference Manual, section 13.9a3.2.
+
+@node Pragma Export_Function
+@unnumberedsec Pragma Export_Function
+@cindex Argument passing mechanisms
+@findex Export_Function
+
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Export_Function (
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Parameter_Types =>] PARAMETER_TYPES]
+ [, [Result_Type =>] result_SUBTYPE_MARK]
+ [, [Mechanism =>] MECHANISM]
+ [, [Result_Mechanism =>] MECHANISM_NAME]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+| ""
+
+PARAMETER_TYPES ::=
+ null
+| TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+TYPE_DESIGNATOR ::=
+ subtype_NAME
+| subtype_Name ' Access
+
+MECHANISM ::=
+ MECHANISM_NAME
+| (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+MECHANISM_ASSOCIATION ::=
+ [formal_parameter_NAME =>] MECHANISM_NAME
+
+MECHANISM_NAME ::=
+ Value
+| Reference
+| Descriptor [([Class =>] CLASS_NAME)]
+| Short_Descriptor [([Class =>] CLASS_NAME)]
+
+CLASS_NAME ::= ubs | ubsb | uba | s | sb | a
+@end smallexample
+
+@noindent
+Use this pragma to make a function externally callable and optionally
+provide information on mechanisms to be used for passing parameter and
+result values. We recommend, for the purposes of improving portability,
+this pragma always be used in conjunction with a separate pragma
+@code{Export}, which must precede the pragma @code{Export_Function}.
+GNAT does not require a separate pragma @code{Export}, but if none is
+present, @code{Convention Ada} is assumed, which is usually
+not what is wanted, so it is usually appropriate to use this
+pragma in conjunction with a @code{Export} or @code{Convention}
+pragma that specifies the desired foreign convention.
+Pragma @code{Export_Function}
+(and @code{Export}, if present) must appear in the same declarative
+region as the function to which they apply.
+
+@var{internal_name} must uniquely designate the function to which the
+pragma applies. If more than one function name exists of this name in
+the declarative part you must use the @code{Parameter_Types} and
+@code{Result_Type} parameters is mandatory to achieve the required
+unique designation. @var{subtype_mark}s in these parameters must
+exactly match the subtypes in the corresponding function specification,
+using positional notation to match parameters with subtype marks.
+The form with an @code{'Access} attribute can be used to match an
+anonymous access parameter.
+
+@cindex OpenVMS
+@cindex Passing by descriptor
+Passing by descriptor is supported only on the OpenVMS ports of GNAT@.
+The default behavior for Export_Function is to accept either 64bit or
+32bit descriptors unless short_descriptor is specified, then only 32bit
+descriptors are accepted.
+
+@cindex Suppressing external name
+Special treatment is given if the EXTERNAL is an explicit null
+string or a static string expressions that evaluates to the null
+string. In this case, no external name is generated. This form
+still allows the specification of parameter mechanisms.
+
+@node Pragma Export_Object
+@unnumberedsec Pragma Export_Object
+@findex Export_Object
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Export_Object
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Size =>] EXTERNAL_SYMBOL]
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+@end smallexample
+
+@noindent
+This pragma designates an object as exported, and apart from the
+extended rules for external symbols, is identical in effect to the use of
+the normal @code{Export} pragma applied to an object. You may use a
+separate Export pragma (and you probably should from the point of view
+of portability), but it is not required. @var{Size} is syntax checked,
+but otherwise ignored by GNAT@.
+
+@node Pragma Export_Procedure
+@unnumberedsec Pragma Export_Procedure
+@findex Export_Procedure
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Export_Procedure (
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Parameter_Types =>] PARAMETER_TYPES]
+ [, [Mechanism =>] MECHANISM]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+| ""
+
+PARAMETER_TYPES ::=
+ null
+| TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+TYPE_DESIGNATOR ::=
+ subtype_NAME
+| subtype_Name ' Access
+
+MECHANISM ::=
+ MECHANISM_NAME
+| (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+MECHANISM_ASSOCIATION ::=
+ [formal_parameter_NAME =>] MECHANISM_NAME
+
+MECHANISM_NAME ::=
+ Value
+| Reference
+| Descriptor [([Class =>] CLASS_NAME)]
+| Short_Descriptor [([Class =>] CLASS_NAME)]
+
+CLASS_NAME ::= ubs | ubsb | uba | s | sb | a
+@end smallexample
+
+@noindent
+This pragma is identical to @code{Export_Function} except that it
+applies to a procedure rather than a function and the parameters
+@code{Result_Type} and @code{Result_Mechanism} are not permitted.
+GNAT does not require a separate pragma @code{Export}, but if none is
+present, @code{Convention Ada} is assumed, which is usually
+not what is wanted, so it is usually appropriate to use this
+pragma in conjunction with a @code{Export} or @code{Convention}
+pragma that specifies the desired foreign convention.
+
+@cindex OpenVMS
+@cindex Passing by descriptor
+Passing by descriptor is supported only on the OpenVMS ports of GNAT@.
+The default behavior for Export_Procedure is to accept either 64bit or
+32bit descriptors unless short_descriptor is specified, then only 32bit
+descriptors are accepted.
+
+@cindex Suppressing external name
+Special treatment is given if the EXTERNAL is an explicit null
+string or a static string expressions that evaluates to the null
+string. In this case, no external name is generated. This form
+still allows the specification of parameter mechanisms.
+
+@node Pragma Export_Value
+@unnumberedsec Pragma Export_Value
+@findex Export_Value
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Export_Value (
+ [Value =>] static_integer_EXPRESSION,
+ [Link_Name =>] static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma serves to export a static integer value for external use.
+The first argument specifies the value to be exported. The Link_Name
+argument specifies the symbolic name to be associated with the integer
+value. This pragma is useful for defining a named static value in Ada
+that can be referenced in assembly language units to be linked with
+the application. This pragma is currently supported only for the
+AAMP target and is ignored for other targets.
+
+@node Pragma Export_Valued_Procedure
+@unnumberedsec Pragma Export_Valued_Procedure
+@findex Export_Valued_Procedure
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Export_Valued_Procedure (
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Parameter_Types =>] PARAMETER_TYPES]
+ [, [Mechanism =>] MECHANISM]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+| ""
+
+PARAMETER_TYPES ::=
+ null
+| TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+TYPE_DESIGNATOR ::=
+ subtype_NAME
+| subtype_Name ' Access
+
+MECHANISM ::=
+ MECHANISM_NAME
+| (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+MECHANISM_ASSOCIATION ::=
+ [formal_parameter_NAME =>] MECHANISM_NAME
+
+MECHANISM_NAME ::=
+ Value
+| Reference
+| Descriptor [([Class =>] CLASS_NAME)]
+| Short_Descriptor [([Class =>] CLASS_NAME)]
+
+CLASS_NAME ::= ubs | ubsb | uba | s | sb | a
+@end smallexample
+
+@noindent
+This pragma is identical to @code{Export_Procedure} except that the
+first parameter of @var{LOCAL_NAME}, which must be present, must be of
+mode @code{OUT}, and externally the subprogram is treated as a function
+with this parameter as the result of the function. GNAT provides for
+this capability to allow the use of @code{OUT} and @code{IN OUT}
+parameters in interfacing to external functions (which are not permitted
+in Ada functions).
+GNAT does not require a separate pragma @code{Export}, but if none is
+present, @code{Convention Ada} is assumed, which is almost certainly
+not what is wanted since the whole point of this pragma is to interface
+with foreign language functions, so it is usually appropriate to use this
+pragma in conjunction with a @code{Export} or @code{Convention}
+pragma that specifies the desired foreign convention.
+
+@cindex OpenVMS
+@cindex Passing by descriptor
+Passing by descriptor is supported only on the OpenVMS ports of GNAT@.
+The default behavior for Export_Valued_Procedure is to accept either 64bit or
+32bit descriptors unless short_descriptor is specified, then only 32bit
+descriptors are accepted.
+
+@cindex Suppressing external name
+Special treatment is given if the EXTERNAL is an explicit null
+string or a static string expressions that evaluates to the null
+string. In this case, no external name is generated. This form
+still allows the specification of parameter mechanisms.
+
+@node Pragma Extend_System
+@unnumberedsec Pragma Extend_System
+@cindex @code{system}, extending
+@cindex Dec Ada 83
+@findex Extend_System
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Extend_System ([Name =>] IDENTIFIER);
+@end smallexample
+
+@noindent
+This pragma is used to provide backwards compatibility with other
+implementations that extend the facilities of package @code{System}. In
+GNAT, @code{System} contains only the definitions that are present in
+the Ada RM@. However, other implementations, notably the DEC Ada 83
+implementation, provide many extensions to package @code{System}.
+
+For each such implementation accommodated by this pragma, GNAT provides a
+package @code{Aux_@var{xxx}}, e.g.@: @code{Aux_DEC} for the DEC Ada 83
+implementation, which provides the required additional definitions. You
+can use this package in two ways. You can @code{with} it in the normal
+way and access entities either by selection or using a @code{use}
+clause. In this case no special processing is required.
+
+However, if existing code contains references such as
+@code{System.@var{xxx}} where @var{xxx} is an entity in the extended
+definitions provided in package @code{System}, you may use this pragma
+to extend visibility in @code{System} in a non-standard way that
+provides greater compatibility with the existing code. Pragma
+@code{Extend_System} is a configuration pragma whose single argument is
+the name of the package containing the extended definition
+(e.g.@: @code{Aux_DEC} for the DEC Ada case). A unit compiled under
+control of this pragma will be processed using special visibility
+processing that looks in package @code{System.Aux_@var{xxx}} where
+@code{Aux_@var{xxx}} is the pragma argument for any entity referenced in
+package @code{System}, but not found in package @code{System}.
+
+You can use this pragma either to access a predefined @code{System}
+extension supplied with the compiler, for example @code{Aux_DEC} or
+you can construct your own extension unit following the above
+definition. Note that such a package is a child of @code{System}
+and thus is considered part of the implementation.
+To compile it you will have to use the @option{-gnatg} switch,
+or the @option{/GNAT_INTERNAL} qualifier on OpenVMS,
+for compiling System units, as explained in the
+@value{EDITION} User's Guide.
+
+@node Pragma Extensions_Allowed
+@unnumberedsec Pragma Extensions_Allowed
+@cindex Ada Extensions
+@cindex GNAT Extensions
+@findex Extensions_Allowed
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Extensions_Allowed (On | Off);
+@end smallexample
+
+@noindent
+This configuration pragma enables or disables the implementation
+extension mode (the use of Off as a parameter cancels the effect
+of the @option{-gnatX} command switch).
+
+In extension mode, the latest version of the Ada language is
+implemented (currently Ada 2012), and in addition a small number
+of GNAT specific extensions are recognized as follows:
+
+@table @asis
+@item Constrained attribute for generic objects
+The @code{Constrained} attribute is permitted for objects of
+generic types. The result indicates if the corresponding actual
+is constrained.
+
+@end table
+
+@node Pragma External
+@unnumberedsec Pragma External
+@findex External
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma External (
+ [ Convention =>] convention_IDENTIFIER,
+ [ Entity =>] LOCAL_NAME
+ [, [External_Name =>] static_string_EXPRESSION ]
+ [, [Link_Name =>] static_string_EXPRESSION ]);
+@end smallexample
+
+@noindent
+This pragma is identical in syntax and semantics to pragma
+@code{Export} as defined in the Ada Reference Manual. It is
+provided for compatibility with some Ada 83 compilers that
+used this pragma for exactly the same purposes as pragma
+@code{Export} before the latter was standardized.
+
+@node Pragma External_Name_Casing
+@unnumberedsec Pragma External_Name_Casing
+@cindex Dec Ada 83 casing compatibility
+@cindex External Names, casing
+@cindex Casing of External names
+@findex External_Name_Casing
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma External_Name_Casing (
+ Uppercase | Lowercase
+ [, Uppercase | Lowercase | As_Is]);
+@end smallexample
+
+@noindent
+This pragma provides control over the casing of external names associated
+with Import and Export pragmas. There are two cases to consider:
+
+@table @asis
+@item Implicit external names
+Implicit external names are derived from identifiers. The most common case
+arises when a standard Ada Import or Export pragma is used with only two
+arguments, as in:
+
+@smallexample @c ada
+ pragma Import (C, C_Routine);
+@end smallexample
+
+@noindent
+Since Ada is a case-insensitive language, the spelling of the identifier in
+the Ada source program does not provide any information on the desired
+casing of the external name, and so a convention is needed. In GNAT the
+default treatment is that such names are converted to all lower case
+letters. This corresponds to the normal C style in many environments.
+The first argument of pragma @code{External_Name_Casing} can be used to
+control this treatment. If @code{Uppercase} is specified, then the name
+will be forced to all uppercase letters. If @code{Lowercase} is specified,
+then the normal default of all lower case letters will be used.
+
+This same implicit treatment is also used in the case of extended DEC Ada 83
+compatible Import and Export pragmas where an external name is explicitly
+specified using an identifier rather than a string.
+
+@item Explicit external names
+Explicit external names are given as string literals. The most common case
+arises when a standard Ada Import or Export pragma is used with three
+arguments, as in:
+
+@smallexample @c ada
+pragma Import (C, C_Routine, "C_routine");
+@end smallexample
+
+@noindent
+In this case, the string literal normally provides the exact casing required
+for the external name. The second argument of pragma
+@code{External_Name_Casing} may be used to modify this behavior.
+If @code{Uppercase} is specified, then the name
+will be forced to all uppercase letters. If @code{Lowercase} is specified,
+then the name will be forced to all lowercase letters. A specification of
+@code{As_Is} provides the normal default behavior in which the casing is
+taken from the string provided.
+@end table
+
+@noindent
+This pragma may appear anywhere that a pragma is valid. In particular, it
+can be used as a configuration pragma in the @file{gnat.adc} file, in which
+case it applies to all subsequent compilations, or it can be used as a program
+unit pragma, in which case it only applies to the current unit, or it can
+be used more locally to control individual Import/Export pragmas.
+
+It is primarily intended for use with OpenVMS systems, where many
+compilers convert all symbols to upper case by default. For interfacing to
+such compilers (e.g.@: the DEC C compiler), it may be convenient to use
+the pragma:
+
+@smallexample @c ada
+pragma External_Name_Casing (Uppercase, Uppercase);
+@end smallexample
+
+@noindent
+to enforce the upper casing of all external symbols.
+
+@node Pragma Fast_Math
+@unnumberedsec Pragma Fast_Math
+@findex Fast_Math
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Fast_Math;
+@end smallexample
+
+@noindent
+This is a configuration pragma which activates a mode in which speed is
+considered more important for floating-point operations than absolutely
+accurate adherence to the requirements of the standard. Currently the
+following operations are affected:
+
+@table @asis
+@item Complex Multiplication
+The normal simple formula for complex multiplication can result in intermediate
+overflows for numbers near the end of the range. The Ada standard requires that
+this situation be detected and corrected by scaling, but in Fast_Math mode such
+cases will simply result in overflow. Note that to take advantage of this you
+must instantiate your own version of @code{Ada.Numerics.Generic_Complex_Types}
+under control of the pragma, rather than use the preinstantiated versions.
+@end table
+
+@node Pragma Favor_Top_Level
+@unnumberedsec Pragma Favor_Top_Level
+@findex Favor_Top_Level
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Favor_Top_Level (type_NAME);
+@end smallexample
+
+@noindent
+The named type must be an access-to-subprogram type. This pragma is an
+efficiency hint to the compiler, regarding the use of 'Access or
+'Unrestricted_Access on nested (non-library-level) subprograms. The
+pragma means that nested subprograms are not used with this type, or
+are rare, so that the generated code should be efficient in the
+top-level case. When this pragma is used, dynamically generated
+trampolines may be used on some targets for nested subprograms.
+See also the No_Implicit_Dynamic_Code restriction.
+
+@node Pragma Finalize_Storage_Only
+@unnumberedsec Pragma Finalize_Storage_Only
+@findex Finalize_Storage_Only
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Finalize_Storage_Only (first_subtype_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma allows the compiler not to emit a Finalize call for objects
+defined at the library level. This is mostly useful for types where
+finalization is only used to deal with storage reclamation since in most
+environments it is not necessary to reclaim memory just before terminating
+execution, hence the name.
+
+@node Pragma Float_Representation
+@unnumberedsec Pragma Float_Representation
+@cindex OpenVMS
+@findex Float_Representation
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Float_Representation (FLOAT_REP[, float_type_LOCAL_NAME]);
+
+FLOAT_REP ::= VAX_Float | IEEE_Float
+@end smallexample
+
+@noindent
+In the one argument form, this pragma is a configuration pragma which
+allows control over the internal representation chosen for the predefined
+floating point types declared in the packages @code{Standard} and
+@code{System}. On all systems other than OpenVMS, the argument must
+be @code{IEEE_Float} and the pragma has no effect. On OpenVMS, the
+argument may be @code{VAX_Float} to specify the use of the VAX float
+format for the floating-point types in Standard. This requires that
+the standard runtime libraries be recompiled.
+
+The two argument form specifies the representation to be used for
+the specified floating-point type. On all systems other than OpenVMS,
+the argument must
+be @code{IEEE_Float} to specify the use of IEEE format, as follows:
+
+@itemize @bullet
+@item
+For a digits value of 6, 32-bit IEEE short format will be used.
+@item
+For a digits value of 15, 64-bit IEEE long format will be used.
+@item
+No other value of digits is permitted.
+@end itemize
+
+On OpenVMS, the
+argument may be @code{VAX_Float} to specify the use of the VAX float
+format, as follows:
+
+@itemize @bullet
+@item
+For digits values up to 6, F float format will be used.
+@item
+For digits values from 7 to 9, D float format will be used.
+@item
+For digits values from 10 to 15, G float format will be used.
+@item
+Digits values above 15 are not allowed.
+@end itemize
+
+@node Pragma Global
+@unnumberedsec Pragma Global
+@findex Global
+@noindent
+For the description of this pragma, see SPARK 2014 Reference Manual,
+section 6.1.4.
+
+@node Pragma Ident
+@unnumberedsec Pragma Ident
+@findex Ident
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Ident (static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma provides a string identification in the generated object file,
+if the system supports the concept of this kind of identification string.
+This pragma is allowed only in the outermost declarative part or
+declarative items of a compilation unit. If more than one @code{Ident}
+pragma is given, only the last one processed is effective.
+@cindex OpenVMS
+On OpenVMS systems, the effect of the pragma is identical to the effect of
+the DEC Ada 83 pragma of the same name. Note that in DEC Ada 83, the
+maximum allowed length is 31 characters, so if it is important to
+maintain compatibility with this compiler, you should obey this length
+limit.
+
+@node Pragma Implementation_Defined
+@unnumberedsec Pragma Implementation_Defined
+@findex Implementation_Defined
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Implementation_Defined (local_NAME);
+@end smallexample
+
+@noindent
+This pragma marks a previously declared entioty as implementation-defined.
+For an overloaded entity, applies to the most recent homonym.
+
+@smallexample @c ada
+pragma Implementation_Defined;
+@end smallexample
+
+@noindent
+The form with no arguments appears anywhere within a scope, most
+typically a package spec, and indicates that all entities that are
+defined within the package spec are Implementation_Defined.
+
+This pragma is used within the GNAT runtime library to identify
+implementation-defined entities introduced in language-defined units,
+for the purpose of implementing the No_Implementation_Identifiers
+restriction.
+
+@node Pragma Implemented
+@unnumberedsec Pragma Implemented
+@findex Implemented
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Implemented (procedure_LOCAL_NAME, implementation_kind);
+
+implementation_kind ::= By_Entry | By_Protected_Procedure | By_Any
+@end smallexample
+
+@noindent
+This is an Ada 2012 representation pragma which applies to protected, task
+and synchronized interface primitives. The use of pragma Implemented provides
+a way to impose a static requirement on the overriding operation by adhering
+to one of the three implementation kinds: entry, protected procedure or any of
+the above. This pragma is available in all earlier versions of Ada as an
+implementation-defined pragma.
+
+@smallexample @c ada
+type Synch_Iface is synchronized interface;
+procedure Prim_Op (Obj : in out Iface) is abstract;
+pragma Implemented (Prim_Op, By_Protected_Procedure);
+
+protected type Prot_1 is new Synch_Iface with
+ procedure Prim_Op; -- Legal
+end Prot_1;
+
+protected type Prot_2 is new Synch_Iface with
+ entry Prim_Op; -- Illegal
+end Prot_2;
+
+task type Task_Typ is new Synch_Iface with
+ entry Prim_Op; -- Illegal
+end Task_Typ;
+@end smallexample
+
+@noindent
+When applied to the procedure_or_entry_NAME of a requeue statement, pragma
+Implemented determines the runtime behavior of the requeue. Implementation kind
+By_Entry guarantees that the action of requeueing will proceed from an entry to
+another entry. Implementation kind By_Protected_Procedure transforms the
+requeue into a dispatching call, thus eliminating the chance of blocking. Kind
+By_Any shares the behavior of By_Entry and By_Protected_Procedure depending on
+the target's overriding subprogram kind.
+
+@node Pragma Implicit_Packing
+@unnumberedsec Pragma Implicit_Packing
+@findex Implicit_Packing
+@cindex Rational Profile
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Implicit_Packing;
+@end smallexample
+
+@noindent
+This is a configuration pragma that requests implicit packing for packed
+arrays for which a size clause is given but no explicit pragma Pack or
+specification of Component_Size is present. It also applies to records
+where no record representation clause is present. Consider this example:
+
+@smallexample @c ada
+type R is array (0 .. 7) of Boolean;
+for R'Size use 8;
+@end smallexample
+
+@noindent
+In accordance with the recommendation in the RM (RM 13.3(53)), a Size clause
+does not change the layout of a composite object. So the Size clause in the
+above example is normally rejected, since the default layout of the array uses
+8-bit components, and thus the array requires a minimum of 64 bits.
+
+If this declaration is compiled in a region of code covered by an occurrence
+of the configuration pragma Implicit_Packing, then the Size clause in this
+and similar examples will cause implicit packing and thus be accepted. For
+this implicit packing to occur, the type in question must be an array of small
+components whose size is known at compile time, and the Size clause must
+specify the exact size that corresponds to the number of elements in the array
+multiplied by the size in bits of the component type (both single and
+multi-dimensioned arrays can be controlled with this pragma).
+
+@cindex Array packing
+
+Similarly, the following example shows the use in the record case
+
+@smallexample @c ada
+type r is record
+ a, b, c, d, e, f, g, h : boolean;
+ chr : character;
+end record;
+for r'size use 16;
+@end smallexample
+
+@noindent
+Without a pragma Pack, each Boolean field requires 8 bits, so the
+minimum size is 72 bits, but with a pragma Pack, 16 bits would be
+sufficient. The use of pragma Implicit_Packing allows this record
+declaration to compile without an explicit pragma Pack.
+@node Pragma Import_Exception
+@unnumberedsec Pragma Import_Exception
+@cindex OpenVMS
+@findex Import_Exception
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Import_Exception (
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Form =>] Ada | VMS]
+ [, [Code =>] static_integer_EXPRESSION]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+@end smallexample
+
+@noindent
+This pragma is implemented only in the OpenVMS implementation of GNAT@.
+It allows OpenVMS conditions (for example, from OpenVMS system services or
+other OpenVMS languages) to be propagated to Ada programs as Ada exceptions.
+The pragma specifies that the exception associated with an exception
+declaration in an Ada program be defined externally (in non-Ada code).
+For further details on this pragma, see the
+DEC Ada Language Reference Manual, section 13.9a.3.1.
+
+@node Pragma Import_Function
+@unnumberedsec Pragma Import_Function
+@findex Import_Function
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Import_Function (
+ [Internal =>] LOCAL_NAME,
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Parameter_Types =>] PARAMETER_TYPES]
+ [, [Result_Type =>] SUBTYPE_MARK]
+ [, [Mechanism =>] MECHANISM]
+ [, [Result_Mechanism =>] MECHANISM_NAME]
+ [, [First_Optional_Parameter =>] IDENTIFIER]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+
+PARAMETER_TYPES ::=
+ null
+| TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+TYPE_DESIGNATOR ::=
+ subtype_NAME
+| subtype_Name ' Access
+
+MECHANISM ::=
+ MECHANISM_NAME
+| (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+MECHANISM_ASSOCIATION ::=
+ [formal_parameter_NAME =>] MECHANISM_NAME
+
+MECHANISM_NAME ::=
+ Value
+| Reference
+| Descriptor [([Class =>] CLASS_NAME)]
+| Short_Descriptor [([Class =>] CLASS_NAME)]
+
+CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+@end smallexample
+
+@noindent
+This pragma is used in conjunction with a pragma @code{Import} to
+specify additional information for an imported function. The pragma
+@code{Import} (or equivalent pragma @code{Interface}) must precede the
+@code{Import_Function} pragma and both must appear in the same
+declarative part as the function specification.
+
+The @var{Internal} argument must uniquely designate
+the function to which the
+pragma applies. If more than one function name exists of this name in
+the declarative part you must use the @code{Parameter_Types} and
+@var{Result_Type} parameters to achieve the required unique
+designation. Subtype marks in these parameters must exactly match the
+subtypes in the corresponding function specification, using positional
+notation to match parameters with subtype marks.
+The form with an @code{'Access} attribute can be used to match an
+anonymous access parameter.
+
+You may optionally use the @var{Mechanism} and @var{Result_Mechanism}
+parameters to specify passing mechanisms for the
+parameters and result. If you specify a single mechanism name, it
+applies to all parameters. Otherwise you may specify a mechanism on a
+parameter by parameter basis using either positional or named
+notation. If the mechanism is not specified, the default mechanism
+is used.
+
+@cindex OpenVMS
+@cindex Passing by descriptor
+Passing by descriptor is supported only on the OpenVMS ports of GNAT@.
+The default behavior for Import_Function is to pass a 64bit descriptor
+unless short_descriptor is specified, then a 32bit descriptor is passed.
+
+@code{First_Optional_Parameter} applies only to OpenVMS ports of GNAT@.
+It specifies that the designated parameter and all following parameters
+are optional, meaning that they are not passed at the generated code
+level (this is distinct from the notion of optional parameters in Ada
+where the parameters are passed anyway with the designated optional
+parameters). All optional parameters must be of mode @code{IN} and have
+default parameter values that are either known at compile time
+expressions, or uses of the @code{'Null_Parameter} attribute.
+
+@node Pragma Import_Object
+@unnumberedsec Pragma Import_Object
+@findex Import_Object
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Import_Object
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Size =>] EXTERNAL_SYMBOL]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+@end smallexample
+
+@noindent
+This pragma designates an object as imported, and apart from the
+extended rules for external symbols, is identical in effect to the use of
+the normal @code{Import} pragma applied to an object. Unlike the
+subprogram case, you need not use a separate @code{Import} pragma,
+although you may do so (and probably should do so from a portability
+point of view). @var{size} is syntax checked, but otherwise ignored by
+GNAT@.
+
+@node Pragma Import_Procedure
+@unnumberedsec Pragma Import_Procedure
+@findex Import_Procedure
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Import_Procedure (
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Parameter_Types =>] PARAMETER_TYPES]
+ [, [Mechanism =>] MECHANISM]
+ [, [First_Optional_Parameter =>] IDENTIFIER]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+
+PARAMETER_TYPES ::=
+ null
+| TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+TYPE_DESIGNATOR ::=
+ subtype_NAME
+| subtype_Name ' Access
+
+MECHANISM ::=
+ MECHANISM_NAME
+| (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+MECHANISM_ASSOCIATION ::=
+ [formal_parameter_NAME =>] MECHANISM_NAME
+
+MECHANISM_NAME ::=
+ Value
+| Reference
+| Descriptor [([Class =>] CLASS_NAME)]
+| Short_Descriptor [([Class =>] CLASS_NAME)]
+
+CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+@end smallexample
+
+@noindent
+This pragma is identical to @code{Import_Function} except that it
+applies to a procedure rather than a function and the parameters
+@code{Result_Type} and @code{Result_Mechanism} are not permitted.
+
+@node Pragma Import_Valued_Procedure
+@unnumberedsec Pragma Import_Valued_Procedure
+@findex Import_Valued_Procedure
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Import_Valued_Procedure (
+ [Internal =>] LOCAL_NAME
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Parameter_Types =>] PARAMETER_TYPES]
+ [, [Mechanism =>] MECHANISM]
+ [, [First_Optional_Parameter =>] IDENTIFIER]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+
+PARAMETER_TYPES ::=
+ null
+| TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+TYPE_DESIGNATOR ::=
+ subtype_NAME
+| subtype_Name ' Access
+
+MECHANISM ::=
+ MECHANISM_NAME
+| (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+MECHANISM_ASSOCIATION ::=
+ [formal_parameter_NAME =>] MECHANISM_NAME
+
+MECHANISM_NAME ::=
+ Value
+| Reference
+| Descriptor [([Class =>] CLASS_NAME)]
+| Short_Descriptor [([Class =>] CLASS_NAME)]
+
+CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+@end smallexample
+
+@noindent
+This pragma is identical to @code{Import_Procedure} except that the
+first parameter of @var{LOCAL_NAME}, which must be present, must be of
+mode @code{OUT}, and externally the subprogram is treated as a function
+with this parameter as the result of the function. The purpose of this
+capability is to allow the use of @code{OUT} and @code{IN OUT}
+parameters in interfacing to external functions (which are not permitted
+in Ada functions). You may optionally use the @code{Mechanism}
+parameters to specify passing mechanisms for the parameters.
+If you specify a single mechanism name, it applies to all parameters.
+Otherwise you may specify a mechanism on a parameter by parameter
+basis using either positional or named notation. If the mechanism is not
+specified, the default mechanism is used.
+
+Note that it is important to use this pragma in conjunction with a separate
+pragma Import that specifies the desired convention, since otherwise the
+default convention is Ada, which is almost certainly not what is required.
+
+@node Pragma Independent
+@unnumberedsec Pragma Independent
+@findex Independent
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Independent (Local_NAME);
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2012 mode (which also provides an aspect
+of the same name). It is also available as an implementation-defined
+pragma in all earlier versions. It specifies that the
+designated object or all objects of the designated type must be
+independently addressable. This means that separate tasks can safely
+manipulate such objects. For example, if two components of a record are
+independent, then two separate tasks may access these two components.
+This may place
+constraints on the representation of the object (for instance prohibiting
+tight packing).
+
+@node Pragma Independent_Components
+@unnumberedsec Pragma Independent_Components
+@findex Independent_Components
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Independent_Components (Local_NAME);
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2012 mode (which also provides an aspect
+of the same name). It is also available as an implementation-defined
+pragma in all earlier versions. It specifies that the components of the
+designated object, or the components of each object of the designated
+type, must be
+independently addressable. This means that separate tasks can safely
+manipulate separate components in the composite object. This may place
+constraints on the representation of the object (for instance prohibiting
+tight packing).
+
+@node Pragma Initial_Condition
+@unnumberedsec Pragma Initial_Condition
+@findex Initial_Condition
+@noindent
+For the description of this pragma, see SPARK 2014 Reference Manual,
+section 7.1.6.
+
+@node Pragma Initialize_Scalars
+@unnumberedsec Pragma Initialize_Scalars
+@findex Initialize_Scalars
+@cindex debugging with Initialize_Scalars
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Initialize_Scalars;
+@end smallexample
+
+@noindent
+This pragma is similar to @code{Normalize_Scalars} conceptually but has
+two important differences. First, there is no requirement for the pragma
+to be used uniformly in all units of a partition, in particular, it is fine
+to use this just for some or all of the application units of a partition,
+without needing to recompile the run-time library.
+
+In the case where some units are compiled with the pragma, and some without,
+then a declaration of a variable where the type is defined in package
+Standard or is locally declared will always be subject to initialization,
+as will any declaration of a scalar variable. For composite variables,
+whether the variable is initialized may also depend on whether the package
+in which the type of the variable is declared is compiled with the pragma.
+
+The other important difference is that you can control the value used
+for initializing scalar objects. At bind time, you can select several
+options for initialization. You can
+initialize with invalid values (similar to Normalize_Scalars, though for
+Initialize_Scalars it is not always possible to determine the invalid
+values in complex cases like signed component fields with non-standard
+sizes). You can also initialize with high or
+low values, or with a specified bit pattern. See the @value{EDITION}
+User's Guide for binder options for specifying these cases.
+
+This means that you can compile a program, and then without having to
+recompile the program, you can run it with different values being used
+for initializing otherwise uninitialized values, to test if your program
+behavior depends on the choice. Of course the behavior should not change,
+and if it does, then most likely you have an incorrect reference to an
+uninitialized value.
+
+It is even possible to change the value at execution time eliminating even
+the need to rebind with a different switch using an environment variable.
+See the @value{EDITION} User's Guide for details.
+
+Note that pragma @code{Initialize_Scalars} is particularly useful in
+conjunction with the enhanced validity checking that is now provided
+in GNAT, which checks for invalid values under more conditions.
+Using this feature (see description of the @option{-gnatV} flag in the
+@value{EDITION} User's Guide) in conjunction with
+pragma @code{Initialize_Scalars}
+provides a powerful new tool to assist in the detection of problems
+caused by uninitialized variables.
+
+Note: the use of @code{Initialize_Scalars} has a fairly extensive
+effect on the generated code. This may cause your code to be
+substantially larger. It may also cause an increase in the amount
+of stack required, so it is probably a good idea to turn on stack
+checking (see description of stack checking in the @value{EDITION}
+User's Guide) when using this pragma.
+
+@node Pragma Initializes
+@unnumberedsec Pragma Initializes
+@findex Initializes
+@noindent
+For the description of this pragma, see SPARK 2014 Reference Manual,
+section 7.1.5.
+
+@node Pragma Inline_Always
+@unnumberedsec Pragma Inline_Always
+@findex Inline_Always
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Inline_Always (NAME [, NAME]);
+@end smallexample
+
+@noindent
+Similar to pragma @code{Inline} except that inlining is not subject to
+the use of option @option{-gnatn} or @option{-gnatN} and the inlining
+happens regardless of whether these options are used.
+
+@node Pragma Inline_Generic
+@unnumberedsec Pragma Inline_Generic
+@findex Inline_Generic
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Inline_Generic (GNAME @{, GNAME@});
+
+GNAME ::= generic_unit_NAME | generic_instance_NAME
+@end smallexample
+
+@noindent
+This pragma is provided for compatibility with Dec Ada 83. It has
+no effect in @code{GNAT} (which always inlines generics), other
+than to check that the given names are all names of generic units or
+generic instances.
+
+@node Pragma Interface
+@unnumberedsec Pragma Interface
+@findex Interface
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Interface (
+ [Convention =>] convention_identifier,
+ [Entity =>] local_NAME
+ [, [External_Name =>] static_string_expression]
+ [, [Link_Name =>] static_string_expression]);
+@end smallexample
+
+@noindent
+This pragma is identical in syntax and semantics to
+the standard Ada pragma @code{Import}. It is provided for compatibility
+with Ada 83. The definition is upwards compatible both with pragma
+@code{Interface} as defined in the Ada 83 Reference Manual, and also
+with some extended implementations of this pragma in certain Ada 83
+implementations. The only difference between pragma @code{Interface}
+and pragma @code{Import} is that there is special circuitry to allow
+both pragmas to appear for the same subprogram entity (normally it
+is illegal to have multiple @code{Import} pragmas. This is useful in
+maintaining Ada 83/Ada 95 compatibility and is compatible with other
+Ada 83 compilers.
+
+@node Pragma Interface_Name
+@unnumberedsec Pragma Interface_Name
+@findex Interface_Name
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Interface_Name (
+ [Entity =>] LOCAL_NAME
+ [, [External_Name =>] static_string_EXPRESSION]
+ [, [Link_Name =>] static_string_EXPRESSION]);
+@end smallexample
+
+@noindent
+This pragma provides an alternative way of specifying the interface name
+for an interfaced subprogram, and is provided for compatibility with Ada
+83 compilers that use the pragma for this purpose. You must provide at
+least one of @var{External_Name} or @var{Link_Name}.
+
+@node Pragma Interrupt_Handler
+@unnumberedsec Pragma Interrupt_Handler
+@findex Interrupt_Handler
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Interrupt_Handler (procedure_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This program unit pragma is supported for parameterless protected procedures
+as described in Annex C of the Ada Reference Manual. On the AAMP target
+the pragma can also be specified for nonprotected parameterless procedures
+that are declared at the library level (which includes procedures
+declared at the top level of a library package). In the case of AAMP,
+when this pragma is applied to a nonprotected procedure, the instruction
+@code{IERET} is generated for returns from the procedure, enabling
+maskable interrupts, in place of the normal return instruction.
+
+@node Pragma Interrupt_State
+@unnumberedsec Pragma Interrupt_State
+@findex Interrupt_State
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Interrupt_State
+ ([Name =>] value,
+ [State =>] SYSTEM | RUNTIME | USER);
+@end smallexample
+
+@noindent
+Normally certain interrupts are reserved to the implementation. Any attempt
+to attach an interrupt causes Program_Error to be raised, as described in
+RM C.3.2(22). A typical example is the @code{SIGINT} interrupt used in
+many systems for an @kbd{Ctrl-C} interrupt. Normally this interrupt is
+reserved to the implementation, so that @kbd{Ctrl-C} can be used to
+interrupt execution. Additionally, signals such as @code{SIGSEGV},
+@code{SIGABRT}, @code{SIGFPE} and @code{SIGILL} are often mapped to specific
+Ada exceptions, or used to implement run-time functions such as the
+@code{abort} statement and stack overflow checking.
+
+Pragma @code{Interrupt_State} provides a general mechanism for overriding
+such uses of interrupts. It subsumes the functionality of pragma
+@code{Unreserve_All_Interrupts}. Pragma @code{Interrupt_State} is not
+available on Windows or VMS. On all other platforms than VxWorks,
+it applies to signals; on VxWorks, it applies to vectored hardware interrupts
+and may be used to mark interrupts required by the board support package
+as reserved.
+
+Interrupts can be in one of three states:
+@itemize @bullet
+@item System
+
+The interrupt is reserved (no Ada handler can be installed), and the
+Ada run-time may not install a handler. As a result you are guaranteed
+standard system default action if this interrupt is raised.
+
+@item Runtime
+
+The interrupt is reserved (no Ada handler can be installed). The run time
+is allowed to install a handler for internal control purposes, but is
+not required to do so.
+
+@item User
+
+The interrupt is unreserved. The user may install a handler to provide
+some other action.
+@end itemize
+
+@noindent
+These states are the allowed values of the @code{State} parameter of the
+pragma. The @code{Name} parameter is a value of the type
+@code{Ada.Interrupts.Interrupt_ID}. Typically, it is a name declared in
+@code{Ada.Interrupts.Names}.
+
+This is a configuration pragma, and the binder will check that there
+are no inconsistencies between different units in a partition in how a
+given interrupt is specified. It may appear anywhere a pragma is legal.
+
+The effect is to move the interrupt to the specified state.
+
+By declaring interrupts to be SYSTEM, you guarantee the standard system
+action, such as a core dump.
+
+By declaring interrupts to be USER, you guarantee that you can install
+a handler.
+
+Note that certain signals on many operating systems cannot be caught and
+handled by applications. In such cases, the pragma is ignored. See the
+operating system documentation, or the value of the array @code{Reserved}
+declared in the spec of package @code{System.OS_Interface}.
+
+Overriding the default state of signals used by the Ada runtime may interfere
+with an application's runtime behavior in the cases of the synchronous signals,
+and in the case of the signal used to implement the @code{abort} statement.
+
+@node Pragma Invariant
+@unnumberedsec Pragma Invariant
+@findex Invariant
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Invariant
+ ([Entity =>] private_type_LOCAL_NAME,
+ [Check =>] EXPRESSION
+ [,[Message =>] String_Expression]);
+@end smallexample
+
+@noindent
+This pragma provides exactly the same capabilities as the Type_Invariant aspect
+defined in AI05-0146-1, and in the Ada 2012 Reference Manual. The
+Type_Invariant aspect is fully implemented in Ada 2012 mode, but since it
+requires the use of the aspect syntax, which is not available except in 2012
+mode, it is not possible to use the Type_Invariant aspect in earlier versions
+of Ada. However the Invariant pragma may be used in any version of Ada. Also
+note that the aspect Invariant is a synonym in GNAT for the aspect
+Type_Invariant, but there is no pragma Type_Invariant.
+
+The pragma must appear within the visible part of the package specification,
+after the type to which its Entity argument appears. As with the Invariant
+aspect, the Check expression is not analyzed until the end of the visible
+part of the package, so it may contain forward references. The Message
+argument, if present, provides the exception message used if the invariant
+is violated. If no Message parameter is provided, a default message that
+identifies the line on which the pragma appears is used.
+
+It is permissible to have multiple Invariants for the same type entity, in
+which case they are and'ed together. It is permissible to use this pragma
+in Ada 2012 mode, but you cannot have both an invariant aspect and an
+invariant pragma for the same entity.
+
+For further details on the use of this pragma, see the Ada 2012 documentation
+of the Type_Invariant aspect.
+
+@node Pragma Java_Constructor
+@unnumberedsec Pragma Java_Constructor
+@findex Java_Constructor
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Java_Constructor ([Entity =>] function_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma is used to assert that the specified Ada function should be
+mapped to the Java constructor for some Ada tagged record type.
+
+See section 7.3.2 of the
+@code{GNAT User's Guide: Supplement for the JVM Platform.}
+for related information.
+
+@node Pragma Java_Interface
+@unnumberedsec Pragma Java_Interface
+@findex Java_Interface
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Java_Interface ([Entity =>] abstract_tagged_type_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma is used to assert that the specified Ada abstract tagged type
+is to be mapped to a Java interface name.
+
+See sections 7.1 and 7.2 of the
+@code{GNAT User's Guide: Supplement for the JVM Platform.}
+for related information.
+
+@node Pragma Keep_Names
+@unnumberedsec Pragma Keep_Names
+@findex Keep_Names
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Keep_Names ([On =>] enumeration_first_subtype_LOCAL_NAME);
+@end smallexample
+
+@noindent
+The @var{LOCAL_NAME} argument
+must refer to an enumeration first subtype
+in the current declarative part. The effect is to retain the enumeration
+literal names for use by @code{Image} and @code{Value} even if a global
+@code{Discard_Names} pragma applies. This is useful when you want to
+generally suppress enumeration literal names and for example you therefore
+use a @code{Discard_Names} pragma in the @file{gnat.adc} file, but you
+want to retain the names for specific enumeration types.
+
+@node Pragma License
+@unnumberedsec Pragma License
+@findex License
+@cindex License checking
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma License (Unrestricted | GPL | Modified_GPL | Restricted);
+@end smallexample
+
+@noindent
+This pragma is provided to allow automated checking for appropriate license
+conditions with respect to the standard and modified GPL@. A pragma
+@code{License}, which is a configuration pragma that typically appears at
+the start of a source file or in a separate @file{gnat.adc} file, specifies
+the licensing conditions of a unit as follows:
+
+@itemize @bullet
+@item Unrestricted
+This is used for a unit that can be freely used with no license restrictions.
+Examples of such units are public domain units, and units from the Ada
+Reference Manual.
+
+@item GPL
+This is used for a unit that is licensed under the unmodified GPL, and which
+therefore cannot be @code{with}'ed by a restricted unit.
+
+@item Modified_GPL
+This is used for a unit licensed under the GNAT modified GPL that includes
+a special exception paragraph that specifically permits the inclusion of
+the unit in programs without requiring the entire program to be released
+under the GPL@.
+
+@item Restricted
+This is used for a unit that is restricted in that it is not permitted to
+depend on units that are licensed under the GPL@. Typical examples are
+proprietary code that is to be released under more restrictive license
+conditions. Note that restricted units are permitted to @code{with} units
+which are licensed under the modified GPL (this is the whole point of the
+modified GPL).
+
+@end itemize
+
+@noindent
+Normally a unit with no @code{License} pragma is considered to have an
+unknown license, and no checking is done. However, standard GNAT headers
+are recognized, and license information is derived from them as follows.
+
+@itemize @bullet
+
+A GNAT license header starts with a line containing 78 hyphens. The following
+comment text is searched for the appearance of any of the following strings.
+
+If the string ``GNU General Public License'' is found, then the unit is assumed
+to have GPL license, unless the string ``As a special exception'' follows, in
+which case the license is assumed to be modified GPL@.
+
+If one of the strings
+``This specification is adapted from the Ada Semantic Interface'' or
+``This specification is derived from the Ada Reference Manual'' is found
+then the unit is assumed to be unrestricted.
+@end itemize
+
+@noindent
+These default actions means that a program with a restricted license pragma
+will automatically get warnings if a GPL unit is inappropriately
+@code{with}'ed. For example, the program:
+
+@smallexample @c ada
+with Sem_Ch3;
+with GNAT.Sockets;
+procedure Secret_Stuff is
+ @dots{}
+end Secret_Stuff
+@end smallexample
+
+@noindent
+if compiled with pragma @code{License} (@code{Restricted}) in a
+@file{gnat.adc} file will generate the warning:
+
+@smallexample
+1. with Sem_Ch3;
+ |
+ >>> license of withed unit "Sem_Ch3" is incompatible
+
+2. with GNAT.Sockets;
+3. procedure Secret_Stuff is
+@end smallexample
+
+@noindent
+Here we get a warning on @code{Sem_Ch3} since it is part of the GNAT
+compiler and is licensed under the
+GPL, but no warning for @code{GNAT.Sockets} which is part of the GNAT
+run time, and is therefore licensed under the modified GPL@.
+
+@node Pragma Link_With
+@unnumberedsec Pragma Link_With
+@findex Link_With
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Link_With (static_string_EXPRESSION @{,static_string_EXPRESSION@});
+@end smallexample
+
+@noindent
+This pragma is provided for compatibility with certain Ada 83 compilers.
+It has exactly the same effect as pragma @code{Linker_Options} except
+that spaces occurring within one of the string expressions are treated
+as separators. For example, in the following case:
+
+@smallexample @c ada
+pragma Link_With ("-labc -ldef");
+@end smallexample
+
+@noindent
+results in passing the strings @code{-labc} and @code{-ldef} as two
+separate arguments to the linker. In addition pragma Link_With allows
+multiple arguments, with the same effect as successive pragmas.
+
+@node Pragma Linker_Alias
+@unnumberedsec Pragma Linker_Alias
+@findex Linker_Alias
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Linker_Alias (
+ [Entity =>] LOCAL_NAME,
+ [Target =>] static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+@var{LOCAL_NAME} must refer to an object that is declared at the library
+level. This pragma establishes the given entity as a linker alias for the
+given target. It is equivalent to @code{__attribute__((alias))} in GNU C
+and causes @var{LOCAL_NAME} to be emitted as an alias for the symbol
+@var{static_string_EXPRESSION} in the object file, that is to say no space
+is reserved for @var{LOCAL_NAME} by the assembler and it will be resolved
+to the same address as @var{static_string_EXPRESSION} by the linker.
+
+The actual linker name for the target must be used (e.g.@: the fully
+encoded name with qualification in Ada, or the mangled name in C++),
+or it must be declared using the C convention with @code{pragma Import}
+or @code{pragma Export}.
+
+Not all target machines support this pragma. On some of them it is accepted
+only if @code{pragma Weak_External} has been applied to @var{LOCAL_NAME}.
+
+@smallexample @c ada
+-- Example of the use of pragma Linker_Alias
+
+package p is
+ i : Integer := 1;
+ pragma Export (C, i);
+
+ new_name_for_i : Integer;
+ pragma Linker_Alias (new_name_for_i, "i");
+end p;
+@end smallexample
+
+@node Pragma Linker_Constructor
+@unnumberedsec Pragma Linker_Constructor
+@findex Linker_Constructor
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Linker_Constructor (procedure_LOCAL_NAME);
+@end smallexample
+
+@noindent
+@var{procedure_LOCAL_NAME} must refer to a parameterless procedure that
+is declared at the library level. A procedure to which this pragma is
+applied will be treated as an initialization routine by the linker.
+It is equivalent to @code{__attribute__((constructor))} in GNU C and
+causes @var{procedure_LOCAL_NAME} to be invoked before the entry point
+of the executable is called (or immediately after the shared library is
+loaded if the procedure is linked in a shared library), in particular
+before the Ada run-time environment is set up.
+
+Because of these specific contexts, the set of operations such a procedure
+can perform is very limited and the type of objects it can manipulate is
+essentially restricted to the elementary types. In particular, it must only
+contain code to which pragma Restrictions (No_Elaboration_Code) applies.
+
+This pragma is used by GNAT to implement auto-initialization of shared Stand
+Alone Libraries, which provides a related capability without the restrictions
+listed above. Where possible, the use of Stand Alone Libraries is preferable
+to the use of this pragma.
+
+@node Pragma Linker_Destructor
+@unnumberedsec Pragma Linker_Destructor
+@findex Linker_Destructor
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Linker_Destructor (procedure_LOCAL_NAME);
+@end smallexample
+
+@noindent
+@var{procedure_LOCAL_NAME} must refer to a parameterless procedure that
+is declared at the library level. A procedure to which this pragma is
+applied will be treated as a finalization routine by the linker.
+It is equivalent to @code{__attribute__((destructor))} in GNU C and
+causes @var{procedure_LOCAL_NAME} to be invoked after the entry point
+of the executable has exited (or immediately before the shared library
+is unloaded if the procedure is linked in a shared library), in particular
+after the Ada run-time environment is shut down.
+
+See @code{pragma Linker_Constructor} for the set of restrictions that apply
+because of these specific contexts.
+
+@node Pragma Linker_Section
+@unnumberedsec Pragma Linker_Section
+@findex Linker_Section
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Linker_Section (
+ [Entity =>] LOCAL_NAME,
+ [Section =>] static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+@var{LOCAL_NAME} must refer to an object, type, or subprogram that is
+declared at the library level. This pragma specifies the name of the
+linker section for the given entity. It is equivalent to
+@code{__attribute__((section))} in GNU C and causes @var{LOCAL_NAME} to
+be placed in the @var{static_string_EXPRESSION} section of the
+executable (assuming the linker doesn't rename the section).
+GNAT also provides an implementation defined aspect of the same name.
+
+In the case of specifying this aspect for a type, the effect is to
+specify the corresponding for all library level objects of the type which
+do not have an explicit linker section set. Note that this only applies to
+whole objects, not to components of composite objects.
+
+In the case of a subprogram, the linker section applies to all previously
+declared matching overloaded subprograms in the current declarative part
+which do not already have a linker section assigned. The linker section
+aspect is useful in this case for specifying different linker sections
+for different elements of such an overloaded set.
+
+Note that an empty string specifies that no linker section is specified.
+This is not quite the same as omitting the pragma or aspect, since it
+can be used to specify that one element of an overloaded set of subprograms
+has the default linker section, or that one object of a type for which a
+linker section is specified should has the default linker section.
+
+The compiler normally places library-level entities in standard sections
+depending on the class: procedures and functions generally go in the
+@code{.text} section, initialized variables in the @code{.data} section
+and uninitialized variables in the @code{.bss} section.
+
+Other, special sections may exist on given target machines to map special
+hardware, for example I/O ports or flash memory. This pragma is a means to
+defer the final layout of the executable to the linker, thus fully working
+at the symbolic level with the compiler.
+
+Some file formats do not support arbitrary sections so not all target
+machines support this pragma. The use of this pragma may cause a program
+execution to be erroneous if it is used to place an entity into an
+inappropriate section (e.g.@: a modified variable into the @code{.text}
+section). See also @code{pragma Persistent_BSS}.
+
+@smallexample @c ada
+-- Example of the use of pragma Linker_Section
+
+package IO_Card is
+ Port_A : Integer;
+ pragma Volatile (Port_A);
+ pragma Linker_Section (Port_A, ".bss.port_a");
+
+ Port_B : Integer;
+ pragma Volatile (Port_B);
+ pragma Linker_Section (Port_B, ".bss.port_b");
+
+ type Port_Type is new Integer with Linker_Section => ".bss";
+ PA : Port_Type with Linker_Section => ".bss.PA";
+ PB : Port_Type; -- ends up in linker section ".bss"
+
+ procedure Q with Linker_Section => "Qsection";
+end IO_Card;
+@end smallexample
+
+@node Pragma Long_Float
+@unnumberedsec Pragma Long_Float
+@cindex OpenVMS
+@findex Long_Float
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Long_Float (FLOAT_FORMAT);
+
+FLOAT_FORMAT ::= D_Float | G_Float
+@end smallexample
+
+@noindent
+This pragma is implemented only in the OpenVMS implementation of GNAT@.
+It allows control over the internal representation chosen for the predefined
+type @code{Long_Float} and for floating point type representations with
+@code{digits} specified in the range 7 through 15.
+For further details on this pragma, see the
+@cite{DEC Ada Language Reference Manual}, section 3.5.7b. Note that to use
+this pragma, the standard runtime libraries must be recompiled.
+
+@node Pragma Loop_Invariant
+@unnumberedsec Pragma Loop_Invariant
+@findex Loop_Invariant
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Loop_Invariant ( boolean_EXPRESSION );
+@end smallexample
+
+@noindent
+The effect of this pragma is similar to that of pragma @code{Assert},
+except that in an @code{Assertion_Policy} pragma, the identifier
+@code{Loop_Invariant} is used to control whether it is ignored or checked
+(or disabled).
+
+@code{Loop_Invariant} can only appear as one of the items in the sequence
+of statements of a loop body, or nested inside block statements that
+appear in the sequence of statements of a loop body.
+The intention is that it be used to
+represent a "loop invariant" assertion, i.e. something that is true each
+time through the loop, and which can be used to show that the loop is
+achieving its purpose.
+
+Multiple @code{Loop_Invariant} and @code{Loop_Variant} pragmas that
+apply to the same loop should be grouped in the same sequence of
+statements.
+
+To aid in writing such invariants, the special attribute @code{Loop_Entry}
+may be used to refer to the value of an expression on entry to the loop. This
+attribute can only be used within the expression of a @code{Loop_Invariant}
+pragma. For full details, see documentation of attribute @code{Loop_Entry}.
+
+@node Pragma Loop_Optimize
+@unnumberedsec Pragma Loop_Optimize
+@findex Loop_Optimize
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Loop_Optimize (OPTIMIZATION_HINT @{, OPTIMIZATION_HINT@});
+
+OPTIMIZATION_HINT ::= No_Unroll | Unroll | No_Vector | Vector
+@end smallexample
+
+@noindent
+This pragma must appear immediately within a loop statement. It allows the
+programmer to specify optimization hints for the enclosing loop. The hints
+are not mutually exclusive and can be freely mixed, but not all combinations
+will yield a sensible outcome.
+
+There are four supported optimization hints for a loop:
+@itemize @bullet
+@item No_Unroll
+
+The loop must not be unrolled. This is a strong hint: the compiler will not
+unroll a loop marked with this hint.
+
+@item Unroll
+
+The loop should be unrolled. This is a weak hint: the compiler will try to
+apply unrolling to this loop preferably to other optimizations, notably
+vectorization, but there is no guarantee that the loop will be unrolled.
+
+@item No_Vector
+
+The loop must not be vectorized. This is a strong hint: the compiler will not
+vectorize a loop marked with this hint.
+
+@item Vector
+
+The loop should be vectorized. This is a weak hint: the compiler will try to
+apply vectorization to this loop preferably to other optimizations, notably
+unrolling, but there is no guarantee that the loop will be vectorized.
+
+@end itemize
+
+These hints do not void the need to pass the appropriate switches to the
+compiler in order to enable the relevant optimizations, that is to say
+@option{-funroll-loops} for unrolling and @option{-ftree-vectorize} for
+vectorization.
+
+@node Pragma Loop_Variant
+@unnumberedsec Pragma Loop_Variant
+@findex Loop_Variant
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Loop_Variant ( LOOP_VARIANT_ITEM @{, LOOP_VARIANT_ITEM @} );
+LOOP_VARIANT_ITEM ::= CHANGE_DIRECTION => discrete_EXPRESSION
+CHANGE_DIRECTION ::= Increases | Decreases
+@end smallexample
+
+@noindent
+@code{Loop_Variant} can only appear as one of the items in the sequence
+of statements of a loop body, or nested inside block statements that
+appear in the sequence of statements of a loop body.
+It allows the specification of quantities which must always
+decrease or increase in successive iterations of the loop. In its simplest
+form, just one expression is specified, whose value must increase or decrease
+on each iteration of the loop.
+
+In a more complex form, multiple arguments can be given which are intepreted
+in a nesting lexicographic manner. For example:
+
+@smallexample @c ada
+pragma Loop_Variant (Increases => X, Decreases => Y);
+@end smallexample
+
+@noindent
+specifies that each time through the loop either X increases, or X stays
+the same and Y decreases. A @code{Loop_Variant} pragma ensures that the
+loop is making progress. It can be useful in helping to show informally
+or prove formally that the loop always terminates.
+
+@code{Loop_Variant} is an assertion whose effect can be controlled using
+an @code{Assertion_Policy} with a check name of @code{Loop_Variant}. The
+policy can be @code{Check} to enable the loop variant check, @code{Ignore}
+to ignore the check (in which case the pragma has no effect on the program),
+or @code{Disable} in which case the pragma is not even checked for correct
+syntax.
+
+Multiple @code{Loop_Invariant} and @code{Loop_Variant} pragmas that
+apply to the same loop should be grouped in the same sequence of
+statements.
+
+The @code{Loop_Entry} attribute may be used within the expressions of the
+@code{Loop_Variant} pragma to refer to values on entry to the loop.
+
+@node Pragma Machine_Attribute
+@unnumberedsec Pragma Machine_Attribute
+@findex Machine_Attribute
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Machine_Attribute (
+ [Entity =>] LOCAL_NAME,
+ [Attribute_Name =>] static_string_EXPRESSION
+ [, [Info =>] static_EXPRESSION] );
+@end smallexample
+
+@noindent
+Machine-dependent attributes can be specified for types and/or
+declarations. This pragma is semantically equivalent to
+@code{__attribute__((@var{attribute_name}))} (if @var{info} is not
+specified) or @code{__attribute__((@var{attribute_name}(@var{info})))}
+in GNU C, where @code{@var{attribute_name}} is recognized by the
+compiler middle-end or the @code{TARGET_ATTRIBUTE_TABLE} machine
+specific macro. A string literal for the optional parameter @var{info}
+is transformed into an identifier, which may make this pragma unusable
+for some attributes. @xref{Target Attributes,, Defining target-specific
+uses of @code{__attribute__}, gccint, GNU Compiler Collection (GCC)
+Internals}, further information.
+
+@node Pragma Main
+@unnumberedsec Pragma Main
+@cindex OpenVMS
+@findex Main
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Main
+ (MAIN_OPTION [, MAIN_OPTION]);
+
+MAIN_OPTION ::=
+ [Stack_Size =>] static_integer_EXPRESSION
+| [Task_Stack_Size_Default =>] static_integer_EXPRESSION
+| [Time_Slicing_Enabled =>] static_boolean_EXPRESSION
+@end smallexample
+
+@noindent
+This pragma is provided for compatibility with OpenVMS VAX Systems. It has
+no effect in GNAT, other than being syntax checked.
+
+@node Pragma Main_Storage
+@unnumberedsec Pragma Main_Storage
+@cindex OpenVMS
+@findex Main_Storage
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Main_Storage
+ (MAIN_STORAGE_OPTION [, MAIN_STORAGE_OPTION]);
+
+MAIN_STORAGE_OPTION ::=
+ [WORKING_STORAGE =>] static_SIMPLE_EXPRESSION
+| [TOP_GUARD =>] static_SIMPLE_EXPRESSION
+@end smallexample
+
+@noindent
+This pragma is provided for compatibility with OpenVMS VAX Systems. It has
+no effect in GNAT, other than being syntax checked. Note that the pragma
+also has no effect in DEC Ada 83 for OpenVMS Alpha Systems.
+
+@node Pragma No_Body
+@unnumberedsec Pragma No_Body
+@findex No_Body
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma No_Body;
+@end smallexample
+
+@noindent
+There are a number of cases in which a package spec does not require a body,
+and in fact a body is not permitted. GNAT will not permit the spec to be
+compiled if there is a body around. The pragma No_Body allows you to provide
+a body file, even in a case where no body is allowed. The body file must
+contain only comments and a single No_Body pragma. This is recognized by
+the compiler as indicating that no body is logically present.
+
+This is particularly useful during maintenance when a package is modified in
+such a way that a body needed before is no longer needed. The provision of a
+dummy body with a No_Body pragma ensures that there is no interference from
+earlier versions of the package body.
+
+@node Pragma No_Inline
+@unnumberedsec Pragma No_Inline
+@findex No_Inline
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma No_Inline (NAME @{, NAME@});
+@end smallexample
+
+@noindent
+This pragma suppresses inlining for the callable entity or the instances of
+the generic subprogram designated by @var{NAME}, including inlining that
+results from the use of pragma @code{Inline}. This pragma is always active,
+in particular it is not subject to the use of option @option{-gnatn} or
+@option{-gnatN}. It is illegal to specify both pragma @code{No_Inline} and
+pragma @code{Inline_Always} for the same @var{NAME}.
+
+@node Pragma No_Return
+@unnumberedsec Pragma No_Return
+@findex No_Return
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma No_Return (procedure_LOCAL_NAME @{, procedure_LOCAL_NAME@});
+@end smallexample
+
+@noindent
+Each @var{procedure_LOCAL_NAME} argument must refer to one or more procedure
+declarations in the current declarative part. A procedure to which this
+pragma is applied may not contain any explicit @code{return} statements.
+In addition, if the procedure contains any implicit returns from falling
+off the end of a statement sequence, then execution of that implicit
+return will cause Program_Error to be raised.
+
+One use of this pragma is to identify procedures whose only purpose is to raise
+an exception. Another use of this pragma is to suppress incorrect warnings
+about missing returns in functions, where the last statement of a function
+statement sequence is a call to such a procedure.
+
+Note that in Ada 2005 mode, this pragma is part of the language. It is
+available in all earlier versions of Ada as an implementation-defined
+pragma.
+
+@node Pragma No_Run_Time
+@unnumberedsec Pragma No_Run_Time
+@findex No_Run_Time
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma No_Run_Time;
+@end smallexample
+
+@noindent
+This is an obsolete configuration pragma that historically was used to
+setup what is now called the "zero footprint" library. It causes any
+library units outside this basic library to be ignored. The use of
+this pragma has been superseded by the general configurable run-time
+capability of @code{GNAT} where the compiler takes into account whatever
+units happen to be accessible in the library.
+
+@node Pragma No_Strict_Aliasing
+@unnumberedsec Pragma No_Strict_Aliasing
+@findex No_Strict_Aliasing
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma No_Strict_Aliasing [([Entity =>] type_LOCAL_NAME)];
+@end smallexample
+
+@noindent
+@var{type_LOCAL_NAME} must refer to an access type
+declaration in the current declarative part. The effect is to inhibit
+strict aliasing optimization for the given type. The form with no
+arguments is a configuration pragma which applies to all access types
+declared in units to which the pragma applies. For a detailed
+description of the strict aliasing optimization, and the situations
+in which it must be suppressed, see @ref{Optimization and Strict
+Aliasing,,, gnat_ugn, @value{EDITION} User's Guide}.
+
+This pragma currently has no effects on access to unconstrained array types.
+
+@node Pragma Normalize_Scalars
+@unnumberedsec Pragma Normalize_Scalars
+@findex Normalize_Scalars
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Normalize_Scalars;
+@end smallexample
+
+@noindent
+This is a language defined pragma which is fully implemented in GNAT@. The
+effect is to cause all scalar objects that are not otherwise initialized
+to be initialized. The initial values are implementation dependent and
+are as follows:
+
+@table @code
+@item Standard.Character
+@noindent
+Objects whose root type is Standard.Character are initialized to
+Character'Last unless the subtype range excludes NUL (in which case
+NUL is used). This choice will always generate an invalid value if
+one exists.
+
+@item Standard.Wide_Character
+@noindent
+Objects whose root type is Standard.Wide_Character are initialized to
+Wide_Character'Last unless the subtype range excludes NUL (in which case
+NUL is used). This choice will always generate an invalid value if
+one exists.
+
+@item Standard.Wide_Wide_Character
+@noindent
+Objects whose root type is Standard.Wide_Wide_Character are initialized to
+the invalid value 16#FFFF_FFFF# unless the subtype range excludes NUL (in
+which case NUL is used). This choice will always generate an invalid value if
+one exists.
+
+@item Integer types
+@noindent
+Objects of an integer type are treated differently depending on whether
+negative values are present in the subtype. If no negative values are
+present, then all one bits is used as the initial value except in the
+special case where zero is excluded from the subtype, in which case
+all zero bits are used. This choice will always generate an invalid
+value if one exists.
+
+For subtypes with negative values present, the largest negative number
+is used, except in the unusual case where this largest negative number
+is in the subtype, and the largest positive number is not, in which case
+the largest positive value is used. This choice will always generate
+an invalid value if one exists.
+
+@item Floating-Point Types
+Objects of all floating-point types are initialized to all 1-bits. For
+standard IEEE format, this corresponds to a NaN (not a number) which is
+indeed an invalid value.
+
+@item Fixed-Point Types
+Objects of all fixed-point types are treated as described above for integers,
+with the rules applying to the underlying integer value used to represent
+the fixed-point value.
+
+@item Modular types
+Objects of a modular type are initialized to all one bits, except in
+the special case where zero is excluded from the subtype, in which
+case all zero bits are used. This choice will always generate an
+invalid value if one exists.
+
+@item Enumeration types
+Objects of an enumeration type are initialized to all one-bits, i.e.@: to
+the value @code{2 ** typ'Size - 1} unless the subtype excludes the literal
+whose Pos value is zero, in which case a code of zero is used. This choice
+will always generate an invalid value if one exists.
+
+@end table
+
+@node Pragma Obsolescent
+@unnumberedsec Pragma Obsolescent
+@findex Obsolescent
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Obsolescent;
+
+pragma Obsolescent (
+ [Message =>] static_string_EXPRESSION
+[,[Version =>] Ada_05]]);
+
+pragma Obsolescent (
+ [Entity =>] NAME
+[,[Message =>] static_string_EXPRESSION
+[,[Version =>] Ada_05]] );
+@end smallexample
+
+@noindent
+This pragma can occur immediately following a declaration of an entity,
+including the case of a record component. If no Entity argument is present,
+then this declaration is the one to which the pragma applies. If an Entity
+parameter is present, it must either match the name of the entity in this
+declaration, or alternatively, the pragma can immediately follow an enumeration
+type declaration, where the Entity argument names one of the enumeration
+literals.
+
+This pragma is used to indicate that the named entity
+is considered obsolescent and should not be used. Typically this is
+used when an API must be modified by eventually removing or modifying
+existing subprograms or other entities. The pragma can be used at an
+intermediate stage when the entity is still present, but will be
+removed later.
+
+The effect of this pragma is to output a warning message on a reference to
+an entity thus marked that the subprogram is obsolescent if the appropriate
+warning option in the compiler is activated. If the Message parameter is
+present, then a second warning message is given containing this text. In
+addition, a reference to the entity is considered to be a violation of pragma
+Restrictions (No_Obsolescent_Features).
+
+This pragma can also be used as a program unit pragma for a package,
+in which case the entity name is the name of the package, and the
+pragma indicates that the entire package is considered
+obsolescent. In this case a client @code{with}'ing such a package
+violates the restriction, and the @code{with} statement is
+flagged with warnings if the warning option is set.
+
+If the Version parameter is present (which must be exactly
+the identifier Ada_05, no other argument is allowed), then the
+indication of obsolescence applies only when compiling in Ada 2005
+mode. This is primarily intended for dealing with the situations
+in the predefined library where subprograms or packages
+have become defined as obsolescent in Ada 2005
+(e.g.@: in Ada.Characters.Handling), but may be used anywhere.
+
+The following examples show typical uses of this pragma:
+
+@smallexample @c ada
+package p is
+ pragma Obsolescent (p, Message => "use pp instead of p");
+end p;
+
+package q is
+ procedure q2;
+ pragma Obsolescent ("use q2new instead");
+
+ type R is new integer;
+ pragma Obsolescent
+ (Entity => R,
+ Message => "use RR in Ada 2005",
+ Version => Ada_05);
+
+ type M is record
+ F1 : Integer;
+ F2 : Integer;
+ pragma Obsolescent;
+ F3 : Integer;
+ end record;
+
+ type E is (a, bc, 'd', quack);
+ pragma Obsolescent (Entity => bc)
+ pragma Obsolescent (Entity => 'd')
+
+ function "+"
+ (a, b : character) return character;
+ pragma Obsolescent (Entity => "+");
+end;
+@end smallexample
+
+@noindent
+Note that, as for all pragmas, if you use a pragma argument identifier,
+then all subsequent parameters must also use a pragma argument identifier.
+So if you specify "Entity =>" for the Entity argument, and a Message
+argument is present, it must be preceded by "Message =>".
+
+@node Pragma Optimize_Alignment
+@unnumberedsec Pragma Optimize_Alignment
+@findex Optimize_Alignment
+@cindex Alignment, default settings
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Optimize_Alignment (TIME | SPACE | OFF);
+@end smallexample
+
+@noindent
+This is a configuration pragma which affects the choice of default alignments
+for types and objects where no alignment is explicitly specified. There is a
+time/space trade-off in the selection of these values. Large alignments result
+in more efficient code, at the expense of larger data space, since sizes have
+to be increased to match these alignments. Smaller alignments save space, but
+the access code is slower. The normal choice of default alignments for types
+and individual alignment promotions for objects (which is what you get if you
+do not use this pragma, or if you use an argument of OFF), tries to balance
+these two requirements.
+
+Specifying SPACE causes smaller default alignments to be chosen in two cases.
+First any packed record is given an alignment of 1. Second, if a size is given
+for the type, then the alignment is chosen to avoid increasing this size. For
+example, consider:
+
+@smallexample @c ada
+ type R is record
+ X : Integer;
+ Y : Character;
+ end record;
+
+ for R'Size use 5*8;
+@end smallexample
+
+@noindent
+In the default mode, this type gets an alignment of 4, so that access to the
+Integer field X are efficient. But this means that objects of the type end up
+with a size of 8 bytes. This is a valid choice, since sizes of objects are
+allowed to be bigger than the size of the type, but it can waste space if for
+example fields of type R appear in an enclosing record. If the above type is
+compiled in @code{Optimize_Alignment (Space)} mode, the alignment is set to 1.
+
+However, there is one case in which SPACE is ignored. If a variable length
+record (that is a discriminated record with a component which is an array
+whose length depends on a discriminant), has a pragma Pack, then it is not
+in general possible to set the alignment of such a record to one, so the
+pragma is ignored in this case (with a warning).
+
+Specifying SPACE also disables alignment promotions for standalone objects,
+which occur when the compiler increases the alignment of a specific object
+without changing the alignment of its type.
+
+Specifying TIME causes larger default alignments to be chosen in the case of
+small types with sizes that are not a power of 2. For example, consider:
+
+@smallexample @c ada
+ type R is record
+ A : Character;
+ B : Character;
+ C : Boolean;
+ end record;
+
+ pragma Pack (R);
+ for R'Size use 17;
+@end smallexample
+
+@noindent
+The default alignment for this record is normally 1, but if this type is
+compiled in @code{Optimize_Alignment (Time)} mode, then the alignment is set
+to 4, which wastes space for objects of the type, since they are now 4 bytes
+long, but results in more efficient access when the whole record is referenced.
+
+As noted above, this is a configuration pragma, and there is a requirement
+that all units in a partition be compiled with a consistent setting of the
+optimization setting. This would normally be achieved by use of a configuration
+pragma file containing the appropriate setting. The exception to this rule is
+that units with an explicit configuration pragma in the same file as the source
+unit are excluded from the consistency check, as are all predefined units. The
+latter are compiled by default in pragma Optimize_Alignment (Off) mode if no
+pragma appears at the start of the file.
+
+@node Pragma Ordered
+@unnumberedsec Pragma Ordered
+@findex Ordered
+@findex pragma @code{Ordered}
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Ordered (enumeration_first_subtype_LOCAL_NAME);
+@end smallexample
+
+@noindent
+Most enumeration types are from a conceptual point of view unordered.
+For example, consider:
+
+@smallexample @c ada
+type Color is (Red, Blue, Green, Yellow);
+@end smallexample
+
+@noindent
+By Ada semantics @code{Blue > Red} and @code{Green > Blue},
+but really these relations make no sense; the enumeration type merely
+specifies a set of possible colors, and the order is unimportant.
+
+For unordered enumeration types, it is generally a good idea if
+clients avoid comparisons (other than equality or inequality) and
+explicit ranges. (A @emph{client} is a unit where the type is referenced,
+other than the unit where the type is declared, its body, and its subunits.)
+For example, if code buried in some client says:
+
+@smallexample @c ada
+if Current_Color < Yellow then ...
+if Current_Color in Blue .. Green then ...
+@end smallexample
+
+@noindent
+then the client code is relying on the order, which is undesirable.
+It makes the code hard to read and creates maintenance difficulties if
+entries have to be added to the enumeration type. Instead,
+the code in the client should list the possibilities, or an
+appropriate subtype should be declared in the unit that declares
+the original enumeration type. E.g., the following subtype could
+be declared along with the type @code{Color}:
+
+@smallexample @c ada
+subtype RBG is Color range Red .. Green;
+@end smallexample
+
+@noindent
+and then the client could write:
+
+@smallexample @c ada
+if Current_Color in RBG then ...
+if Current_Color = Blue or Current_Color = Green then ...
+@end smallexample
+
+@noindent
+However, some enumeration types are legitimately ordered from a conceptual
+point of view. For example, if you declare:
+
+@smallexample @c ada
+type Day is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
+@end smallexample
+
+@noindent
+then the ordering imposed by the language is reasonable, and
+clients can depend on it, writing for example:
+
+@smallexample @c ada
+if D in Mon .. Fri then ...
+if D < Wed then ...
+@end smallexample
+
+@noindent
+The pragma @option{Ordered} is provided to mark enumeration types that
+are conceptually ordered, alerting the reader that clients may depend
+on the ordering. GNAT provides a pragma to mark enumerations as ordered
+rather than one to mark them as unordered, since in our experience,
+the great majority of enumeration types are conceptually unordered.
+
+The types @code{Boolean}, @code{Character}, @code{Wide_Character},
+and @code{Wide_Wide_Character}
+are considered to be ordered types, so each is declared with a
+pragma @code{Ordered} in package @code{Standard}.
+
+Normally pragma @code{Ordered} serves only as documentation and a guide for
+coding standards, but GNAT provides a warning switch @option{-gnatw.u} that
+requests warnings for inappropriate uses (comparisons and explicit
+subranges) for unordered types. If this switch is used, then any
+enumeration type not marked with pragma @code{Ordered} will be considered
+as unordered, and will generate warnings for inappropriate uses.
+
+For additional information please refer to the description of the
+@option{-gnatw.u} switch in the @value{EDITION} User's Guide.
+
+@node Pragma Overflow_Mode
+@unnumberedsec Pragma Overflow_Mode
+@findex Overflow checks
+@findex Overflow mode
+@findex pragma @code{Overflow_Mode}
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Overflow_Mode
+ ( [General =>] MODE
+ [,[Assertions =>] MODE]);
+
+MODE ::= STRICT | MINIMIZED | ELIMINATED
+@end smallexample
+
+@noindent
+This pragma sets the current overflow mode to the given setting. For details
+of the meaning of these modes, please refer to the
+``Overflow Check Handling in GNAT'' appendix in the
+@value{EDITION} User's Guide. If only the @code{General} parameter is present,
+the given mode applies to all expressions. If both parameters are present,
+the @code{General} mode applies to expressions outside assertions, and
+the @code{Eliminated} mode applies to expressions within assertions.
+
+The case of the @code{MODE} parameter is ignored,
+so @code{MINIMIZED}, @code{Minimized} and
+@code{minimized} all have the same effect.
+
+The @code{Overflow_Mode} pragma has the same scoping and placement
+rules as pragma @code{Suppress}, so it can occur either as a
+configuration pragma, specifying a default for the whole
+program, or in a declarative scope, where it applies to the
+remaining declarations and statements in that scope.
+
+The pragma @code{Suppress (Overflow_Check)} suppresses
+overflow checking, but does not affect the overflow mode.
+
+The pragma @code{Unsuppress (Overflow_Check)} unsuppresses (enables)
+overflow checking, but does not affect the overflow mode.
+
+@node Pragma Overriding_Renamings
+@unnumberedsec Pragma Overriding_Renamings
+@findex Overriding_Renamings
+@cindex Rational profile
+@cindex Rational compatibility
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Overriding_Renamings;
+@end smallexample
+
+@noindent
+This is a GNAT configuration pragma to simplify porting
+legacy code accepted by the Rational
+Ada compiler. In the presence of this pragma, a renaming declaration that
+renames an inherited operation declared in the same scope is legal if selected
+notation is used as in:
+
+@smallexample @c ada
+pragma Overriding_Renamings;
+...
+package R is
+ function F (..);
+ ...
+ function F (..) renames R.F;
+end R;
+@end smallexample
+
+even though
+RM 8.3 (15) stipulates that an overridden operation is not visible within the
+declaration of the overriding operation.
+
+@node Pragma Partition_Elaboration_Policy
+@unnumberedsec Pragma Partition_Elaboration_Policy
+@findex Partition_Elaboration_Policy
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Partition_Elaboration_Policy (POLICY_IDENTIFIER);
+
+POLICY_IDENTIFIER ::= Concurrent | Sequential
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2005, but is available in all earlier
+versions of Ada as an implementation-defined pragma.
+See Ada 2012 Reference Manual for details.
+
+@node Pragma Passive
+@unnumberedsec Pragma Passive
+@findex Passive
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Passive [(Semaphore | No)];
+@end smallexample
+
+@noindent
+Syntax checked, but otherwise ignored by GNAT@. This is recognized for
+compatibility with DEC Ada 83 implementations, where it is used within a
+task definition to request that a task be made passive. If the argument
+@code{Semaphore} is present, or the argument is omitted, then DEC Ada 83
+treats the pragma as an assertion that the containing task is passive
+and that optimization of context switch with this task is permitted and
+desired. If the argument @code{No} is present, the task must not be
+optimized. GNAT does not attempt to optimize any tasks in this manner
+(since protected objects are available in place of passive tasks).
+
+For more information on the subject of passive tasks, see the section
+``Passive Task Optimization'' in the GNAT Users Guide.
+
+@node Pragma Persistent_BSS
+@unnumberedsec Pragma Persistent_BSS
+@findex Persistent_BSS
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Persistent_BSS [(LOCAL_NAME)]
+@end smallexample
+
+@noindent
+This pragma allows selected objects to be placed in the @code{.persistent_bss}
+section. On some targets the linker and loader provide for special
+treatment of this section, allowing a program to be reloaded without
+affecting the contents of this data (hence the name persistent).
+
+There are two forms of usage. If an argument is given, it must be the
+local name of a library level object, with no explicit initialization
+and whose type is potentially persistent. If no argument is given, then
+the pragma is a configuration pragma, and applies to all library level
+objects with no explicit initialization of potentially persistent types.
+
+A potentially persistent type is a scalar type, or a non-tagged,
+non-discriminated record, all of whose components have no explicit
+initialization and are themselves of a potentially persistent type,
+or an array, all of whose constraints are static, and whose component
+type is potentially persistent.
+
+If this pragma is used on a target where this feature is not supported,
+then the pragma will be ignored. See also @code{pragma Linker_Section}.
+
+@node Pragma Polling
+@unnumberedsec Pragma Polling
+@findex Polling
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Polling (ON | OFF);
+@end smallexample
+
+@noindent
+This pragma controls the generation of polling code. This is normally off.
+If @code{pragma Polling (ON)} is used then periodic calls are generated to
+the routine @code{Ada.Exceptions.Poll}. This routine is a separate unit in the
+runtime library, and can be found in file @file{a-excpol.adb}.
+
+Pragma @code{Polling} can appear as a configuration pragma (for example it
+can be placed in the @file{gnat.adc} file) to enable polling globally, or it
+can be used in the statement or declaration sequence to control polling
+more locally.
+
+A call to the polling routine is generated at the start of every loop and
+at the start of every subprogram call. This guarantees that the @code{Poll}
+routine is called frequently, and places an upper bound (determined by
+the complexity of the code) on the period between two @code{Poll} calls.
+
+The primary purpose of the polling interface is to enable asynchronous
+aborts on targets that cannot otherwise support it (for example Windows
+NT), but it may be used for any other purpose requiring periodic polling.
+The standard version is null, and can be replaced by a user program. This
+will require re-compilation of the @code{Ada.Exceptions} package that can
+be found in files @file{a-except.ads} and @file{a-except.adb}.
+
+A standard alternative unit (in file @file{4wexcpol.adb} in the standard GNAT
+distribution) is used to enable the asynchronous abort capability on
+targets that do not normally support the capability. The version of
+@code{Poll} in this file makes a call to the appropriate runtime routine
+to test for an abort condition.
+
+Note that polling can also be enabled by use of the @option{-gnatP} switch.
+@xref{Switches for gcc,,, gnat_ugn, @value{EDITION} User's Guide}, for
+details.
+
+@node Pragma Post
+@unnumberedsec Pragma Post
+@cindex Post
+@cindex Checks, postconditions
+@findex Postconditions
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Post (Boolean_Expression);
+@end smallexample
+
+@noindent
+The @code{Post} pragma is intended to be an exact replacement for
+the language-defined
+@code{Post} aspect, and shares its restrictions and semantics.
+It must appear either immediately following the corresponding
+subprogram declaration (only other pragmas may intervene), or
+if there is no separate subprogram declaration, then it can
+appear at the start of the declarations in a subprogram body
+(preceded only by other pragmas).
+
+@node Pragma Postcondition
+@unnumberedsec Pragma Postcondition
+@cindex Postcondition
+@cindex Checks, postconditions
+@findex Postconditions
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Postcondition (
+ [Check =>] Boolean_Expression
+ [,[Message =>] String_Expression]);
+@end smallexample
+
+@noindent
+The @code{Postcondition} pragma allows specification of automatic
+postcondition checks for subprograms. These checks are similar to
+assertions, but are automatically inserted just prior to the return
+statements of the subprogram with which they are associated (including
+implicit returns at the end of procedure bodies and associated
+exception handlers).
+
+In addition, the boolean expression which is the condition which
+must be true may contain references to function'Result in the case
+of a function to refer to the returned value.
+
+@code{Postcondition} pragmas may appear either immediately following the
+(separate) declaration of a subprogram, or at the start of the
+declarations of a subprogram body. Only other pragmas may intervene
+(that is appear between the subprogram declaration and its
+postconditions, or appear before the postcondition in the
+declaration sequence in a subprogram body). In the case of a
+postcondition appearing after a subprogram declaration, the
+formal arguments of the subprogram are visible, and can be
+referenced in the postcondition expressions.
+
+The postconditions are collected and automatically tested just
+before any return (implicit or explicit) in the subprogram body.
+A postcondition is only recognized if postconditions are active
+at the time the pragma is encountered. The compiler switch @option{gnata}
+turns on all postconditions by default, and pragma @code{Check_Policy}
+with an identifier of @code{Postcondition} can also be used to
+control whether postconditions are active.
+
+The general approach is that postconditions are placed in the spec
+if they represent functional aspects which make sense to the client.
+For example we might have:
+
+@smallexample @c ada
+ function Direction return Integer;
+ pragma Postcondition
+ (Direction'Result = +1
+ or else
+ Direction'Result = -1);
+@end smallexample
+
+@noindent
+which serves to document that the result must be +1 or -1, and
+will test that this is the case at run time if postcondition
+checking is active.
+
+Postconditions within the subprogram body can be used to
+check that some internal aspect of the implementation,
+not visible to the client, is operating as expected.
+For instance if a square root routine keeps an internal
+counter of the number of times it is called, then we
+might have the following postcondition:
+
+@smallexample @c ada
+ Sqrt_Calls : Natural := 0;
+
+ function Sqrt (Arg : Float) return Float is
+ pragma Postcondition
+ (Sqrt_Calls = Sqrt_Calls'Old + 1);
+ ...
+ end Sqrt
+@end smallexample
+
+@noindent
+As this example, shows, the use of the @code{Old} attribute
+is often useful in postconditions to refer to the state on
+entry to the subprogram.
+
+Note that postconditions are only checked on normal returns
+from the subprogram. If an abnormal return results from
+raising an exception, then the postconditions are not checked.
+
+If a postcondition fails, then the exception
+@code{System.Assertions.Assert_Failure} is raised. If
+a message argument was supplied, then the given string
+will be used as the exception message. If no message
+argument was supplied, then the default message has
+the form "Postcondition failed at file:line". The
+exception is raised in the context of the subprogram
+body, so it is possible to catch postcondition failures
+within the subprogram body itself.
+
+Within a package spec, normal visibility rules
+in Ada would prevent forward references within a
+postcondition pragma to functions defined later in
+the same package. This would introduce undesirable
+ordering constraints. To avoid this problem, all
+postcondition pragmas are analyzed at the end of
+the package spec, allowing forward references.
+
+The following example shows that this even allows
+mutually recursive postconditions as in:
+
+@smallexample @c ada
+package Parity_Functions is
+ function Odd (X : Natural) return Boolean;
+ pragma Postcondition
+ (Odd'Result =
+ (x = 1
+ or else
+ (x /= 0 and then Even (X - 1))));
+
+ function Even (X : Natural) return Boolean;
+ pragma Postcondition
+ (Even'Result =
+ (x = 0
+ or else
+ (x /= 1 and then Odd (X - 1))));
+
+end Parity_Functions;
+@end smallexample
+
+@noindent
+There are no restrictions on the complexity or form of
+conditions used within @code{Postcondition} pragmas.
+The following example shows that it is even possible
+to verify performance behavior.
+
+@smallexample @c ada
+package Sort is
+
+ Performance : constant Float;
+ -- Performance constant set by implementation
+ -- to match target architecture behavior.
+
+ procedure Treesort (Arg : String);
+ -- Sorts characters of argument using N*logN sort
+ pragma Postcondition
+ (Float (Clock - Clock'Old) <=
+ Float (Arg'Length) *
+ log (Float (Arg'Length)) *
+ Performance);
+end Sort;
+@end smallexample
+
+@noindent
+Note: postcondition pragmas associated with subprograms that are
+marked as Inline_Always, or those marked as Inline with front-end
+inlining (-gnatN option set) are accepted and legality-checked
+by the compiler, but are ignored at run-time even if postcondition
+checking is enabled.
+
+Note that pragma @code{Postcondition} differs from the language-defined
+@code{Post} aspect (and corresponding @code{Post} pragma) in allowing
+multiple occurrences, allowing occurences in the body even if there
+is a separate spec, and allowing a second string parameter, and the
+use of the pragma identifier @code{Check}. Historically, pragma
+@code{Postcondition} was implemented prior to the development of
+Ada 2012, and has been retained in its original form for
+compatibility purposes.
+
+@node Pragma Post_Class
+@unnumberedsec Pragma Post_Class
+@cindex Post
+@cindex Checks, postconditions
+@findex Postconditions
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Post_Class (Boolean_Expression);
+@end smallexample
+
+@noindent
+The @code{Post_Class} pragma is intended to be an exact replacement for
+the language-defined
+@code{Post'Class} aspect, and shares its restrictions and semantics.
+It must appear either immediately following the corresponding
+subprogram declaration (only other pragmas may intervene), or
+if there is no separate subprogram declaration, then it can
+appear at the start of the declarations in a subprogram body
+(preceded only by other pragmas).
+
+Note: This pragma is called @code{Post_Class} rather than
+@code{Post'Class} because the latter would not be strictly
+conforming to the allowed syntax for pragmas. The motivation
+for provinding pragmas equivalent to the aspects is to allow a program
+to be written using the pragmas, and then compiled if necessary
+using an Ada compiler that does not recognize the pragmas or
+aspects, but is prepared to ignore the pragmas. The assertion
+policy that controls this pragma is @code{Post'Class}, not
+@code{Post_Class}.
+
+@node Pragma Pre
+@unnumberedsec Pragma Pre
+@cindex Pre
+@cindex Checks, preconditions
+@findex Preconditions
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Pre (Boolean_Expression);
+@end smallexample
+
+@noindent
+The @code{Pre} pragma is intended to be an exact replacement for
+the language-defined
+@code{Pre} aspect, and shares its restrictions and semantics.
+It must appear either immediately following the corresponding
+subprogram declaration (only other pragmas may intervene), or
+if there is no separate subprogram declaration, then it can
+appear at the start of the declarations in a subprogram body
+(preceded only by other pragmas).
+
+@node Pragma Precondition
+@unnumberedsec Pragma Precondition
+@cindex Preconditions
+@cindex Checks, preconditions
+@findex Preconditions
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Precondition (
+ [Check =>] Boolean_Expression
+ [,[Message =>] String_Expression]);
+@end smallexample
+
+@noindent
+The @code{Precondition} pragma is similar to @code{Postcondition}
+except that the corresponding checks take place immediately upon
+entry to the subprogram, and if a precondition fails, the exception
+is raised in the context of the caller, and the attribute 'Result
+cannot be used within the precondition expression.
+
+Otherwise, the placement and visibility rules are identical to those
+described for postconditions. The following is an example of use
+within a package spec:
+
+@smallexample @c ada
+package Math_Functions is
+ ...
+ function Sqrt (Arg : Float) return Float;
+ pragma Precondition (Arg >= 0.0)
+ ...
+end Math_Functions;
+@end smallexample
+
+@noindent
+@code{Precondition} pragmas may appear either immediately following the
+(separate) declaration of a subprogram, or at the start of the
+declarations of a subprogram body. Only other pragmas may intervene
+(that is appear between the subprogram declaration and its
+postconditions, or appear before the postcondition in the
+declaration sequence in a subprogram body).
+
+Note: precondition pragmas associated with subprograms that are
+marked as Inline_Always, or those marked as Inline with front-end
+inlining (-gnatN option set) are accepted and legality-checked
+by the compiler, but are ignored at run-time even if precondition
+checking is enabled.
+
+Note that pragma @code{Precondition} differs from the language-defined
+@code{Pre} aspect (and corresponding @code{Pre} pragma) in allowing
+multiple occurrences, allowing occurences in the body even if there
+is a separate spec, and allowing a second string parameter, and the
+use of the pragma identifier @code{Check}. Historically, pragma
+@code{Precondition} was implemented prior to the development of
+Ada 2012, and has been retained in its original form for
+compatibility purposes.
+
+@node Pragma Predicate
+@unnumberedsec Pragma Predicate
+@findex Predicate
+@findex Predicate pragma
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Predicate
+ ([Entity =>] type_LOCAL_NAME,
+ [Check =>] EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma (available in all versions of Ada in GNAT) encompasses both
+the @code{Static_Predicate} and @code{Dynamic_Predicate} aspects in
+Ada 2012. A predicate is regarded as static if it has an allowed form
+for @code{Static_Predicate} and is otherwise treated as a
+@code{Dynamic_Predicate}. Otherwise, predicates specified by this
+pragma behave exactly as described in the Ada 2012 reference manual.
+For example, if we have
+
+@smallexample @c ada
+type R is range 1 .. 10;
+subtype S is R;
+pragma Predicate (Entity => S, Check => S not in 4 .. 6);
+subtype Q is R
+pragma Predicate (Entity => Q, Check => F(Q) or G(Q));
+@end smallexample
+
+@noindent
+the effect is identical to the following Ada 2012 code:
+
+@smallexample @c ada
+type R is range 1 .. 10;
+subtype S is R with
+ Static_Predicate => S not in 4 .. 6;
+subtype Q is R with
+ Dynamic_Predicate => F(Q) or G(Q);
+@end smallexample
+
+Note that there is are no pragmas @code{Dynamic_Predicate}
+or @code{Static_Predicate}. That is
+because these pragmas would affect legality and semantics of
+the program and thus do not have a neutral effect if ignored.
+The motivation behind providing pragmas equivalent to
+corresponding aspects is to allow a program to be written
+using the pragmas, and then compiled with a compiler that
+will ignore the pragmas. That doesn't work in the case of
+static and dynamic predicates, since if the corresponding
+pragmas are ignored, then the behavior of the program is
+fundamentally changed (for example a membership test
+@code{A in B} would not take into account a predicate
+defined for subtype B). When following this approach, the
+use of predicates should be avoided.
+
+@node Pragma Preelaborable_Initialization
+@unnumberedsec Pragma Preelaborable_Initialization
+@findex Preelaborable_Initialization
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Preelaborable_Initialization (DIRECT_NAME);
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2005, but is available in all earlier
+versions of Ada as an implementation-defined pragma.
+See Ada 2012 Reference Manual for details.
+
+@node Pragma Preelaborate_05
+@unnumberedsec Pragma Preelaborate_05
+@findex Preelaborate_05
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Preelaborate_05 [(library_unit_NAME)];
+@end smallexample
+
+@noindent
+This pragma is only available in GNAT mode (@option{-gnatg} switch set)
+and is intended for use in the standard run-time library only. It has
+no effect in Ada 83 or Ada 95 mode, but is
+equivalent to @code{pragma Prelaborate} when operating in later
+Ada versions. This is used to handle some cases where packages
+not previously preelaborable became so in Ada 2005.
+
+@node Pragma Pre_Class
+@unnumberedsec Pragma Pre_Class
+@cindex Pre_Class
+@cindex Checks, preconditions
+@findex Preconditions
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Pre_Class (Boolean_Expression);
+@end smallexample
+
+@noindent
+The @code{Pre_Class} pragma is intended to be an exact replacement for
+the language-defined
+@code{Pre'Class} aspect, and shares its restrictions and semantics.
+It must appear either immediately following the corresponding
+subprogram declaration (only other pragmas may intervene), or
+if there is no separate subprogram declaration, then it can
+appear at the start of the declarations in a subprogram body
+(preceded only by other pragmas).
+
+Note: This pragma is called @code{Pre_Class} rather than
+@code{Pre'Class} because the latter would not be strictly
+conforming to the allowed syntax for pragmas. The motivation
+for providing pragmas equivalent to the aspects is to allow a program
+to be written using the pragmas, and then compiled if necessary
+using an Ada compiler that does not recognize the pragmas or
+aspects, but is prepared to ignore the pragmas. The assertion
+policy that controls this pragma is @code{Pre'Class}, not
+@code{Pre_Class}.
+
+@node Pragma Priority_Specific_Dispatching
+@unnumberedsec Pragma Priority_Specific_Dispatching
+@findex Priority_Specific_Dispatching
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Priority_Specific_Dispatching (
+ POLICY_IDENTIFIER,
+ first_priority_EXPRESSION,
+ last_priority_EXPRESSION)
+
+POLICY_IDENTIFIER ::=
+ EDF_Across_Priorities |
+ FIFO_Within_Priorities |
+ Non_Preemptive_Within_Priorities |
+ Round_Robin_Within_Priorities
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2005, but is available in all earlier
+versions of Ada as an implementation-defined pragma.
+See Ada 2012 Reference Manual for details.
+
+@node Pragma Profile
+@unnumberedsec Pragma Profile
+@findex Profile
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Profile (Ravenscar | Restricted | Rational);
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2005, but is available in all earlier
+versions of Ada as an implementation-defined pragma. This is a
+configuration pragma that establishes a set of configiuration pragmas
+that depend on the argument. @code{Ravenscar} is standard in Ada 2005.
+The other two possibilities (@code{Restricted} or @code{Rational})
+are implementation-defined. The set of configuration pragmas
+is defined in the following sections.
+
+@itemize
+
+@item Pragma Profile (Ravenscar)
+@findex Ravenscar
+@noindent
+
+The @code{Ravenscar} profile is standard in Ada 2005,
+but is available in all earlier
+versions of Ada as an implementation-defined pragma. This profile
+establishes the following set of configuration pragmas:
+
+@table @code
+@item Task_Dispatching_Policy (FIFO_Within_Priorities)
+[RM D.2.2] Tasks are dispatched following a preemptive
+priority-ordered scheduling policy.
+
+@item Locking_Policy (Ceiling_Locking)
+[RM D.3] While tasks and interrupts execute a protected action, they inherit
+the ceiling priority of the corresponding protected object.
+
+@item Detect_Blocking
+This pragma forces the detection of potentially blocking operations within a
+protected operation, and to raise Program_Error if that happens.
+@end table
+@noindent
+
+plus the following set of restrictions:
+
+@table @code
+@item Max_Entry_Queue_Length => 1
+No task can be queued on a protected entry.
+@item Max_Protected_Entries => 1
+@item Max_Task_Entries => 0
+No rendezvous statements are allowed.
+@item No_Abort_Statements
+@item No_Dynamic_Attachment
+@item No_Dynamic_Priorities
+@item No_Implicit_Heap_Allocations
+@item No_Local_Protected_Objects
+@item No_Local_Timing_Events
+@item No_Protected_Type_Allocators
+@item No_Relative_Delay
+@item No_Requeue_Statements
+@item No_Select_Statements
+@item No_Specific_Termination_Handlers
+@item No_Task_Allocators
+@item No_Task_Hierarchy
+@item No_Task_Termination
+@item Simple_Barriers
+@end table
+@noindent
+
+The Ravenscar profile also includes the following restrictions that specify
+that there are no semantic dependences on the corresponding predefined
+packages:
+
+@table @code
+@item No_Dependence => Ada.Asynchronous_Task_Control
+@item No_Dependence => Ada.Calendar
+@item No_Dependence => Ada.Execution_Time.Group_Budget
+@item No_Dependence => Ada.Execution_Time.Timers
+@item No_Dependence => Ada.Task_Attributes
+@item No_Dependence => System.Multiprocessors.Dispatching_Domains
+@end table
+
+@noindent
+
+This set of configuration pragmas and restrictions correspond to the
+definition of the ``Ravenscar Profile'' for limited tasking, devised and
+published by the @cite{International Real-Time Ada Workshop}, 1997,
+and whose most recent description is available at
+@url{http://www-users.cs.york.ac.uk/~burns/ravenscar.ps}.
+
+The original definition of the profile was revised at subsequent IRTAW
+meetings. It has been included in the ISO
+@cite{Guide for the Use of the Ada Programming Language in High
+Integrity Systems}, and has been approved by ISO/IEC/SC22/WG9 for inclusion in
+the next revision of the standard. The formal definition given by
+the Ada Rapporteur Group (ARG) can be found in two Ada Issues (AI-249 and
+AI-305) available at
+@url{http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00249.txt} and
+@url{http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00305.txt}.
+
+The above set is a superset of the restrictions provided by pragma
+@code{Profile (Restricted)}, it includes six additional restrictions
+(@code{Simple_Barriers}, @code{No_Select_Statements},
+@code{No_Calendar}, @code{No_Implicit_Heap_Allocations},
+@code{No_Relative_Delay} and @code{No_Task_Termination}). This means
+that pragma @code{Profile (Ravenscar)}, like the pragma
+@code{Profile (Restricted)},
+automatically causes the use of a simplified,
+more efficient version of the tasking run-time system.
+
+@item Pragma Profile (Restricted)
+@findex Restricted Run Time
+@noindent
+This profile corresponds to the GNAT restricted run time. It
+establishes the following set of restrictions:
+
+@itemize @bullet
+@item No_Abort_Statements
+@item No_Entry_Queue
+@item No_Task_Hierarchy
+@item No_Task_Allocators
+@item No_Dynamic_Priorities
+@item No_Terminate_Alternatives
+@item No_Dynamic_Attachment
+@item No_Protected_Type_Allocators
+@item No_Local_Protected_Objects
+@item No_Requeue_Statements
+@item No_Task_Attributes_Package
+@item Max_Asynchronous_Select_Nesting = 0
+@item Max_Task_Entries = 0
+@item Max_Protected_Entries = 1
+@item Max_Select_Alternatives = 0
+@end itemize
+
+@noindent
+This set of restrictions causes the automatic selection of a simplified
+version of the run time that provides improved performance for the
+limited set of tasking functionality permitted by this set of restrictions.
+
+@item Pragma Profile (Rational)
+@findex Rational compatibility mode
+@noindent
+The Rational profile is intended to facilitate porting legacy code that
+compiles with the Rational APEX compiler, even when the code includes non-
+conforming Ada constructs. The profile enables the following three pragmas:
+
+@itemize @bullet
+@item pragma Implicit_Packing
+@item pragma Overriding_Renamings
+@item pragma Use_VADS_Size
+@end itemize
+
+@end itemize
+
+@node Pragma Profile_Warnings
+@unnumberedsec Pragma Profile_Warnings
+@findex Profile_Warnings
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Profile_Warnings (Ravenscar | Restricted | Rational);
+@end smallexample
+
+@noindent
+This is an implementation-defined pragma that is similar in
+effect to @code{pragma Profile} except that instead of
+generating @code{Restrictions} pragmas, it generates
+@code{Restriction_Warnings} pragmas. The result is that
+violations of the profile generate warning messages instead
+of error messages.
+
+@node Pragma Propagate_Exceptions
+@unnumberedsec Pragma Propagate_Exceptions
+@cindex Interfacing to C++
+@findex Propagate_Exceptions
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Propagate_Exceptions;
+@end smallexample
+
+@noindent
+This pragma is now obsolete and, other than generating a warning if warnings
+on obsolescent features are enabled, is ignored.
+It is retained for compatibility
+purposes. It used to be used in connection with optimization of
+a now-obsolete mechanism for implementation of exceptions.
+
+@node Pragma Provide_Shift_Operators
+@unnumberedsec Pragma Provide_Shift_Operators
+@cindex Shift operators
+@findex Provide_Shift_Operators
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Provide_Shift_Operators (integer_first_subtype_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma can be applied to a first subtype local name that specifies
+either an unsigned or signed type. It has the effect of providing the
+five shift operators (Shift_Left, Shift_Right, Shift_Right_Arithmetic,
+Rotate_Left and Rotate_Right) for the given type. It is equivalent to
+including the function declarations for these five operators, together
+with the pragma Import (Intrinsic, ...) statements.
+
+@node Pragma Psect_Object
+@unnumberedsec Pragma Psect_Object
+@findex Psect_Object
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Psect_Object (
+ [Internal =>] LOCAL_NAME,
+ [, [External =>] EXTERNAL_SYMBOL]
+ [, [Size =>] EXTERNAL_SYMBOL]);
+
+EXTERNAL_SYMBOL ::=
+ IDENTIFIER
+| static_string_EXPRESSION
+@end smallexample
+
+@noindent
+This pragma is identical in effect to pragma @code{Common_Object}.
+
+@node Pragma Pure_05
+@unnumberedsec Pragma Pure_05
+@findex Pure_05
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Pure_05 [(library_unit_NAME)];
+@end smallexample
+
+@noindent
+This pragma is only available in GNAT mode (@option{-gnatg} switch set)
+and is intended for use in the standard run-time library only. It has
+no effect in Ada 83 or Ada 95 mode, but is
+equivalent to @code{pragma Pure} when operating in later
+Ada versions. This is used to handle some cases where packages
+not previously pure became so in Ada 2005.
+
+@node Pragma Pure_12
+@unnumberedsec Pragma Pure_12
+@findex Pure_12
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Pure_12 [(library_unit_NAME)];
+@end smallexample
+
+@noindent
+This pragma is only available in GNAT mode (@option{-gnatg} switch set)
+and is intended for use in the standard run-time library only. It has
+no effect in Ada 83, Ada 95, or Ada 2005 modes, but is
+equivalent to @code{pragma Pure} when operating in later
+Ada versions. This is used to handle some cases where packages
+not previously pure became so in Ada 2012.
+
+@node Pragma Pure_Function
+@unnumberedsec Pragma Pure_Function
+@findex Pure_Function
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Pure_Function ([Entity =>] function_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma appears in the same declarative part as a function
+declaration (or a set of function declarations if more than one
+overloaded declaration exists, in which case the pragma applies
+to all entities). It specifies that the function @code{Entity} is
+to be considered pure for the purposes of code generation. This means
+that the compiler can assume that there are no side effects, and
+in particular that two calls with identical arguments produce the
+same result. It also means that the function can be used in an
+address clause.
+
+Note that, quite deliberately, there are no static checks to try
+to ensure that this promise is met, so @code{Pure_Function} can be used
+with functions that are conceptually pure, even if they do modify
+global variables. For example, a square root function that is
+instrumented to count the number of times it is called is still
+conceptually pure, and can still be optimized, even though it
+modifies a global variable (the count). Memo functions are another
+example (where a table of previous calls is kept and consulted to
+avoid re-computation).
+
+Note also that the normal rules excluding optimization of subprograms
+in pure units (when parameter types are descended from System.Address,
+or when the full view of a parameter type is limited), do not apply
+for the Pure_Function case. If you explicitly specify Pure_Function,
+the compiler may optimize away calls with identical arguments, and
+if that results in unexpected behavior, the proper action is not to
+use the pragma for subprograms that are not (conceptually) pure.
+
+@findex Pure
+Note: Most functions in a @code{Pure} package are automatically pure, and
+there is no need to use pragma @code{Pure_Function} for such functions. One
+exception is any function that has at least one formal of type
+@code{System.Address} or a type derived from it. Such functions are not
+considered pure by default, since the compiler assumes that the
+@code{Address} parameter may be functioning as a pointer and that the
+referenced data may change even if the address value does not.
+Similarly, imported functions are not considered to be pure by default,
+since there is no way of checking that they are in fact pure. The use
+of pragma @code{Pure_Function} for such a function will override these default
+assumption, and cause the compiler to treat a designated subprogram as pure
+in these cases.
+
+Note: If pragma @code{Pure_Function} is applied to a renamed function, it
+applies to the underlying renamed function. This can be used to
+disambiguate cases of overloading where some but not all functions
+in a set of overloaded functions are to be designated as pure.
+
+If pragma @code{Pure_Function} is applied to a library level function, the
+function is also considered pure from an optimization point of view, but the
+unit is not a Pure unit in the categorization sense. So for example, a function
+thus marked is free to @code{with} non-pure units.
+
+@node Pragma Ravenscar
+@unnumberedsec Pragma Ravenscar
+@findex Pragma Ravenscar
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Ravenscar;
+@end smallexample
+
+@noindent
+This pragma is considered obsolescent, but is retained for
+compatibility purposes. It is equivalent to:
+
+@smallexample @c ada
+pragma Profile (Ravenscar);
+@end smallexample
+
+@noindent
+which is the preferred method of setting the @code{Ravenscar} profile.
+
+@node Pragma Refined_State
+@unnumberedsec Pragma Refined_State
+@findex Refined_State
+@noindent
+For the description of this pragma, see SPARK 2014 Reference Manual,
+section 7.2.2.
+
+@node Pragma Relative_Deadline
+@unnumberedsec Pragma Relative_Deadline
+@findex Relative_Deadline
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Relative_Deadline (time_span_EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma is standard in Ada 2005, but is available in all earlier
+versions of Ada as an implementation-defined pragma.
+See Ada 2012 Reference Manual for details.
+
+@node Pragma Remote_Access_Type
+@unnumberedsec Pragma Remote_Access_Type
+@findex Remote_Access_Type
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Remote_Access_Type ([Entity =>] formal_access_type_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma appears in the formal part of a generic declaration.
+It specifies an exception to the RM rule from E.2.2(17/2), which forbids
+the use of a remote access to class-wide type as actual for a formal
+access type.
+
+When this pragma applies to a formal access type @code{Entity}, that
+type is treated as a remote access to class-wide type in the generic.
+It must be a formal general access type, and its designated type must
+be the class-wide type of a formal tagged limited private type from the
+same generic declaration.
+
+In the generic unit, the formal type is subject to all restrictions
+pertaining to remote access to class-wide types. At instantiation, the
+actual type must be a remote access to class-wide type.
+
+@node Pragma Restricted_Run_Time
+@unnumberedsec Pragma Restricted_Run_Time
+@findex Pragma Restricted_Run_Time
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Restricted_Run_Time;
+@end smallexample
+
+@noindent
+This pragma is considered obsolescent, but is retained for
+compatibility purposes. It is equivalent to:
+
+@smallexample @c ada
+pragma Profile (Restricted);
+@end smallexample
+
+@noindent
+which is the preferred method of setting the restricted run time
+profile.
+
+@node Pragma Restriction_Warnings
+@unnumberedsec Pragma Restriction_Warnings
+@findex Restriction_Warnings
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Restriction_Warnings
+ (restriction_IDENTIFIER @{, restriction_IDENTIFIER@});
+@end smallexample
+
+@noindent
+This pragma allows a series of restriction identifiers to be
+specified (the list of allowed identifiers is the same as for
+pragma @code{Restrictions}). For each of these identifiers
+the compiler checks for violations of the restriction, but
+generates a warning message rather than an error message
+if the restriction is violated.
+
+One use of this is in situations where you want to know
+about violations of a restriction, but you want to ignore some of
+these violations. Consider this example, where you want to set
+Ada_95 mode and enable style checks, but you want to know about
+any other use of implementation pragmas:
+
+@smallexample @c ada
+pragma Restriction_Warnings (No_Implementation_Pragmas);
+pragma Warnings (Off, "violation of*No_Implementation_Pragmas*");
+pragma Ada_95;
+pragma Style_Checks ("2bfhkM160");
+pragma Warnings (On, "violation of*No_Implementation_Pragmas*");
+@end smallexample
+
+@noindent
+By including the above lines in a configuration pragmas file,
+the Ada_95 and Style_Checks pragmas are accepted without
+generating a warning, but any other use of implementation
+defined pragmas will cause a warning to be generated.
+
+@node Pragma Reviewable
+@unnumberedsec Pragma Reviewable
+@findex Reviewable
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Reviewable;
+@end smallexample
+
+@noindent
+This pragma is an RM-defined standard pragma, but has no effect on the
+program being compiled, or on the code generated for the program.
+
+To obtain the required output specified in RM H.3.1, the compiler must be
+run with various special switches as follows:
+
+@table @i
+
+@item Where compiler-generated run-time checks remain
+
+The switch @option{-gnatGL}
+@findex @option{-gnatGL}
+may be used to list the expanded code in pseudo-Ada form.
+Runtime checks show up in the listing either as explicit
+checks or operators marked with @{@} to indicate a check is present.
+
+@item An identification of known exceptions at compile time
+
+If the program is compiled with @option{-gnatwa},
+@findex @option{-gnatwa}
+the compiler warning messages will indicate all cases where the compiler
+detects that an exception is certain to occur at run time.
+
+@item Possible reads of uninitialized variables
+
+The compiler warns of many such cases, but its output is incomplete.
+@ifclear FSFEDITION
+The CodePeer analysis tool
+@findex CodePeer static analysis tool
+@end ifclear
+@ifset FSFEDITION
+A supplemental static analysis tool
+@end ifset
+may be used to obtain a comprehensive list of all
+possible points at which uninitialized data may be read.
+
+@item Where run-time support routines are implicitly invoked
+
+In the output from @option{-gnatGL},
+@findex @option{-gnatGL}
+run-time calls are explicitly listed as calls to the relevant
+run-time routine.
+
+@item Object code listing
+
+This may be obtained either by using the @option{-S} switch,
+@findex @option{-S}
+or the objdump utility.
+@findex objdump
+
+@item Constructs known to be erroneous at compile time
+
+These are identified by warnings issued by the compiler (use @option{-gnatwa}).
+@findex @option{-gnatwa}
+
+@item Stack usage information
+
+Static stack usage data (maximum per-subprogram) can be obtained via the
+@option{-fstack-usage} switch to the compiler.
+@findex @option{-fstack-usage}
+Dynamic stack usage data (per task) can be obtained via the @option{-u} switch
+to gnatbind
+@findex @option{-u}
+@ifclear FSFEDITION
+The gnatstack utility
+@findex gnatstack
+can be used to provide additional information on stack usage.
+@end ifclear
+
+@item Object code listing of entire partition
+
+This can be obtained by compiling the partition with @option{-S},
+@findex @option{-S}
+or by applying objdump
+@findex objdump
+to all the object files that are part of the partition.
+
+@item A description of the run-time model
+
+The full sources of the run-time are available, and the documentation of
+these routines describes how these run-time routines interface to the
+underlying operating system facilities.
+
+@item Control and data-flow information
+
+@ifclear FSFEDITION
+The CodePeer tool
+@findex CodePeer static analysis tool
+@end ifclear
+@ifset FSFEDITION
+A supplemental static analysis tool
+@end ifset
+may be used to obtain complete control and data-flow information, as well as
+comprehensive messages identifying possible problems based on this
+information.
+@end table
+
+@node Pragma Share_Generic
+@unnumberedsec Pragma Share_Generic
+@findex Share_Generic
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Share_Generic (GNAME @{, GNAME@});
+
+GNAME ::= generic_unit_NAME | generic_instance_NAME
+@end smallexample
+
+@noindent
+This pragma is provided for compatibility with Dec Ada 83. It has
+no effect in @code{GNAT} (which does not implement shared generics), other
+than to check that the given names are all names of generic units or
+generic instances.
+
+@node Pragma Shared
+@unnumberedsec Pragma Shared
+@findex Shared
+
+@noindent
+This pragma is provided for compatibility with Ada 83. The syntax and
+semantics are identical to pragma Atomic.
+
+@node Pragma Short_Circuit_And_Or
+@unnumberedsec Pragma Short_Circuit_And_Or
+@findex Short_Circuit_And_Or
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Short_Circuit_And_Or;
+@end smallexample
+
+@noindent
+This configuration pragma causes any occurrence of the AND operator applied to
+operands of type Standard.Boolean to be short-circuited (i.e. the AND operator
+is treated as if it were AND THEN). Or is similarly treated as OR ELSE. This
+may be useful in the context of certification protocols requiring the use of
+short-circuited logical operators. If this configuration pragma occurs locally
+within the file being compiled, it applies only to the file being compiled.
+There is no requirement that all units in a partition use this option.
+
+@node Pragma Short_Descriptors
+@unnumberedsec Pragma Short_Descriptors
+@findex Short_Descriptors
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Short_Descriptors
+@end smallexample
+
+@noindent
+In VMS versions of the compiler, this configuration pragma causes all
+occurrences of the mechanism types Descriptor[_xxx] to be treated as
+Short_Descriptor[_xxx]. This is helpful in porting legacy applications from a
+32-bit environment to a 64-bit environment. This pragma is ignored for non-VMS
+versions.
+
+@node Pragma Simple_Storage_Pool_Type
+@unnumberedsec Pragma Simple_Storage_Pool_Type
+@findex Simple_Storage_Pool_Type
+@cindex Storage pool, simple
+@cindex Simple storage pool
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Simple_Storage_Pool_Type (type_LOCAL_NAME);
+@end smallexample
+
+@noindent
+A type can be established as a ``simple storage pool type'' by applying
+the representation pragma @code{Simple_Storage_Pool_Type} to the type.
+A type named in the pragma must be a library-level immutably limited record
+type or limited tagged type declared immediately within a package declaration.
+The type can also be a limited private type whose full type is allowed as
+a simple storage pool type.
+
+For a simple storage pool type @var{SSP}, nonabstract primitive subprograms
+@code{Allocate}, @code{Deallocate}, and @code{Storage_Size} can be declared that
+are subtype conformant with the following subprogram declarations:
+
+@smallexample @c ada
+procedure Allocate
+ (Pool : in out SSP;
+ Storage_Address : out System.Address;
+ Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
+ Alignment : System.Storage_Elements.Storage_Count);
+
+procedure Deallocate
+ (Pool : in out SSP;
+ Storage_Address : System.Address;
+ Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
+ Alignment : System.Storage_Elements.Storage_Count);
+
+function Storage_Size (Pool : SSP)
+ return System.Storage_Elements.Storage_Count;
+@end smallexample
+
+@noindent
+Procedure @code{Allocate} must be declared, whereas @code{Deallocate} and
+@code{Storage_Size} are optional. If @code{Deallocate} is not declared, then
+applying an unchecked deallocation has no effect other than to set its actual
+parameter to null. If @code{Storage_Size} is not declared, then the
+@code{Storage_Size} attribute applied to an access type associated with
+a pool object of type SSP returns zero. Additional operations can be declared
+for a simple storage pool type (such as for supporting a mark/release
+storage-management discipline).
+
+An object of a simple storage pool type can be associated with an access
+type by specifying the attribute @code{Simple_Storage_Pool}. For example:
+
+@smallexample @c ada
+
+My_Pool : My_Simple_Storage_Pool_Type;
+
+type Acc is access My_Data_Type;
+
+for Acc'Simple_Storage_Pool use My_Pool;
+
+@end smallexample
+
+@noindent
+See attribute @code{Simple_Storage_Pool} for further details.
+
+@node Pragma Source_File_Name
+@unnumberedsec Pragma Source_File_Name
+@findex Source_File_Name
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Source_File_Name (
+ [Unit_Name =>] unit_NAME,
+ Spec_File_Name => STRING_LITERAL,
+ [Index => INTEGER_LITERAL]);
+
+pragma Source_File_Name (
+ [Unit_Name =>] unit_NAME,
+ Body_File_Name => STRING_LITERAL,
+ [Index => INTEGER_LITERAL]);
+@end smallexample
+
+@noindent
+Use this to override the normal naming convention. It is a configuration
+pragma, and so has the usual applicability of configuration pragmas
+(i.e.@: it applies to either an entire partition, or to all units in a
+compilation, or to a single unit, depending on how it is used.
+@var{unit_name} is mapped to @var{file_name_literal}. The identifier for
+the second argument is required, and indicates whether this is the file
+name for the spec or for the body.
+
+The optional Index argument should be used when a file contains multiple
+units, and when you do not want to use @code{gnatchop} to separate then
+into multiple files (which is the recommended procedure to limit the
+number of recompilations that are needed when some sources change).
+For instance, if the source file @file{source.ada} contains
+
+@smallexample @c ada
+package B is
+...
+end B;
+
+with B;
+procedure A is
+begin
+ ..
+end A;
+@end smallexample
+
+you could use the following configuration pragmas:
+
+@smallexample @c ada
+pragma Source_File_Name
+ (B, Spec_File_Name => "source.ada", Index => 1);
+pragma Source_File_Name
+ (A, Body_File_Name => "source.ada", Index => 2);
+@end smallexample
+
+Note that the @code{gnatname} utility can also be used to generate those
+configuration pragmas.
+
+Another form of the @code{Source_File_Name} pragma allows
+the specification of patterns defining alternative file naming schemes
+to apply to all files.
+
+@smallexample @c ada
+pragma Source_File_Name
+ ( [Spec_File_Name =>] STRING_LITERAL
+ [,[Casing =>] CASING_SPEC]
+ [,[Dot_Replacement =>] STRING_LITERAL]);
+
+pragma Source_File_Name
+ ( [Body_File_Name =>] STRING_LITERAL
+ [,[Casing =>] CASING_SPEC]
+ [,[Dot_Replacement =>] STRING_LITERAL]);
+
+pragma Source_File_Name
+ ( [Subunit_File_Name =>] STRING_LITERAL
+ [,[Casing =>] CASING_SPEC]
+ [,[Dot_Replacement =>] STRING_LITERAL]);
+
+CASING_SPEC ::= Lowercase | Uppercase | Mixedcase
+@end smallexample
+
+@noindent
+The first argument is a pattern that contains a single asterisk indicating
+the point at which the unit name is to be inserted in the pattern string
+to form the file name. The second argument is optional. If present it
+specifies the casing of the unit name in the resulting file name string.
+The default is lower case. Finally the third argument allows for systematic
+replacement of any dots in the unit name by the specified string literal.
+
+Note that Source_File_Name pragmas should not be used if you are using
+project files. The reason for this rule is that the project manager is not
+aware of these pragmas, and so other tools that use the projet file would not
+be aware of the intended naming conventions. If you are using project files,
+file naming is controlled by Source_File_Name_Project pragmas, which are
+usually supplied automatically by the project manager. A pragma
+Source_File_Name cannot appear after a @ref{Pragma Source_File_Name_Project}.
+
+For more details on the use of the @code{Source_File_Name} pragma,
+@xref{Using Other File Names,,, gnat_ugn, @value{EDITION} User's Guide},
+and @ref{Alternative File Naming Schemes,,, gnat_ugn, @value{EDITION}
+User's Guide}.
+
+@node Pragma Source_File_Name_Project
+@unnumberedsec Pragma Source_File_Name_Project
+@findex Source_File_Name_Project
+@noindent
+
+This pragma has the same syntax and semantics as pragma Source_File_Name.
+It is only allowed as a stand alone configuration pragma.
+It cannot appear after a @ref{Pragma Source_File_Name}, and
+most importantly, once pragma Source_File_Name_Project appears,
+no further Source_File_Name pragmas are allowed.
+
+The intention is that Source_File_Name_Project pragmas are always
+generated by the Project Manager in a manner consistent with the naming
+specified in a project file, and when naming is controlled in this manner,
+it is not permissible to attempt to modify this naming scheme using
+Source_File_Name or Source_File_Name_Project pragmas (which would not be
+known to the project manager).
+
+@node Pragma Source_Reference
+@unnumberedsec Pragma Source_Reference
+@findex Source_Reference
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Source_Reference (INTEGER_LITERAL, STRING_LITERAL);
+@end smallexample
+
+@noindent
+This pragma must appear as the first line of a source file.
+@var{integer_literal} is the logical line number of the line following
+the pragma line (for use in error messages and debugging
+information). @var{string_literal} is a static string constant that
+specifies the file name to be used in error messages and debugging
+information. This is most notably used for the output of @code{gnatchop}
+with the @option{-r} switch, to make sure that the original unchopped
+source file is the one referred to.
+
+The second argument must be a string literal, it cannot be a static
+string expression other than a string literal. This is because its value
+is needed for error messages issued by all phases of the compiler.
+
+@node Pragma SPARK_Mode
+@unnumberedsec Pragma SPARK_Mode
+@findex SPARK_Mode
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma SPARK_Mode [(On | Off)] ;
+@end smallexample
+
+@noindent
+In general a program can have some parts that are in SPARK 2014 (and
+follow all the rules in the SPARK Reference Manual), and some parts
+that are full Ada 2012.
+
+The SPARK_Mode pragma is used to identify which parts are in SPARK
+2014 (by default programs are in full Ada). The SPARK_Mode pragma can
+be used in the following places:
+
+@itemize @bullet
+
+@item
+As a configuration pragma, in which case it sets the default mode for
+all units compiled with this pragma.
+
+@item
+Immediately following a library-level subprogram spec
+
+@item
+Immediately within a library-level package body
+
+@item
+Immediately following the @code{private} keyword of a library-level
+package spec
+
+@item
+Immediately following the @code{begin} keyword of a library-level
+package body
+
+@item
+Immediately within a library-level subprogram body
+
+@end itemize
+
+@noindent
+Normally a subprogram or package spec/body inherits the current mode
+that is active at the point it is declared. But this can be overridden
+by pragma within the spec or body as above.
+
+The basic consistency rule is that you can't turn SPARK_Mode back
+@code{On}, once you have explicitly (with a pragma) turned if
+@code{Off}. So the following rules apply:
+
+@noindent
+If a subprogram spec has SPARK_Mode @code{Off}, then the body must
+also have SPARK_Mode @code{Off}.
+
+@noindent
+For a package, we have four parts:
+
+@itemize
+@item
+the package public declarations
+@item
+the package private part
+@item
+the body of the package
+@item
+the elaboration code after @code{begin}
+@end itemize
+
+@noindent
+For a package, the rule is that if you explicitly turn SPARK_Mode
+@code{Off} for any part, then all the following parts must have
+SPARK_Mode @code{Off}. Note that this may require repeating a pragma
+SPARK_Mode (@code{Off}) in the body. For example, if we have a
+configuration pragma SPARK_Mode (@code{On}) that turns the mode on by
+default everywhere, and one particular package spec has pragma
+SPARK_Mode (@code{Off}), then that pragma will need to be repeated in
+the package body.
+
+@node Pragma Static_Elaboration_Desired
+@unnumberedsec Pragma Static_Elaboration_Desired
+@findex Static_Elaboration_Desired
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Static_Elaboration_Desired;
+@end smallexample
+
+@noindent
+This pragma is used to indicate that the compiler should attempt to initialize
+statically the objects declared in the library unit to which the pragma applies,
+when these objects are initialized (explicitly or implicitly) by an aggregate.
+In the absence of this pragma, aggregates in object declarations are expanded
+into assignments and loops, even when the aggregate components are static
+constants. When the aggregate is present the compiler builds a static expression
+that requires no run-time code, so that the initialized object can be placed in
+read-only data space. If the components are not static, or the aggregate has
+more that 100 components, the compiler emits a warning that the pragma cannot
+be obeyed. (See also the restriction No_Implicit_Loops, which supports static
+construction of larger aggregates with static components that include an others
+choice.)
+
+@node Pragma Stream_Convert
+@unnumberedsec Pragma Stream_Convert
+@findex Stream_Convert
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Stream_Convert (
+ [Entity =>] type_LOCAL_NAME,
+ [Read =>] function_NAME,
+ [Write =>] function_NAME);
+@end smallexample
+
+@noindent
+This pragma provides an efficient way of providing user-defined stream
+attributes. Not only is it simpler to use than specifying the attributes
+directly, but more importantly, it allows the specification to be made in such
+a way that the predefined unit Ada.Streams is not loaded unless it is actually
+needed (i.e. unless the stream attributes are actually used); the use of
+the Stream_Convert pragma adds no overhead at all, unless the stream
+attributes are actually used on the designated type.
+
+The first argument specifies the type for which stream functions are
+provided. The second parameter provides a function used to read values
+of this type. It must name a function whose argument type may be any
+subtype, and whose returned type must be the type given as the first
+argument to the pragma.
+
+The meaning of the @var{Read} parameter is that if a stream attribute directly
+or indirectly specifies reading of the type given as the first parameter,
+then a value of the type given as the argument to the Read function is
+read from the stream, and then the Read function is used to convert this
+to the required target type.
+
+Similarly the @var{Write} parameter specifies how to treat write attributes
+that directly or indirectly apply to the type given as the first parameter.
+It must have an input parameter of the type specified by the first parameter,
+and the return type must be the same as the input type of the Read function.
+The effect is to first call the Write function to convert to the given stream
+type, and then write the result type to the stream.
+
+The Read and Write functions must not be overloaded subprograms. If necessary
+renamings can be supplied to meet this requirement.
+The usage of this attribute is best illustrated by a simple example, taken
+from the GNAT implementation of package Ada.Strings.Unbounded:
+
+@smallexample @c ada
+function To_Unbounded (S : String)
+ return Unbounded_String
+ renames To_Unbounded_String;
+
+pragma Stream_Convert
+ (Unbounded_String, To_Unbounded, To_String);
+@end smallexample
+
+@noindent
+The specifications of the referenced functions, as given in the Ada
+Reference Manual are:
+
+@smallexample @c ada
+function To_Unbounded_String (Source : String)
+ return Unbounded_String;
+
+function To_String (Source : Unbounded_String)
+ return String;
+@end smallexample
+
+@noindent
+The effect is that if the value of an unbounded string is written to a stream,
+then the representation of the item in the stream is in the same format that
+would be used for @code{Standard.String'Output}, and this same representation
+is expected when a value of this type is read from the stream. Note that the
+value written always includes the bounds, even for Unbounded_String'Write,
+since Unbounded_String is not an array type.
+
+Note that the @code{Stream_Convert} pragma is not effective in the case of
+a derived type of a non-limited tagged type. If such a type is specified then
+the pragma is silently ignored, and the default implementation of the stream
+attributes is used instead.
+
+@node Pragma Style_Checks
+@unnumberedsec Pragma Style_Checks
+@findex Style_Checks
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Style_Checks (string_LITERAL | ALL_CHECKS |
+ On | Off [, LOCAL_NAME]);
+@end smallexample
+
+@noindent
+This pragma is used in conjunction with compiler switches to control the
+built in style checking provided by GNAT@. The compiler switches, if set,
+provide an initial setting for the switches, and this pragma may be used
+to modify these settings, or the settings may be provided entirely by
+the use of the pragma. This pragma can be used anywhere that a pragma
+is legal, including use as a configuration pragma (including use in
+the @file{gnat.adc} file).
+
+The form with a string literal specifies which style options are to be
+activated. These are additive, so they apply in addition to any previously
+set style check options. The codes for the options are the same as those
+used in the @option{-gnaty} switch to @command{gcc} or @command{gnatmake}.
+For example the following two methods can be used to enable
+layout checking:
+
+@itemize @bullet
+@item
+@smallexample @c ada
+pragma Style_Checks ("l");
+@end smallexample
+
+@item
+@smallexample
+gcc -c -gnatyl @dots{}
+@end smallexample
+@end itemize
+
+@noindent
+The form ALL_CHECKS activates all standard checks (its use is equivalent
+to the use of the @code{gnaty} switch with no options. @xref{Top,
+@value{EDITION} User's Guide, About This Guide, gnat_ugn,
+@value{EDITION} User's Guide}, for details.)
+
+Note: the behavior is slightly different in GNAT mode (@option{-gnatg} used).
+In this case, ALL_CHECKS implies the standard set of GNAT mode style check
+options (i.e. equivalent to -gnatyg).
+
+The forms with @code{Off} and @code{On}
+can be used to temporarily disable style checks
+as shown in the following example:
+
+@smallexample @c ada
+@iftex
+@leftskip=0cm
+@end iftex
+pragma Style_Checks ("k"); -- requires keywords in lower case
+pragma Style_Checks (Off); -- turn off style checks
+NULL; -- this will not generate an error message
+pragma Style_Checks (On); -- turn style checks back on
+NULL; -- this will generate an error message
+@end smallexample
+
+@noindent
+Finally the two argument form is allowed only if the first argument is
+@code{On} or @code{Off}. The effect is to turn of semantic style checks
+for the specified entity, as shown in the following example:
+
+@smallexample @c ada
+@iftex
+@leftskip=0cm
+@end iftex
+pragma Style_Checks ("r"); -- require consistency of identifier casing
+Arg : Integer;
+Rf1 : Integer := ARG; -- incorrect, wrong case
+pragma Style_Checks (Off, Arg);
+Rf2 : Integer := ARG; -- OK, no error
+@end smallexample
+
+@node Pragma Subtitle
+@unnumberedsec Pragma Subtitle
+@findex Subtitle
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Subtitle ([Subtitle =>] STRING_LITERAL);
+@end smallexample
+
+@noindent
+This pragma is recognized for compatibility with other Ada compilers
+but is ignored by GNAT@.
+
+@node Pragma Suppress
+@unnumberedsec Pragma Suppress
+@findex Suppress
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Suppress (Identifier [, [On =>] Name]);
+@end smallexample
+
+@noindent
+This is a standard pragma, and supports all the check names required in
+the RM. It is included here because GNAT recognizes some additional check
+names that are implementation defined (as permitted by the RM):
+
+@itemize @bullet
+
+@item
+@code{Alignment_Check} can be used to suppress alignment checks
+on addresses used in address clauses. Such checks can also be suppressed
+by suppressing range checks, but the specific use of @code{Alignment_Check}
+allows suppression of alignment checks without suppressing other range checks.
+
+@item
+@code{Predicate_Check} can be used to control whether predicate checks are
+active. It is applicable only to predicates for which the policy is
+@code{Check}. Unlike @code{Assertion_Policy}, which determines if a given
+predicate is ignored or checked for the whole program, the use of
+@code{Suppress} and @code{Unsuppress} with this check name allows a given
+predicate to be turned on and off at specific points in the program.
+
+@item
+@code{Validity_Check} can be used specifically to control validity checks.
+If @code{Suppress} is used to suppress validity checks, then no validity
+checks are performed, including those specified by the appropriate compiler
+switch or the @code{Validity_Checks} pragma.
+
+@item
+Additional check names previously introduced by use of the @code{Check_Name}
+pragma are also allowed.
+
+@end itemize
+
+@noindent
+Note that pragma Suppress gives the compiler permission to omit
+checks, but does not require the compiler to omit checks. The compiler
+will generate checks if they are essentially free, even when they are
+suppressed. In particular, if the compiler can prove that a certain
+check will necessarily fail, it will generate code to do an
+unconditional ``raise'', even if checks are suppressed. The compiler
+warns in this case.
+
+Of course, run-time checks are omitted whenever the compiler can prove
+that they will not fail, whether or not checks are suppressed.
+
+@node Pragma Suppress_All
+@unnumberedsec Pragma Suppress_All
+@findex Suppress_All
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Suppress_All;
+@end smallexample
+
+@noindent
+This pragma can appear anywhere within a unit.
+The effect is to apply @code{Suppress (All_Checks)} to the unit
+in which it appears. This pragma is implemented for compatibility with DEC
+Ada 83 usage where it appears at the end of a unit, and for compatibility
+with Rational Ada, where it appears as a program unit pragma.
+The use of the standard Ada pragma @code{Suppress (All_Checks)}
+as a normal configuration pragma is the preferred usage in GNAT@.
+
+@node Pragma Suppress_Debug_Info
+@unnumberedsec Pragma Suppress_Debug_Info
+@findex Suppress_Debug_Info
+@noindent
+Syntax:
+
+@smallexample @c ada
+Suppress_Debug_Info ([Entity =>] LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma can be used to suppress generation of debug information
+for the specified entity. It is intended primarily for use in debugging
+the debugger, and navigating around debugger problems.
+
+@node Pragma Suppress_Exception_Locations
+@unnumberedsec Pragma Suppress_Exception_Locations
+@findex Suppress_Exception_Locations
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Suppress_Exception_Locations;
+@end smallexample
+
+@noindent
+In normal mode, a raise statement for an exception by default generates
+an exception message giving the file name and line number for the location
+of the raise. This is useful for debugging and logging purposes, but this
+entails extra space for the strings for the messages. The configuration
+pragma @code{Suppress_Exception_Locations} can be used to suppress the
+generation of these strings, with the result that space is saved, but the
+exception message for such raises is null. This configuration pragma may
+appear in a global configuration pragma file, or in a specific unit as
+usual. It is not required that this pragma be used consistently within
+a partition, so it is fine to have some units within a partition compiled
+with this pragma and others compiled in normal mode without it.
+
+@node Pragma Suppress_Initialization
+@unnumberedsec Pragma Suppress_Initialization
+@findex Suppress_Initialization
+@cindex Suppressing initialization
+@cindex Initialization, suppression of
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Suppress_Initialization ([Entity =>] subtype_Name);
+@end smallexample
+
+@noindent
+Here subtype_Name is the name introduced by a type declaration
+or subtype declaration.
+This pragma suppresses any implicit or explicit initialization
+for all variables of the given type or subtype,
+including initialization resulting from the use of pragmas
+Normalize_Scalars or Initialize_Scalars.
+
+This is considered a representation item, so it cannot be given after
+the type is frozen. It applies to all subsequent object declarations,
+and also any allocator that creates objects of the type.
+
+If the pragma is given for the first subtype, then it is considered
+to apply to the base type and all its subtypes. If the pragma is given
+for other than a first subtype, then it applies only to the given subtype.
+The pragma may not be given after the type is frozen.
+
+@node Pragma Task_Info
+@unnumberedsec Pragma Task_Info
+@findex Task_Info
+@noindent
+Syntax
+
+@smallexample @c ada
+pragma Task_Info (EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma appears within a task definition (like pragma
+@code{Priority}) and applies to the task in which it appears. The
+argument must be of type @code{System.Task_Info.Task_Info_Type}.
+The @code{Task_Info} pragma provides system dependent control over
+aspects of tasking implementation, for example, the ability to map
+tasks to specific processors. For details on the facilities available
+for the version of GNAT that you are using, see the documentation
+in the spec of package System.Task_Info in the runtime
+library.
+
+@node Pragma Task_Name
+@unnumberedsec Pragma Task_Name
+@findex Task_Name
+@noindent
+Syntax
+
+@smallexample @c ada
+pragma Task_Name (string_EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma appears within a task definition (like pragma
+@code{Priority}) and applies to the task in which it appears. The
+argument must be of type String, and provides a name to be used for
+the task instance when the task is created. Note that this expression
+is not required to be static, and in particular, it can contain
+references to task discriminants. This facility can be used to
+provide different names for different tasks as they are created,
+as illustrated in the example below.
+
+The task name is recorded internally in the run-time structures
+and is accessible to tools like the debugger. In addition the
+routine @code{Ada.Task_Identification.Image} will return this
+string, with a unique task address appended.
+
+@smallexample @c ada
+-- Example of the use of pragma Task_Name
+
+with Ada.Task_Identification;
+use Ada.Task_Identification;
+with Text_IO; use Text_IO;
+procedure t3 is
+
+ type Astring is access String;
+
+ task type Task_Typ (Name : access String) is
+ pragma Task_Name (Name.all);
+ end Task_Typ;
+
+ task body Task_Typ is
+ Nam : constant String := Image (Current_Task);
+ begin
+ Put_Line ("-->" & Nam (1 .. 14) & "<--");
+ end Task_Typ;
+
+ type Ptr_Task is access Task_Typ;
+ Task_Var : Ptr_Task;
+
+begin
+ Task_Var :=
+ new Task_Typ (new String'("This is task 1"));
+ Task_Var :=
+ new Task_Typ (new String'("This is task 2"));
+end;
+@end smallexample
+
+@node Pragma Task_Storage
+@unnumberedsec Pragma Task_Storage
+@findex Task_Storage
+Syntax:
+
+@smallexample @c ada
+pragma Task_Storage (
+ [Task_Type =>] LOCAL_NAME,
+ [Top_Guard =>] static_integer_EXPRESSION);
+@end smallexample
+
+@noindent
+This pragma specifies the length of the guard area for tasks. The guard
+area is an additional storage area allocated to a task. A value of zero
+means that either no guard area is created or a minimal guard area is
+created, depending on the target. This pragma can appear anywhere a
+@code{Storage_Size} attribute definition clause is allowed for a task
+type.
+
+@node Pragma Test_Case
+@unnumberedsec Pragma Test_Case
+@cindex Test cases
+@findex Test_Case
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Test_Case (
+ [Name =>] static_string_Expression
+ ,[Mode =>] (Nominal | Robustness)
+ [, Requires => Boolean_Expression]
+ [, Ensures => Boolean_Expression]);
+@end smallexample
+
+@noindent
+The @code{Test_Case} pragma allows defining fine-grain specifications
+for use by testing tools.
+The compiler checks the validity of the @code{Test_Case} pragma, but its
+presence does not lead to any modification of the code generated by the
+compiler.
+
+@code{Test_Case} pragmas may only appear immediately following the
+(separate) declaration of a subprogram in a package declaration, inside
+a package spec unit. Only other pragmas may intervene (that is appear
+between the subprogram declaration and a test case).
+
+The compiler checks that boolean expressions given in @code{Requires} and
+@code{Ensures} are valid, where the rules for @code{Requires} are the
+same as the rule for an expression in @code{Precondition} and the rules
+for @code{Ensures} are the same as the rule for an expression in
+@code{Postcondition}. In particular, attributes @code{'Old} and
+@code{'Result} can only be used within the @code{Ensures}
+expression. The following is an example of use within a package spec:
+
+@smallexample @c ada
+package Math_Functions is
+ ...
+ function Sqrt (Arg : Float) return Float;
+ pragma Test_Case (Name => "Test 1",
+ Mode => Nominal,
+ Requires => Arg < 10000,
+ Ensures => Sqrt'Result < 10);
+ ...
+end Math_Functions;
+@end smallexample
+
+@noindent
+The meaning of a test case is that there is at least one context where
+@code{Requires} holds such that, if the associated subprogram is executed in
+that context, then @code{Ensures} holds when the subprogram returns.
+Mode @code{Nominal} indicates that the input context should also satisfy the
+precondition of the subprogram, and the output context should also satisfy its
+postcondition. More @code{Robustness} indicates that the precondition and
+postcondition of the subprogram should be ignored for this test case.
+
+@node Pragma Thread_Local_Storage
+@unnumberedsec Pragma Thread_Local_Storage
+@findex Thread_Local_Storage
+@cindex Task specific storage
+@cindex TLS (Thread Local Storage)
+@cindex Task_Attributes
+Syntax:
+
+@smallexample @c ada
+pragma Thread_Local_Storage ([Entity =>] LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma specifies that the specified entity, which must be
+a variable declared in a library level package, is to be marked as
+"Thread Local Storage" (@code{TLS}). On systems supporting this (which
+include Solaris, GNU/Linux and VxWorks 6), this causes each thread
+(and hence each Ada task) to see a distinct copy of the variable.
+
+The variable may not have default initialization, and if there is
+an explicit initialization, it must be either @code{null} for an
+access variable, or a static expression for a scalar variable.
+This provides a low level mechanism similar to that provided by
+the @code{Ada.Task_Attributes} package, but much more efficient
+and is also useful in writing interface code that will interact
+with foreign threads.
+
+If this pragma is used on a system where @code{TLS} is not supported,
+then an error message will be generated and the program will be rejected.
+
+@node Pragma Time_Slice
+@unnumberedsec Pragma Time_Slice
+@findex Time_Slice
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Time_Slice (static_duration_EXPRESSION);
+@end smallexample
+
+@noindent
+For implementations of GNAT on operating systems where it is possible
+to supply a time slice value, this pragma may be used for this purpose.
+It is ignored if it is used in a system that does not allow this control,
+or if it appears in other than the main program unit.
+@cindex OpenVMS
+Note that the effect of this pragma is identical to the effect of the
+DEC Ada 83 pragma of the same name when operating under OpenVMS systems.
+
+@node Pragma Title
+@unnumberedsec Pragma Title
+@findex Title
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Title (TITLING_OPTION [, TITLING OPTION]);
+
+TITLING_OPTION ::=
+ [Title =>] STRING_LITERAL,
+| [Subtitle =>] STRING_LITERAL
+@end smallexample
+
+@noindent
+Syntax checked but otherwise ignored by GNAT@. This is a listing control
+pragma used in DEC Ada 83 implementations to provide a title and/or
+subtitle for the program listing. The program listing generated by GNAT
+does not have titles or subtitles.
+
+Unlike other pragmas, the full flexibility of named notation is allowed
+for this pragma, i.e.@: the parameters may be given in any order if named
+notation is used, and named and positional notation can be mixed
+following the normal rules for procedure calls in Ada.
+
+@node Pragma Type_Invariant
+@unnumberedsec Pragma Type_Invariant
+@findex Invariant
+@findex Type_Invariant pragma
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Type_Invariant
+ ([Entity =>] type_LOCAL_NAME,
+ [Check =>] EXPRESSION);
+@end smallexample
+
+@noindent
+The @code{Type_Invariant} pragma is intended to be an exact
+replacement for the language-defined @code{Type_Invariant}
+aspect, and shares its restrictions and semantics. It differs
+from the language defined @code{Invariant} pragma in that it
+does not permit a string parameter, and it is
+controlled by the assertion identifier @code{Type_Invariant}
+rather than @code{Invariant}.
+
+@node Pragma Type_Invariant_Class
+@unnumberedsec Pragma Type_Invariant_Class
+@findex Invariant
+@findex Type_Invariant_Class pragma
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Type_Invariant_Class
+ ([Entity =>] type_LOCAL_NAME,
+ [Check =>] EXPRESSION);
+@end smallexample
+
+@noindent
+The @code{Type_Invariant_Class} pragma is intended to be an exact
+replacement for the language-defined @code{Type_Invariant'Class}
+aspect, and shares its restrictions and semantics.
+
+Note: This pragma is called @code{Type_Invariant_Class} rather than
+@code{Type_Invariant'Class} because the latter would not be strictly
+conforming to the allowed syntax for pragmas. The motivation
+for providing pragmas equivalent to the aspects is to allow a program
+to be written using the pragmas, and then compiled if necessary
+using an Ada compiler that does not recognize the pragmas or
+aspects, but is prepared to ignore the pragmas. The assertion
+policy that controls this pragma is @code{Type_Invariant'Class},
+not @code{Type_Invariant_Class}.
+
+@node Pragma Unchecked_Union
+@unnumberedsec Pragma Unchecked_Union
+@cindex Unions in C
+@findex Unchecked_Union
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Unchecked_Union (first_subtype_LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma is used to specify a representation of a record type that is
+equivalent to a C union. It was introduced as a GNAT implementation defined
+pragma in the GNAT Ada 95 mode. Ada 2005 includes an extended version of this
+pragma, making it language defined, and GNAT fully implements this extended
+version in all language modes (Ada 83, Ada 95, and Ada 2005). For full
+details, consult the Ada 2012 Reference Manual, section B.3.3.
+
+@node Pragma Unimplemented_Unit
+@unnumberedsec Pragma Unimplemented_Unit
+@findex Unimplemented_Unit
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Unimplemented_Unit;
+@end smallexample
+
+@noindent
+If this pragma occurs in a unit that is processed by the compiler, GNAT
+aborts with the message @samp{@var{xxx} not implemented}, where
+@var{xxx} is the name of the current compilation unit. This pragma is
+intended to allow the compiler to handle unimplemented library units in
+a clean manner.
+
+The abort only happens if code is being generated. Thus you can use
+specs of unimplemented packages in syntax or semantic checking mode.
+
+@node Pragma Universal_Aliasing
+@unnumberedsec Pragma Universal_Aliasing
+@findex Universal_Aliasing
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Universal_Aliasing [([Entity =>] type_LOCAL_NAME)];
+@end smallexample
+
+@noindent
+@var{type_LOCAL_NAME} must refer to a type declaration in the current
+declarative part. The effect is to inhibit strict type-based aliasing
+optimization for the given type. In other words, the effect is as though
+access types designating this type were subject to pragma No_Strict_Aliasing.
+For a detailed description of the strict aliasing optimization, and the
+situations in which it must be suppressed, @xref{Optimization and Strict
+Aliasing,,, gnat_ugn, @value{EDITION} User's Guide}.
+
+@node Pragma Universal_Data
+@unnumberedsec Pragma Universal_Data
+@findex Universal_Data
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Universal_Data [(library_unit_Name)];
+@end smallexample
+
+@noindent
+This pragma is supported only for the AAMP target and is ignored for
+other targets. The pragma specifies that all library-level objects
+(Counter 0 data) associated with the library unit are to be accessed
+and updated using universal addressing (24-bit addresses for AAMP5)
+rather than the default of 16-bit Data Environment (DENV) addressing.
+Use of this pragma will generally result in less efficient code for
+references to global data associated with the library unit, but
+allows such data to be located anywhere in memory. This pragma is
+a library unit pragma, but can also be used as a configuration pragma
+(including use in the @file{gnat.adc} file). The functionality
+of this pragma is also available by applying the -univ switch on the
+compilations of units where universal addressing of the data is desired.
+
+@node Pragma Unmodified
+@unnumberedsec Pragma Unmodified
+@findex Unmodified
+@cindex Warnings, unmodified
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Unmodified (LOCAL_NAME @{, LOCAL_NAME@});
+@end smallexample
+
+@noindent
+This pragma signals that the assignable entities (variables,
+@code{out} parameters, @code{in out} parameters) whose names are listed are
+deliberately not assigned in the current source unit. This
+suppresses warnings about the
+entities being referenced but not assigned, and in addition a warning will be
+generated if one of these entities is in fact assigned in the
+same unit as the pragma (or in the corresponding body, or one
+of its subunits).
+
+This is particularly useful for clearly signaling that a particular
+parameter is not modified, even though the spec suggests that it might
+be.
+
+For the variable case, warnings are never given for unreferenced variables
+whose name contains one of the substrings
+@code{DISCARD, DUMMY, IGNORE, JUNK, UNUSED} in any casing. Such names
+are typically to be used in cases where such warnings are expected.
+Thus it is never necessary to use @code{pragma Unmodified} for such
+variables, though it is harmless to do so.
+
+@node Pragma Unreferenced
+@unnumberedsec Pragma Unreferenced
+@findex Unreferenced
+@cindex Warnings, unreferenced
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Unreferenced (LOCAL_NAME @{, LOCAL_NAME@});
+pragma Unreferenced (library_unit_NAME @{, library_unit_NAME@});
+@end smallexample
+
+@noindent
+This pragma signals that the entities whose names are listed are
+deliberately not referenced in the current source unit. This
+suppresses warnings about the
+entities being unreferenced, and in addition a warning will be
+generated if one of these entities is in fact subsequently referenced in the
+same unit as the pragma (or in the corresponding body, or one
+of its subunits).
+
+This is particularly useful for clearly signaling that a particular
+parameter is not referenced in some particular subprogram implementation
+and that this is deliberate. It can also be useful in the case of
+objects declared only for their initialization or finalization side
+effects.
+
+If @code{LOCAL_NAME} identifies more than one matching homonym in the
+current scope, then the entity most recently declared is the one to which
+the pragma applies. Note that in the case of accept formals, the pragma
+Unreferenced may appear immediately after the keyword @code{do} which
+allows the indication of whether or not accept formals are referenced
+or not to be given individually for each accept statement.
+
+The left hand side of an assignment does not count as a reference for the
+purpose of this pragma. Thus it is fine to assign to an entity for which
+pragma Unreferenced is given.
+
+Note that if a warning is desired for all calls to a given subprogram,
+regardless of whether they occur in the same unit as the subprogram
+declaration, then this pragma should not be used (calls from another
+unit would not be flagged); pragma Obsolescent can be used instead
+for this purpose, see @xref{Pragma Obsolescent}.
+
+The second form of pragma @code{Unreferenced} is used within a context
+clause. In this case the arguments must be unit names of units previously
+mentioned in @code{with} clauses (similar to the usage of pragma
+@code{Elaborate_All}. The effect is to suppress warnings about unreferenced
+units and unreferenced entities within these units.
+
+For the variable case, warnings are never given for unreferenced variables
+whose name contains one of the substrings
+@code{DISCARD, DUMMY, IGNORE, JUNK, UNUSED} in any casing. Such names
+are typically to be used in cases where such warnings are expected.
+Thus it is never necessary to use @code{pragma Unreferenced} for such
+variables, though it is harmless to do so.
+
+@node Pragma Unreferenced_Objects
+@unnumberedsec Pragma Unreferenced_Objects
+@findex Unreferenced_Objects
+@cindex Warnings, unreferenced
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Unreferenced_Objects (local_subtype_NAME @{, local_subtype_NAME@});
+@end smallexample
+
+@noindent
+This pragma signals that for the types or subtypes whose names are
+listed, objects which are declared with one of these types or subtypes may
+not be referenced, and if no references appear, no warnings are given.
+
+This is particularly useful for objects which are declared solely for their
+initialization and finalization effect. Such variables are sometimes referred
+to as RAII variables (Resource Acquisition Is Initialization). Using this
+pragma on the relevant type (most typically a limited controlled type), the
+compiler will automatically suppress unwanted warnings about these variables
+not being referenced.
+
+@node Pragma Unreserve_All_Interrupts
+@unnumberedsec Pragma Unreserve_All_Interrupts
+@findex Unreserve_All_Interrupts
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Unreserve_All_Interrupts;
+@end smallexample
+
+@noindent
+Normally certain interrupts are reserved to the implementation. Any attempt
+to attach an interrupt causes Program_Error to be raised, as described in
+RM C.3.2(22). A typical example is the @code{SIGINT} interrupt used in
+many systems for a @kbd{Ctrl-C} interrupt. Normally this interrupt is
+reserved to the implementation, so that @kbd{Ctrl-C} can be used to
+interrupt execution.
+
+If the pragma @code{Unreserve_All_Interrupts} appears anywhere in any unit in
+a program, then all such interrupts are unreserved. This allows the
+program to handle these interrupts, but disables their standard
+functions. For example, if this pragma is used, then pressing
+@kbd{Ctrl-C} will not automatically interrupt execution. However,
+a program can then handle the @code{SIGINT} interrupt as it chooses.
+
+For a full list of the interrupts handled in a specific implementation,
+see the source code for the spec of @code{Ada.Interrupts.Names} in
+file @file{a-intnam.ads}. This is a target dependent file that contains the
+list of interrupts recognized for a given target. The documentation in
+this file also specifies what interrupts are affected by the use of
+the @code{Unreserve_All_Interrupts} pragma.
+
+For a more general facility for controlling what interrupts can be
+handled, see pragma @code{Interrupt_State}, which subsumes the functionality
+of the @code{Unreserve_All_Interrupts} pragma.
+
+@node Pragma Unsuppress
+@unnumberedsec Pragma Unsuppress
+@findex Unsuppress
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Unsuppress (IDENTIFIER [, [On =>] NAME]);
+@end smallexample
+
+@noindent
+This pragma undoes the effect of a previous pragma @code{Suppress}. If
+there is no corresponding pragma @code{Suppress} in effect, it has no
+effect. The range of the effect is the same as for pragma
+@code{Suppress}. The meaning of the arguments is identical to that used
+in pragma @code{Suppress}.
+
+One important application is to ensure that checks are on in cases where
+code depends on the checks for its correct functioning, so that the code
+will compile correctly even if the compiler switches are set to suppress
+checks.
+
+This pragma is standard in Ada 2005. It is available in all earlier versions
+of Ada as an implementation-defined pragma.
+
+Note that in addition to the checks defined in the Ada RM, GNAT recogizes
+a number of implementation-defined check names. See description of pragma
+@code{Suppress} for full details.
+
+@node Pragma Use_VADS_Size
+@unnumberedsec Pragma Use_VADS_Size
+@cindex @code{Size}, VADS compatibility
+@cindex Rational profile
+@findex Use_VADS_Size
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Use_VADS_Size;
+@end smallexample
+
+@noindent
+This is a configuration pragma. In a unit to which it applies, any use
+of the 'Size attribute is automatically interpreted as a use of the
+'VADS_Size attribute. Note that this may result in incorrect semantic
+processing of valid Ada 95 or Ada 2005 programs. This is intended to aid in
+the handling of existing code which depends on the interpretation of Size
+as implemented in the VADS compiler. See description of the VADS_Size
+attribute for further details.
+
+@node Pragma Validity_Checks
+@unnumberedsec Pragma Validity_Checks
+@findex Validity_Checks
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Validity_Checks (string_LITERAL | ALL_CHECKS | On | Off);
+@end smallexample
+
+@noindent
+This pragma is used in conjunction with compiler switches to control the
+built-in validity checking provided by GNAT@. The compiler switches, if set
+provide an initial setting for the switches, and this pragma may be used
+to modify these settings, or the settings may be provided entirely by
+the use of the pragma. This pragma can be used anywhere that a pragma
+is legal, including use as a configuration pragma (including use in
+the @file{gnat.adc} file).
+
+The form with a string literal specifies which validity options are to be
+activated. The validity checks are first set to include only the default
+reference manual settings, and then a string of letters in the string
+specifies the exact set of options required. The form of this string
+is exactly as described for the @option{-gnatVx} compiler switch (see the
+@value{EDITION} User's Guide for details). For example the following two
+methods can be used to enable validity checking for mode @code{in} and
+@code{in out} subprogram parameters:
+
+@itemize @bullet
+@item
+@smallexample @c ada
+pragma Validity_Checks ("im");
+@end smallexample
+
+@item
+@smallexample
+gcc -c -gnatVim @dots{}
+@end smallexample
+@end itemize
+
+@noindent
+The form ALL_CHECKS activates all standard checks (its use is equivalent
+to the use of the @code{gnatva} switch.
+
+The forms with @code{Off} and @code{On}
+can be used to temporarily disable validity checks
+as shown in the following example:
+
+@smallexample @c ada
+@iftex
+@leftskip=0cm
+@end iftex
+pragma Validity_Checks ("c"); -- validity checks for copies
+pragma Validity_Checks (Off); -- turn off validity checks
+A := B; -- B will not be validity checked
+pragma Validity_Checks (On); -- turn validity checks back on
+A := C; -- C will be validity checked
+@end smallexample
+
+@node Pragma Volatile
+@unnumberedsec Pragma Volatile
+@findex Volatile
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Volatile (LOCAL_NAME);
+@end smallexample
+
+@noindent
+This pragma is defined by the Ada Reference Manual, and the GNAT
+implementation is fully conformant with this definition. The reason it
+is mentioned in this section is that a pragma of the same name was supplied
+in some Ada 83 compilers, including DEC Ada 83. The Ada 95 / Ada 2005
+implementation of pragma Volatile is upwards compatible with the
+implementation in DEC Ada 83.
+
+@node Pragma Warning_As_Error
+@unnumberedsec Pragma Warning_As_Error
+@findex Warning_As_Error
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Warning_As_Error (static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+This configuration pragma allows the programmer to specify a set
+of warnings that will be treated as errors. Any warning which
+matches the pattern given by the pragma argument will be treated
+as an error. This gives much more precise control that -gnatwe
+which treats all warnings as errors.
+
+The pattern may contain asterisks, which match zero or more characters in
+the message. For example, you can use
+@code{pragma Warning_As_Error ("*bits of*unused")} to treat the warning
+message @code{warning: 960 bits of "a" unused} as an error. No other regular
+expression notations are permitted. All characters other than asterisk in
+these three specific cases are treated as literal characters in the match.
+The match is case insensitive, for example XYZ matches xyz.
+
+Another possibility for the static_string_EXPRESSION which works whether
+or not error tags are enabled (@option{-gnatw.d}) is to use the
+@option{-gnatw} tag string, enclosed in brackets,
+as shown in the example below, to treat a class of warnings as errors.
+
+The above use of patterns to match the message applies only to warning
+messages generated by the front end. This pragma can also be applied to
+warnings provided by the back end and mentioned in @ref{Pragma Warnings}.
+By using a single full @option{-Wxxx} switch in the pragma, such warnings
+can also be treated as errors.
+
+The pragma can appear either in a global configuration pragma file
+(e.g. @file{gnat.adc}), or at the start of a file. Given a global
+configuration pragma file containing:
+
+@smallexample @c ada
+pragma Warning_As_Error ("[-gnatwj]");
+@end smallexample
+
+@noindent
+which will treat all obsolescent feature warnings as errors, the
+following program compiles as shown (compile options here are
+@option{-gnatwa.d -gnatl -gnatj55}).
+
+@smallexample @c ada
+ 1. pragma Warning_As_Error ("*never assigned*");
+ 2. function Warnerr return String is
+ 3. X : Integer;
+ |
+ >>> error: variable "X" is never read and
+ never assigned [-gnatwv] [warning-as-error]
+
+ 4. Y : Integer;
+ |
+ >>> warning: variable "Y" is assigned but
+ never read [-gnatwu]
+
+ 5. begin
+ 6. Y := 0;
+ 7. return %ABC%;
+ |
+ >>> error: use of "%" is an obsolescent
+ feature (RM J.2(4)), use """ instead
+ [-gnatwj] [warning-as-error]
+
+ 8. end;
+
+ 8 lines: No errors, 3 warnings (2 treated as errors)
+@end smallexample
+
+@noindent
+Note that this pragma does not affect the set of warnings issued in
+any way, it merely changes the effect of a matching warning if one
+is produced as a result of other warnings options. As shown in this
+example, if the pragma results in a warning being treated as an error,
+the tag is changed from "warning:" to "error:" and the string
+"[warning-as-error]" is appended to the end of the message.
+
+@node Pragma Warnings
+@unnumberedsec Pragma Warnings
+@findex Warnings
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Warnings (On | Off [,REASON]);
+pragma Warnings (On | Off, LOCAL_NAME [,REASON]);
+pragma Warnings (static_string_EXPRESSION [,REASON]);
+pragma Warnings (On | Off, static_string_EXPRESSION [,REASON]);
+
+REASON ::= Reason => STRING_LITERAL @{& STRING_LITERAL@}
+@end smallexample
+
+@noindent
+Normally warnings are enabled, with the output being controlled by
+the command line switch. Warnings (@code{Off}) turns off generation of
+warnings until a Warnings (@code{On}) is encountered or the end of the
+current unit. If generation of warnings is turned off using this
+pragma, then some or all of the warning messages are suppressed,
+regardless of the setting of the command line switches.
+
+The @code{Reason} parameter may optionally appear as the last argument
+in any of the forms of this pragma. It is intended purely for the
+purposes of documenting the reason for the @code{Warnings} pragma.
+The compiler will check that the argument is a static string but
+otherwise ignore this argument. Other tools may provide specialized
+processing for this string.
+
+The form with a single argument (or two arguments if Reason present),
+where the first argument is @code{ON} or @code{OFF}
+may be used as a configuration pragma.
+
+If the @var{LOCAL_NAME} parameter is present, warnings are suppressed for
+the specified entity. This suppression is effective from the point where
+it occurs till the end of the extended scope of the variable (similar to
+the scope of @code{Suppress}). This form cannot be used as a configuration
+pragma.
+
+The form with a single static_string_EXPRESSION argument (and possible
+reason) provides more precise
+control over which warnings are active. The string is a list of letters
+specifying which warnings are to be activated and which deactivated. The
+code for these letters is the same as the string used in the command
+line switch controlling warnings. For a brief summary, use the gnatmake
+command with no arguments, which will generate usage information containing
+the list of warnings switches supported. For
+full details see @ref{Warning Message Control,,, gnat_ugn, @value{EDITION}
+User's Guide}. This form can also be used as a configuration pragma.
+
+@noindent
+The warnings controlled by the @option{-gnatw} switch are generated by the
+front end of the compiler. The GCC back end can provide additional warnings
+and they are controlled by the @option{-W} switch. Such warnings can be
+identified by the appearance of a string of the form @code{[-Wxxx]} in the
+message which designates the @option{-Wxxx} switch that controls the message.
+The form with a single static_string_EXPRESSION argument also works for these
+warnings, but the string must be a single full @option{-Wxxx} switch in this
+case. The above reference lists a few examples of these additional warnings.
+
+@noindent
+The specified warnings will be in effect until the end of the program
+or another pragma Warnings is encountered. The effect of the pragma is
+cumulative. Initially the set of warnings is the standard default set
+as possibly modified by compiler switches. Then each pragma Warning
+modifies this set of warnings as specified. This form of the pragma may
+also be used as a configuration pragma.
+
+The fourth form, with an @code{On|Off} parameter and a string, is used to
+control individual messages, based on their text. The string argument
+is a pattern that is used to match against the text of individual
+warning messages (not including the initial "warning: " tag).
+
+The pattern may contain asterisks, which match zero or more characters in
+the message. For example, you can use
+@code{pragma Warnings (Off, "*bits of*unused")} to suppress the warning
+message @code{warning: 960 bits of "a" unused}. No other regular
+expression notations are permitted. All characters other than asterisk in
+these three specific cases are treated as literal characters in the match.
+The match is case insensitive, for example XYZ matches xyz.
+
+The above use of patterns to match the message applies only to warning
+messages generated by the front end. This form of the pragma with a string
+argument can also be used to control warnings provided by the back end and
+mentioned above. By using a single full @option{-Wxxx} switch in the pragma,
+such warnings can be turned on and off.
+
+There are two ways to use the pragma in this form. The OFF form can be used as a
+configuration pragma. The effect is to suppress all warnings (if any)
+that match the pattern string throughout the compilation (or match the
+-W switch in the back end case).
+
+The second usage is to suppress a warning locally, and in this case, two
+pragmas must appear in sequence:
+
+@smallexample @c ada
+pragma Warnings (Off, Pattern);
+@dots{} code where given warning is to be suppressed
+pragma Warnings (On, Pattern);
+@end smallexample
+
+@noindent
+In this usage, the pattern string must match in the Off and On pragmas,
+and at least one matching warning must be suppressed.
+
+Note: to write a string that will match any warning, use the string
+@code{"***"}. It will not work to use a single asterisk or two asterisks
+since this looks like an operator name. This form with three asterisks
+is similar in effect to specifying @code{pragma Warnings (Off)} except that a
+matching @code{pragma Warnings (On, "***")} will be required. This can be
+helpful in avoiding forgetting to turn warnings back on.
+
+Note: the debug flag -gnatd.i (@code{/NOWARNINGS_PRAGMAS} in VMS) can be
+used to cause the compiler to entirely ignore all WARNINGS pragmas. This can
+be useful in checking whether obsolete pragmas in existing programs are hiding
+real problems.
+
+Note: pragma Warnings does not affect the processing of style messages. See
+separate entry for pragma Style_Checks for control of style messages.
+
+@node Pragma Weak_External
+@unnumberedsec Pragma Weak_External
+@findex Weak_External
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Weak_External ([Entity =>] LOCAL_NAME);
+@end smallexample
+
+@noindent
+@var{LOCAL_NAME} must refer to an object that is declared at the library
+level. This pragma specifies that the given entity should be marked as a
+weak symbol for the linker. It is equivalent to @code{__attribute__((weak))}
+in GNU C and causes @var{LOCAL_NAME} to be emitted as a weak symbol instead
+of a regular symbol, that is to say a symbol that does not have to be
+resolved by the linker if used in conjunction with a pragma Import.
+
+When a weak symbol is not resolved by the linker, its address is set to
+zero. This is useful in writing interfaces to external modules that may
+or may not be linked in the final executable, for example depending on
+configuration settings.
+
+If a program references at run time an entity to which this pragma has been
+applied, and the corresponding symbol was not resolved at link time, then
+the execution of the program is erroneous. It is not erroneous to take the
+Address of such an entity, for example to guard potential references,
+as shown in the example below.
+
+Some file formats do not support weak symbols so not all target machines
+support this pragma.
+
+@smallexample @c ada
+-- Example of the use of pragma Weak_External
+
+package External_Module is
+ key : Integer;
+ pragma Import (C, key);
+ pragma Weak_External (key);
+ function Present return boolean;
+end External_Module;
+
+with System; use System;
+package body External_Module is
+ function Present return boolean is
+ begin
+ return key'Address /= System.Null_Address;
+ end Present;
+end External_Module;
+@end smallexample
+
+@node Pragma Wide_Character_Encoding
+@unnumberedsec Pragma Wide_Character_Encoding
+@findex Wide_Character_Encoding
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Wide_Character_Encoding (IDENTIFIER | CHARACTER_LITERAL);
+@end smallexample
+
+@noindent
+This pragma specifies the wide character encoding to be used in program
+source text appearing subsequently. It is a configuration pragma, but may
+also be used at any point that a pragma is allowed, and it is permissible
+to have more than one such pragma in a file, allowing multiple encodings
+to appear within the same file.
+
+The argument can be an identifier or a character literal. In the identifier
+case, it is one of @code{HEX}, @code{UPPER}, @code{SHIFT_JIS},
+@code{EUC}, @code{UTF8}, or @code{BRACKETS}. In the character literal
+case it is correspondingly one of the characters @samp{h}, @samp{u},
+@samp{s}, @samp{e}, @samp{8}, or @samp{b}.
+
+Note that when the pragma is used within a file, it affects only the
+encoding within that file, and does not affect withed units, specs,
+or subunits.
+
+@node Implementation Defined Aspects
+@chapter Implementation Defined Aspects
+Ada defines (throughout the Ada 2012 reference manual, summarized
+in Annex K) a set of aspects that can be specified for certain entities.
+These language defined aspects are implemented in GNAT in Ada 2012 mode
+and work as described in the Ada 2012 Reference Manual.
+
+In addition, Ada 2012 allows implementations to define additional aspects
+whose meaning is defined by the implementation. GNAT provides
+a number of these implementation-defined aspects which can be used
+to extend and enhance the functionality of the compiler. This section of
+the GNAT reference manual describes these additional aspects.
+
+Note that any program using these aspects may not be portable to
+other compilers (although GNAT implements this set of aspects on all
+platforms). Therefore if portability to other compilers is an important
+consideration, you should minimize the use of these aspects.
+
+Note that for many of these aspects, the effect is essentially similar
+to the use of a pragma or attribute specification with the same name
+applied to the entity. For example, if we write:
+
+@smallexample @c ada
+type R is range 1 .. 100
+ with Value_Size => 10;
+@end smallexample
+
+@noindent
+then the effect is the same as:
+
+@smallexample @c ada
+type R is range 1 .. 100;
+for R'Value_Size use 10;
+@end smallexample
+
+@noindent
+and if we write:
+
+@smallexample @c ada
+type R is new Integer
+ with Shared => True;
+@end smallexample
+
+@noindent
+then the effect is the same as:
+
+@smallexample @c ada
+type R is new Integer;
+pragma Shared (R);
+@end smallexample
+
+@noindent
+In the documentation below, such cases are simply marked
+as being equivalent to the corresponding pragma or attribute definition
+clause.
+
+@menu
+* Aspect Abstract_State::
+* Aspect Contract_Cases::
+* Aspect Depends::
+* Aspect Dimension::
+* Aspect Dimension_System::
+* Aspect Favor_Top_Level::
+* Aspect Global::
+* Aspect Initial_Condition::
+* Aspect Initializes::
+* Aspect Inline_Always::
+* Aspect Invariant::
+* Aspect Linker_Section::
+* Aspect Lock_Free::
+* Aspect Object_Size::
+* Aspect Persistent_BSS::
+* Aspect Predicate::
+* Aspect Preelaborate_05::
+* Aspect Pure_05::
+* Aspect Pure_12::
+* Aspect Pure_Function::
+* Aspect Refined_State::
+* Aspect Remote_Access_Type::
+* Aspect Scalar_Storage_Order::
+* Aspect Shared::
+* Aspect Simple_Storage_Pool::
+* Aspect Simple_Storage_Pool_Type::
+* Aspect SPARK_Mode::
+* Aspect Suppress_Debug_Info::
+* Aspect Test_Case::
+* Aspect Universal_Aliasing::
+* Aspect Universal_Data::
+* Aspect Unmodified::
+* Aspect Unreferenced::
+* Aspect Unreferenced_Objects::
+* Aspect Value_Size::
+* Aspect Warnings::
+@end menu
+
+@node Aspect Abstract_State
+@unnumberedsec Aspect Abstract_State
+@findex Abstract_State
+@noindent
+This aspect is equivalent to pragma @code{Abstract_State}.
+
+@node Aspect Contract_Cases
+@unnumberedsec Aspect Contract_Cases
+@findex Contract_Cases
+@noindent
+This aspect is equivalent to pragma @code{Contract_Cases}, the sequence
+of clauses being enclosed in parentheses so that syntactically it is an
+aggregate.
+
+@node Aspect Depends
+@unnumberedsec Aspect Depends
+@findex Depends
+@noindent
+This aspect is equivalent to pragma @code{Depends}.
+
+@node Aspect Dimension
+@unnumberedsec Aspect Dimension
+@findex Dimension
+@noindent
+The @code{Dimension} aspect is used to specify the dimensions of a given
+subtype of a dimensioned numeric type. The aspect also specifies a symbol
+used when doing formatted output of dimensioned quantities. The syntax is:
+
+@smallexample @c ada
+with Dimension =>
+ ([Symbol =>] SYMBOL, DIMENSION_VALUE @{, DIMENSION_Value@})
+
+SYMBOL ::= STRING_LITERAL | CHARACTER_LITERAL
+
+DIMENSION_VALUE ::=
+ RATIONAL
+| others => RATIONAL
+| DISCRETE_CHOICE_LIST => RATIONAL
+
+RATIONAL ::= [-] NUMERIC_LITERAL [/ NUMERIC_LITERAL]
+@end smallexample
+
+@noindent
+This aspect can only be applied to a subtype whose parent type has
+a @code{Dimension_Systen} aspect. The aspect must specify values for
+all dimensions of the system. The rational values are the powers of the
+corresponding dimensions that are used by the compiler to verify that
+physical (numeric) computations are dimensionally consistent. For example,
+the computation of a force must result in dimensions (L => 1, M => 1, T => -2).
+For further examples of the usage
+of this aspect, see package @code{System.Dim.Mks}.
+Note that when the dimensioned type is an integer type, then any
+dimension value must be an integer literal.
+
+@node Aspect Dimension_System
+@unnumberedsec Aspect Dimension_System
+@findex Dimension_System
+@noindent
+The @code{Dimension_System} aspect is used to define a system of
+dimensions that will be used in subsequent subtype declarations with
+@code{Dimension} aspects that reference this system. The syntax is:
+
+@smallexample @c ada
+with Dimension_System => (DIMENSION @{, DIMENSION@});
+
+DIMENSION ::= ([Unit_Name =>] IDENTIFIER,
+ [Unit_Symbol =>] SYMBOL,
+ [Dim_Symbol =>] SYMBOL)
+
+SYMBOL ::= CHARACTER_LITERAL | STRING_LITERAL
+@end smallexample
+
+@noindent
+This aspect is applied to a type, which must be a numeric derived type
+(typically a floating-point type), that
+will represent values within the dimension system. Each @code{DIMENSION}
+corresponds to one particular dimension. A maximum of 7 dimensions may
+be specified. @code{Unit_Name} is the name of the dimension (for example
+@code{Meter}). @code{Unit_Symbol} is the shorthand used for quantities
+of this dimension (for example @code{m} for @code{Meter}).
+@code{Dim_Symbol} gives
+the identification within the dimension system (typically this is a
+single letter, e.g. @code{L} standing for length for unit name @code{Meter}).
+The @code{Unit_Symbol} is used in formatted output of dimensioned quantities.
+The @code{Dim_Symbol} is used in error messages when numeric operations have
+inconsistent dimensions.
+
+GNAT provides the standard definition of the International MKS system in
+the run-time package @code{System.Dim.Mks}. You can easily define
+similar packages for cgs units or British units, and define conversion factors
+between values in different systems. The MKS system is characterized by the
+following aspect:
+
+@smallexample @c ada
+ type Mks_Type is new Long_Long_Float
+ with
+ Dimension_System => (
+ (Unit_Name => Meter, Unit_Symbol => 'm', Dim_Symbol => 'L'),
+ (Unit_Name => Kilogram, Unit_Symbol => "kg", Dim_Symbol => 'M'),
+ (Unit_Name => Second, Unit_Symbol => 's', Dim_Symbol => 'T'),
+ (Unit_Name => Ampere, Unit_Symbol => 'A', Dim_Symbol => 'I'),
+ (Unit_Name => Kelvin, Unit_Symbol => 'K', Dim_Symbol => "Theta"),
+ (Unit_Name => Mole, Unit_Symbol => "mol", Dim_Symbol => 'N'),
+ (Unit_Name => Candela, Unit_Symbol => "cd", Dim_Symbol => 'J'));
+@end smallexample
+
+@noindent
+See section ``Performing Dimensionality Analysis in GNAT'' in the GNAT Users
+Guide for detailed examples of use of the dimension system.
+
+@node Aspect Favor_Top_Level
+@unnumberedsec Aspect Favor_Top_Level
+@findex Favor_Top_Level
+@noindent
+This aspect is equivalent to pragma @code{Favor_Top_Level}.
+
+@node Aspect Global
+@unnumberedsec Aspect Global
+@findex Global
+@noindent
+This aspect is equivalent to pragma @code{Global}.
+
+@node Aspect Initial_Condition
+@unnumberedsec Aspect Initial_Condition
+@findex Initial_Condition
+@noindent
+This aspect is equivalent to pragma @code{Initial_Condition}.
+
+@node Aspect Initializes
+@unnumberedsec Aspect Initializes
+@findex Initializes
+@noindent
+This aspect is equivalent to pragma @code{Initializes}.
+
+@node Aspect Inline_Always
+@unnumberedsec Aspect Inline_Always
+@findex Inline_Always
+@noindent
+This aspect is equivalent to pragma @code{Inline_Always}.
+
+@node Aspect Invariant
+@unnumberedsec Aspect Invariant
+@findex Invariant
+@noindent
+This aspect is equivalent to pragma @code{Invariant}. It is a
+synonym for the language defined aspect @code{Type_Invariant} except
+that it is separately controllable using pragma @code{Assertion_Policy}.
+
+@node Aspect Linker_Section
+@unnumberedsec Aspect Linker_Section
+@findex Linker_Section
+@noindent
+This aspect is equivalent to an @code{Linker_Section} pragma.
+
+@node Aspect Lock_Free
+@unnumberedsec Aspect Lock_Free
+@findex Lock_Free
+@noindent
+This aspect is equivalent to pragma @code{Lock_Free}.
+
+@node Aspect Object_Size
+@unnumberedsec Aspect Object_Size
+@findex Object_Size
+@noindent
+This aspect is equivalent to an @code{Object_Size} attribute definition
+clause.
+
+@node Aspect Persistent_BSS
+@unnumberedsec Aspect Persistent_BSS
+@findex Persistent_BSS
+@noindent
+This aspect is equivalent to pragma @code{Persistent_BSS}.
+
+@node Aspect Predicate
+@unnumberedsec Aspect Predicate
+@findex Predicate
+@noindent
+This aspect is equivalent to pragma @code{Predicate}. It is thus
+similar to the language defined aspects @code{Dynamic_Predicate}
+and @code{Static_Predicate} except that whether the resulting
+predicate is static or dynamic is controlled by the form of the
+expression. It is also separately controllable using pragma
+@code{Assertion_Policy}.
+
+@node Aspect Preelaborate_05
+@unnumberedsec Aspect Preelaborate_05
+@findex Preelaborate_05
+@noindent
+This aspect is equivalent to pragma @code{Preelaborate_05}.
+
+@node Aspect Pure_05
+@unnumberedsec Aspect Pure_05
+@findex Pure_05
+@noindent
+This aspect is equivalent to pragma @code{Pure_05}.
+
+@node Aspect Pure_12
+@unnumberedsec Aspect Pure_12
+@findex Pure_12
+@noindent
+This aspect is equivalent to pragma @code{Pure_12}.
+
+@node Aspect Pure_Function
+@unnumberedsec Aspect Pure_Function
+@findex Pure_Function
+@noindent
+This aspect is equivalent to pragma @code{Pure_Function}.
+
+@node Aspect Refined_State
+@unnumberedsec Aspect Refined_State
+@findex Refined_State
+@noindent
+This aspect is equivalent to pragma @code{Refined_State}.
+
+@node Aspect Remote_Access_Type
+@unnumberedsec Aspect Remote_Access_Type
+@findex Remote_Access_Type
+@noindent
+This aspect is equivalent to pragma @code{Remote_Access_Type}.
+
+@node Aspect Scalar_Storage_Order
+@unnumberedsec Aspect Scalar_Storage_Order
+@findex Scalar_Storage_Order
+@noindent
+This aspect is equivalent to a @code{Scalar_Storage_Order}
+attribute definition clause.
+
+@node Aspect Shared
+@unnumberedsec Aspect Shared
+@findex Shared
+@noindent
+This aspect is equivalent to pragma @code{Shared}, and is thus a synonym
+for aspect @code{Atomic}.
+
+@node Aspect Simple_Storage_Pool
+@unnumberedsec Aspect Simple_Storage_Pool
+@findex Simple_Storage_Pool
+@noindent
+This aspect is equivalent to a @code{Simple_Storage_Pool}
+attribute definition clause.
+
+@node Aspect Simple_Storage_Pool_Type
+@unnumberedsec Aspect Simple_Storage_Pool_Type
+@findex Simple_Storage_Pool_Type
+@noindent
+This aspect is equivalent to pragma @code{Simple_Storage_Pool_Type}.
+
+@node Aspect SPARK_Mode
+@unnumberedsec Aspect SPARK_Mode
+@findex SPARK_Mode
+@noindent
+This aspect is equivalent to pragma @code{SPARK_Mode} and
+may be specified for either or both of the specification and body
+of a subprogram or package.
+
+@node Aspect Suppress_Debug_Info
+@unnumberedsec Aspect Suppress_Debug_Info
+@findex Suppress_Debug_Info
+@noindent
+This aspect is equivalent to pragma @code{Suppress_Debug_Info}.
+
+@node Aspect Test_Case
+@unnumberedsec Aspect Test_Case
+@findex Test_Case
+@noindent
+This aspect is equivalent to pragma @code{Test_Case}.
+
+@node Aspect Universal_Aliasing
+@unnumberedsec Aspect Universal_Aliasing
+@findex Universal_Aliasing
+@noindent
+This aspect is equivalent to pragma @code{Universal_Aliasing}.
+
+@node Aspect Universal_Data
+@unnumberedsec Aspect Universal_Data
+@findex Universal_Data
+@noindent
+This aspect is equivalent to pragma @code{Universal_Data}.
+
+@node Aspect Unmodified
+@unnumberedsec Aspect Unmodified
+@findex Unmodified
+@noindent
+This aspect is equivalent to pragma @code{Unmodified}.
+
+@node Aspect Unreferenced
+@unnumberedsec Aspect Unreferenced
+@findex Unreferenced
+@noindent
+This aspect is equivalent to pragma @code{Unreferenced}.
+
+@node Aspect Unreferenced_Objects
+@unnumberedsec Aspect Unreferenced_Objects
+@findex Unreferenced_Objects
+@noindent
+This aspect is equivalent to pragma @code{Unreferenced_Objects}.
+
+@node Aspect Value_Size
+@unnumberedsec Aspect Value_Size
+@findex Value_Size
+@noindent
+This aspect is equivalent to a @code{Value_Size}
+attribute definition clause.
+
+@node Aspect Warnings
+@unnumberedsec Aspect Warnings
+@findex Warnings
+@noindent
+This aspect is equivalent to the two argument form of pragma @code{Warnings},
+where the first argument is @code{ON} or @code{OFF} and the second argument
+is the entity.
+
+
+@node Implementation Defined Attributes
+@chapter Implementation Defined Attributes
+Ada defines (throughout the Ada reference manual,
+summarized in Annex K),
+a set of attributes that provide useful additional functionality in all
+areas of the language. These language defined attributes are implemented
+in GNAT and work as described in the Ada Reference Manual.
+
+In addition, Ada allows implementations to define additional
+attributes whose meaning is defined by the implementation. GNAT provides
+a number of these implementation-dependent attributes which can be used
+to extend and enhance the functionality of the compiler. This section of
+the GNAT reference manual describes these additional attributes.
+
+Note that any program using these attributes may not be portable to
+other compilers (although GNAT implements this set of attributes on all
+platforms). Therefore if portability to other compilers is an important
+consideration, you should minimize the use of these attributes.
+
+@menu
+* Attribute Abort_Signal::
+* Attribute Address_Size::
+* Attribute Asm_Input::
+* Attribute Asm_Output::
+* Attribute AST_Entry::
+* Attribute Bit::
+* Attribute Bit_Position::
+* Attribute Compiler_Version::
+* Attribute Code_Address::
+* Attribute Default_Bit_Order::
+* Attribute Descriptor_Size::
+* Attribute Elaborated::
+* Attribute Elab_Body::
+* Attribute Elab_Spec::
+* Attribute Elab_Subp_Body::
+* Attribute Emax::
+* Attribute Enabled::
+* Attribute Enum_Rep::
+* Attribute Enum_Val::
+* Attribute Epsilon::
+* Attribute Fixed_Value::
+* Attribute Has_Access_Values::
+* Attribute Has_Discriminants::
+* Attribute Img::
+* Attribute Integer_Value::
+* Attribute Invalid_Value::
+* Attribute Large::
+* Attribute Library_Level::
+* Attribute Loop_Entry::
+* Attribute Machine_Size::
+* Attribute Mantissa::
+* Attribute Max_Interrupt_Priority::
+* Attribute Max_Priority::
+* Attribute Maximum_Alignment::
+* Attribute Mechanism_Code::
+* Attribute Null_Parameter::
+* Attribute Object_Size::
+* Attribute Passed_By_Reference::
+* Attribute Pool_Address::
+* Attribute Range_Length::
+* Attribute Ref::
+* Attribute Restriction_Set::
+* Attribute Result::
+* Attribute Safe_Emax::
+* Attribute Safe_Large::
+* Attribute Scalar_Storage_Order::
+* Attribute Simple_Storage_Pool::
+* Attribute Small::
+* Attribute Storage_Unit::
+* Attribute Stub_Type::
+* Attribute System_Allocator_Alignment::
+* Attribute Target_Name::
+* Attribute Tick::
+* Attribute To_Address::
+* Attribute Type_Class::
+* Attribute UET_Address::
+* Attribute Unconstrained_Array::
+* Attribute Universal_Literal_String::
+* Attribute Unrestricted_Access::
+* Attribute Update::
+* Attribute Valid_Scalars::
+* Attribute VADS_Size::
+* Attribute Value_Size::
+* Attribute Wchar_T_Size::
+* Attribute Word_Size::
+@end menu
+
+@node Attribute Abort_Signal
+@unnumberedsec Attribute Abort_Signal
+@findex Abort_Signal
+@noindent
+@code{Standard'Abort_Signal} (@code{Standard} is the only allowed
+prefix) provides the entity for the special exception used to signal
+task abort or asynchronous transfer of control. Normally this attribute
+should only be used in the tasking runtime (it is highly peculiar, and
+completely outside the normal semantics of Ada, for a user program to
+intercept the abort exception).
+
+@node Attribute Address_Size
+@unnumberedsec Attribute Address_Size
+@cindex Size of @code{Address}
+@findex Address_Size
+@noindent
+@code{Standard'Address_Size} (@code{Standard} is the only allowed
+prefix) is a static constant giving the number of bits in an
+@code{Address}. It is the same value as System.Address'Size,
+but has the advantage of being static, while a direct
+reference to System.Address'Size is non-static because Address
+is a private type.
+
+@node Attribute Asm_Input
+@unnumberedsec Attribute Asm_Input
+@findex Asm_Input
+@noindent
+The @code{Asm_Input} attribute denotes a function that takes two
+parameters. The first is a string, the second is an expression of the
+type designated by the prefix. The first (string) argument is required
+to be a static expression, and is the constraint for the parameter,
+(e.g.@: what kind of register is required). The second argument is the
+value to be used as the input argument. The possible values for the
+constant are the same as those used in the RTL, and are dependent on
+the configuration file used to built the GCC back end.
+@ref{Machine Code Insertions}
+
+@node Attribute Asm_Output
+@unnumberedsec Attribute Asm_Output
+@findex Asm_Output
+@noindent
+The @code{Asm_Output} attribute denotes a function that takes two
+parameters. The first is a string, the second is the name of a variable
+of the type designated by the attribute prefix. The first (string)
+argument is required to be a static expression and designates the
+constraint for the parameter (e.g.@: what kind of register is
+required). The second argument is the variable to be updated with the
+result. The possible values for constraint are the same as those used in
+the RTL, and are dependent on the configuration file used to build the
+GCC back end. If there are no output operands, then this argument may
+either be omitted, or explicitly given as @code{No_Output_Operands}.
+@ref{Machine Code Insertions}
+
+@node Attribute AST_Entry
+@unnumberedsec Attribute AST_Entry
+@cindex OpenVMS
+@findex AST_Entry
+@noindent
+This attribute is implemented only in OpenVMS versions of GNAT@. Applied to
+the name of an entry, it yields a value of the predefined type AST_Handler
+(declared in the predefined package System, as extended by the use of
+pragma @code{Extend_System (Aux_DEC)}). This value enables the given entry to
+be called when an AST occurs. For further details, refer to the @cite{DEC Ada
+Language Reference Manual}, section 9.12a.
+
+@node Attribute Bit
+@unnumberedsec Attribute Bit
+@findex Bit
+@code{@var{obj}'Bit}, where @var{obj} is any object, yields the bit
+offset within the storage unit (byte) that contains the first bit of
+storage allocated for the object. The value of this attribute is of the
+type @code{Universal_Integer}, and is always a non-negative number not
+exceeding the value of @code{System.Storage_Unit}.
+
+For an object that is a variable or a constant allocated in a register,
+the value is zero. (The use of this attribute does not force the
+allocation of a variable to memory).
+
+For an object that is a formal parameter, this attribute applies
+to either the matching actual parameter or to a copy of the
+matching actual parameter.
+
+For an access object the value is zero. Note that
+@code{@var{obj}.all'Bit} is subject to an @code{Access_Check} for the
+designated object. Similarly for a record component
+@code{@var{X}.@var{C}'Bit} is subject to a discriminant check and
+@code{@var{X}(@var{I}).Bit} and @code{@var{X}(@var{I1}..@var{I2})'Bit}
+are subject to index checks.
+
+This attribute is designed to be compatible with the DEC Ada 83 definition
+and implementation of the @code{Bit} attribute.
+
+@node Attribute Bit_Position
+@unnumberedsec Attribute Bit_Position
+@findex Bit_Position
+@noindent
+@code{@var{R.C}'Bit_Position}, where @var{R} is a record object and C is one
+of the fields of the record type, yields the bit
+offset within the record contains the first bit of
+storage allocated for the object. The value of this attribute is of the
+type @code{Universal_Integer}. The value depends only on the field
+@var{C} and is independent of the alignment of
+the containing record @var{R}.
+
+@node Attribute Compiler_Version
+@unnumberedsec Attribute Compiler_Version
+@findex Compiler_Version
+@noindent
+@code{Standard'Compiler_Version} (@code{Standard} is the only allowed
+prefix) yields a static string identifying the version of the compiler
+being used to compile the unit containing the attribute reference. A
+typical result would be something like "@value{EDITION} @i{version} (20090221)".
+
+@node Attribute Code_Address
+@unnumberedsec Attribute Code_Address
+@findex Code_Address
+@cindex Subprogram address
+@cindex Address of subprogram code
+@noindent
+The @code{'Address}
+attribute may be applied to subprograms in Ada 95 and Ada 2005, but the
+intended effect seems to be to provide
+an address value which can be used to call the subprogram by means of
+an address clause as in the following example:
+
+@smallexample @c ada
+procedure K is @dots{}
+
+procedure L;
+for L'Address use K'Address;
+pragma Import (Ada, L);
+@end smallexample
+
+@noindent
+A call to @code{L} is then expected to result in a call to @code{K}@.
+In Ada 83, where there were no access-to-subprogram values, this was
+a common work-around for getting the effect of an indirect call.
+GNAT implements the above use of @code{Address} and the technique
+illustrated by the example code works correctly.
+
+However, for some purposes, it is useful to have the address of the start
+of the generated code for the subprogram. On some architectures, this is
+not necessarily the same as the @code{Address} value described above.
+For example, the @code{Address} value may reference a subprogram
+descriptor rather than the subprogram itself.
+
+The @code{'Code_Address} attribute, which can only be applied to
+subprogram entities, always returns the address of the start of the
+generated code of the specified subprogram, which may or may not be
+the same value as is returned by the corresponding @code{'Address}
+attribute.
+
+@node Attribute Default_Bit_Order
+@unnumberedsec Attribute Default_Bit_Order
+@cindex Big endian
+@cindex Little endian
+@findex Default_Bit_Order
+@noindent
+@code{Standard'Default_Bit_Order} (@code{Standard} is the only
+permissible prefix), provides the value @code{System.Default_Bit_Order}
+as a @code{Pos} value (0 for @code{High_Order_First}, 1 for
+@code{Low_Order_First}). This is used to construct the definition of
+@code{Default_Bit_Order} in package @code{System}.
+
+@node Attribute Descriptor_Size
+@unnumberedsec Attribute Descriptor_Size
+@cindex Descriptor
+@cindex Dope vector
+@findex Descriptor_Size
+@noindent
+Non-static attribute @code{Descriptor_Size} returns the size in bits of the
+descriptor allocated for a type. The result is non-zero only for unconstrained
+array types and the returned value is of type universal integer. In GNAT, an
+array descriptor contains bounds information and is located immediately before
+the first element of the array.
+
+@smallexample @c ada
+type Unconstr_Array is array (Positive range <>) of Boolean;
+Put_Line ("Descriptor size = " & Unconstr_Array'Descriptor_Size'Img);
+@end smallexample
+
+@noindent
+The attribute takes into account any additional padding due to type alignment.
+In the example above, the descriptor contains two values of type
+@code{Positive} representing the low and high bound. Since @code{Positive} has
+a size of 31 bits and an alignment of 4, the descriptor size is @code{2 *
+Positive'Size + 2} or 64 bits.
+
+@node Attribute Elaborated
+@unnumberedsec Attribute Elaborated
+@findex Elaborated
+@noindent
+The prefix of the @code{'Elaborated} attribute must be a unit name. The
+value is a Boolean which indicates whether or not the given unit has been
+elaborated. This attribute is primarily intended for internal use by the
+generated code for dynamic elaboration checking, but it can also be used
+in user programs. The value will always be True once elaboration of all
+units has been completed. An exception is for units which need no
+elaboration, the value is always False for such units.
+
+@node Attribute Elab_Body
+@unnumberedsec Attribute Elab_Body
+@findex Elab_Body
+@noindent
+This attribute can only be applied to a program unit name. It returns
+the entity for the corresponding elaboration procedure for elaborating
+the body of the referenced unit. This is used in the main generated
+elaboration procedure by the binder and is not normally used in any
+other context. However, there may be specialized situations in which it
+is useful to be able to call this elaboration procedure from Ada code,
+e.g.@: if it is necessary to do selective re-elaboration to fix some
+error.
+
+@node Attribute Elab_Spec
+@unnumberedsec Attribute Elab_Spec
+@findex Elab_Spec
+@noindent
+This attribute can only be applied to a program unit name. It returns
+the entity for the corresponding elaboration procedure for elaborating
+the spec of the referenced unit. This is used in the main
+generated elaboration procedure by the binder and is not normally used
+in any other context. However, there may be specialized situations in
+which it is useful to be able to call this elaboration procedure from
+Ada code, e.g.@: if it is necessary to do selective re-elaboration to fix
+some error.
+
+@node Attribute Elab_Subp_Body
+@unnumberedsec Attribute Elab_Subp_Body
+@findex Elab_Subp_Body
+@noindent
+This attribute can only be applied to a library level subprogram
+name and is only allowed in CodePeer mode. It returns the entity
+for the corresponding elaboration procedure for elaborating the body
+of the referenced subprogram unit. This is used in the main generated
+elaboration procedure by the binder in CodePeer mode only and is unrecognized
+otherwise.
+
+@node Attribute Emax
+@unnumberedsec Attribute Emax
+@cindex Ada 83 attributes
+@findex Emax
+@noindent
+The @code{Emax} attribute is provided for compatibility with Ada 83. See
+the Ada 83 reference manual for an exact description of the semantics of
+this attribute.
+
+@node Attribute Enabled
+@unnumberedsec Attribute Enabled
+@findex Enabled
+@noindent
+The @code{Enabled} attribute allows an application program to check at compile
+time to see if the designated check is currently enabled. The prefix is a
+simple identifier, referencing any predefined check name (other than
+@code{All_Checks}) or a check name introduced by pragma Check_Name. If
+no argument is given for the attribute, the check is for the general state
+of the check, if an argument is given, then it is an entity name, and the
+check indicates whether an @code{Suppress} or @code{Unsuppress} has been
+given naming the entity (if not, then the argument is ignored).
+
+Note that instantiations inherit the check status at the point of the
+instantiation, so a useful idiom is to have a library package that
+introduces a check name with @code{pragma Check_Name}, and then contains
+generic packages or subprograms which use the @code{Enabled} attribute
+to see if the check is enabled. A user of this package can then issue
+a @code{pragma Suppress} or @code{pragma Unsuppress} before instantiating
+the package or subprogram, controlling whether the check will be present.
+
+@node Attribute Enum_Rep
+@unnumberedsec Attribute Enum_Rep
+@cindex Representation of enums
+@findex Enum_Rep
+@noindent
+For every enumeration subtype @var{S}, @code{@var{S}'Enum_Rep} denotes a
+function with the following spec:
+
+@smallexample @c ada
+function @var{S}'Enum_Rep (Arg : @var{S}'Base)
+ return @i{Universal_Integer};
+@end smallexample
+
+@noindent
+It is also allowable to apply @code{Enum_Rep} directly to an object of an
+enumeration type or to a non-overloaded enumeration
+literal. In this case @code{@var{S}'Enum_Rep} is equivalent to
+@code{@var{typ}'Enum_Rep(@var{S})} where @var{typ} is the type of the
+enumeration literal or object.
+
+The function returns the representation value for the given enumeration
+value. This will be equal to value of the @code{Pos} attribute in the
+absence of an enumeration representation clause. This is a static
+attribute (i.e.@: the result is static if the argument is static).
+
+@code{@var{S}'Enum_Rep} can also be used with integer types and objects,
+in which case it simply returns the integer value. The reason for this
+is to allow it to be used for @code{(<>)} discrete formal arguments in
+a generic unit that can be instantiated with either enumeration types
+or integer types. Note that if @code{Enum_Rep} is used on a modular
+type whose upper bound exceeds the upper bound of the largest signed
+integer type, and the argument is a variable, so that the universal
+integer calculation is done at run time, then the call to @code{Enum_Rep}
+may raise @code{Constraint_Error}.
+
+@node Attribute Enum_Val
+@unnumberedsec Attribute Enum_Val
+@cindex Representation of enums
+@findex Enum_Val
+@noindent
+For every enumeration subtype @var{S}, @code{@var{S}'Enum_Val} denotes a
+function with the following spec:
+
+@smallexample @c ada
+function @var{S}'Enum_Val (Arg : @i{Universal_Integer)
+ return @var{S}'Base};
+@end smallexample
+
+@noindent
+The function returns the enumeration value whose representation matches the
+argument, or raises Constraint_Error if no enumeration literal of the type
+has the matching value.
+This will be equal to value of the @code{Val} attribute in the
+absence of an enumeration representation clause. This is a static
+attribute (i.e.@: the result is static if the argument is static).
+
+@node Attribute Epsilon
+@unnumberedsec Attribute Epsilon
+@cindex Ada 83 attributes
+@findex Epsilon
+@noindent
+The @code{Epsilon} attribute is provided for compatibility with Ada 83. See
+the Ada 83 reference manual for an exact description of the semantics of
+this attribute.
+
+@node Attribute Fixed_Value
+@unnumberedsec Attribute Fixed_Value
+@findex Fixed_Value
+@noindent
+For every fixed-point type @var{S}, @code{@var{S}'Fixed_Value} denotes a
+function with the following specification:
+
+@smallexample @c ada
+function @var{S}'Fixed_Value (Arg : @i{Universal_Integer})
+ return @var{S};
+@end smallexample
+
+@noindent
+The value returned is the fixed-point value @var{V} such that
+
+@smallexample @c ada
+@var{V} = Arg * @var{S}'Small
+@end smallexample
+
+@noindent
+The effect is thus similar to first converting the argument to the
+integer type used to represent @var{S}, and then doing an unchecked
+conversion to the fixed-point type. The difference is
+that there are full range checks, to ensure that the result is in range.
+This attribute is primarily intended for use in implementation of the
+input-output functions for fixed-point values.
+
+@node Attribute Has_Access_Values
+@unnumberedsec Attribute Has_Access_Values
+@cindex Access values, testing for
+@findex Has_Access_Values
+@noindent
+The prefix of the @code{Has_Access_Values} attribute is a type. The result
+is a Boolean value which is True if the is an access type, or is a composite
+type with a component (at any nesting depth) that is an access type, and is
+False otherwise.
+The intended use of this attribute is in conjunction with generic
+definitions. If the attribute is applied to a generic private type, it
+indicates whether or not the corresponding actual type has access values.
+
+@node Attribute Has_Discriminants
+@unnumberedsec Attribute Has_Discriminants
+@cindex Discriminants, testing for
+@findex Has_Discriminants
+@noindent
+The prefix of the @code{Has_Discriminants} attribute is a type. The result
+is a Boolean value which is True if the type has discriminants, and False
+otherwise. The intended use of this attribute is in conjunction with generic
+definitions. If the attribute is applied to a generic private type, it
+indicates whether or not the corresponding actual type has discriminants.
+
+@node Attribute Img
+@unnumberedsec Attribute Img
+@findex Img
+@noindent
+The @code{Img} attribute differs from @code{Image} in that it is applied
+directly to an object, and yields the same result as
+@code{Image} for the subtype of the object. This is convenient for
+debugging:
+
+@smallexample @c ada
+Put_Line ("X = " & X'Img);
+@end smallexample
+
+@noindent
+has the same meaning as the more verbose:
+
+@smallexample @c ada
+Put_Line ("X = " & @var{T}'Image (X));
+@end smallexample
+
+@noindent
+where @var{T} is the (sub)type of the object @code{X}.
+
+Note that technically, in analogy to @code{Image},
+@code{X'Img} returns a parameterless function
+that returns the appropriate string when called. This means that
+@code{X'Img} can be renamed as a function-returning-string, or used
+in an instantiation as a function parameter.
+
+@node Attribute Integer_Value
+@unnumberedsec Attribute Integer_Value
+@findex Integer_Value
+@noindent
+For every integer type @var{S}, @code{@var{S}'Integer_Value} denotes a
+function with the following spec:
+
+@smallexample @c ada
+function @var{S}'Integer_Value (Arg : @i{Universal_Fixed})
+ return @var{S};
+@end smallexample
+
+@noindent
+The value returned is the integer value @var{V}, such that
+
+@smallexample @c ada
+Arg = @var{V} * @var{T}'Small
+@end smallexample
+
+@noindent
+where @var{T} is the type of @code{Arg}.
+The effect is thus similar to first doing an unchecked conversion from
+the fixed-point type to its corresponding implementation type, and then
+converting the result to the target integer type. The difference is
+that there are full range checks, to ensure that the result is in range.
+This attribute is primarily intended for use in implementation of the
+standard input-output functions for fixed-point values.
+
+@node Attribute Invalid_Value
+@unnumberedsec Attribute Invalid_Value
+@findex Invalid_Value
+@noindent
+For every scalar type S, S'Invalid_Value returns an undefined value of the
+type. If possible this value is an invalid representation for the type. The
+value returned is identical to the value used to initialize an otherwise
+uninitialized value of the type if pragma Initialize_Scalars is used,
+including the ability to modify the value with the binder -Sxx flag and
+relevant environment variables at run time.
+
+@node Attribute Large
+@unnumberedsec Attribute Large
+@cindex Ada 83 attributes
+@findex Large
+@noindent
+The @code{Large} attribute is provided for compatibility with Ada 83. See
+the Ada 83 reference manual for an exact description of the semantics of
+this attribute.
+
+@node Attribute Library_Level
+@unnumberedsec Attribute Library_Level
+@findex Library_Level
+@noindent
+@noindent
+@code{P'Library_Level}, where P is an entity name,
+returns a Boolean value which is True if the entity is declared
+at the library level, and False otherwise. Note that within a
+generic instantition, the name of the generic unit denotes the
+instance, which means that this attribute can be used to test
+if a generic is instantiated at the library level, as shown
+in this example:
+
+@smallexample @c ada
+generic
+ ...
+package Gen is
+ pragma Compile_Time_Error
+ (not Gen'Library_Level,
+ "Gen can only be instantiated at library level");
+ ...
+end Gen;
+@end smallexample
+
+@node Attribute Loop_Entry
+@unnumberedsec Attribute Loop_Entry
+@findex Loop_Entry
+@noindent
+Syntax:
+
+@smallexample @c ada
+X'Loop_Entry [(loop_name)]
+@end smallexample
+
+@noindent
+The @code{Loop_Entry} attribute is used to refer to the value that an
+expression had upon entry to a given loop in much the same way that the
+@code{Old} attribute in a subprogram postcondition can be used to refer
+to the value an expression had upon entry to the subprogram. The
+relevant loop is either identified by the given loop name, or it is the
+innermost enclosing loop when no loop name is given.
+
+@noindent
+A @code{Loop_Entry} attribute can only occur within a
+@code{Loop_Variant} or @code{Loop_Invariant} pragma. A common use of
+@code{Loop_Entry} is to compare the current value of objects with their
+initial value at loop entry, in a @code{Loop_Invariant} pragma.
+
+@noindent
+The effect of using @code{X'Loop_Entry} is the same as declaring
+a constant initialized with the initial value of @code{X} at loop
+entry. This copy is not performed if the loop is not entered, or if the
+corresponding pragmas are ignored or disabled.
+
+@node Attribute Machine_Size
+@unnumberedsec Attribute Machine_Size
+@findex Machine_Size
+@noindent
+This attribute is identical to the @code{Object_Size} attribute. It is
+provided for compatibility with the DEC Ada 83 attribute of this name.
+
+@node Attribute Mantissa
+@unnumberedsec Attribute Mantissa
+@cindex Ada 83 attributes
+@findex Mantissa
+@noindent
+The @code{Mantissa} attribute is provided for compatibility with Ada 83. See
+the Ada 83 reference manual for an exact description of the semantics of
+this attribute.
+
+@node Attribute Max_Interrupt_Priority
+@unnumberedsec Attribute Max_Interrupt_Priority
+@cindex Interrupt priority, maximum
+@findex Max_Interrupt_Priority
+@noindent
+@code{Standard'Max_Interrupt_Priority} (@code{Standard} is the only
+permissible prefix), provides the same value as
+@code{System.Max_Interrupt_Priority}.
+
+@node Attribute Max_Priority
+@unnumberedsec Attribute Max_Priority
+@cindex Priority, maximum
+@findex Max_Priority
+@noindent
+@code{Standard'Max_Priority} (@code{Standard} is the only permissible
+prefix) provides the same value as @code{System.Max_Priority}.
+
+@node Attribute Maximum_Alignment
+@unnumberedsec Attribute Maximum_Alignment
+@cindex Alignment, maximum
+@findex Maximum_Alignment
+@noindent
+@code{Standard'Maximum_Alignment} (@code{Standard} is the only
+permissible prefix) provides the maximum useful alignment value for the
+target. This is a static value that can be used to specify the alignment
+for an object, guaranteeing that it is properly aligned in all
+cases.
+
+@node Attribute Mechanism_Code
+@unnumberedsec Attribute Mechanism_Code
+@cindex Return values, passing mechanism
+@cindex Parameters, passing mechanism
+@findex Mechanism_Code
+@noindent
+@code{@var{function}'Mechanism_Code} yields an integer code for the
+mechanism used for the result of function, and
+@code{@var{subprogram}'Mechanism_Code (@var{n})} yields the mechanism
+used for formal parameter number @var{n} (a static integer value with 1
+meaning the first parameter) of @var{subprogram}. The code returned is:
+
+@table @asis
+@item 1
+by copy (value)
+@item 2
+by reference
+@item 3
+by descriptor (default descriptor class)
+@item 4
+by descriptor (UBS: unaligned bit string)
+@item 5
+by descriptor (UBSB: aligned bit string with arbitrary bounds)
+@item 6
+by descriptor (UBA: unaligned bit array)
+@item 7
+by descriptor (S: string, also scalar access type parameter)
+@item 8
+by descriptor (SB: string with arbitrary bounds)
+@item 9
+by descriptor (A: contiguous array)
+@item 10
+by descriptor (NCA: non-contiguous array)
+@end table
+
+@noindent
+Values from 3 through 10 are only relevant to Digital OpenVMS implementations.
+@cindex OpenVMS
+
+@node Attribute Null_Parameter
+@unnumberedsec Attribute Null_Parameter
+@cindex Zero address, passing
+@findex Null_Parameter
+@noindent
+A reference @code{@var{T}'Null_Parameter} denotes an imaginary object of
+type or subtype @var{T} allocated at machine address zero. The attribute
+is allowed only as the default expression of a formal parameter, or as
+an actual expression of a subprogram call. In either case, the
+subprogram must be imported.
+
+The identity of the object is represented by the address zero in the
+argument list, independent of the passing mechanism (explicit or
+default).
+
+This capability is needed to specify that a zero address should be
+passed for a record or other composite object passed by reference.
+There is no way of indicating this without the @code{Null_Parameter}
+attribute.
+
+@node Attribute Object_Size
+@unnumberedsec Attribute Object_Size
+@cindex Size, used for objects
+@findex Object_Size
+@noindent
+The size of an object is not necessarily the same as the size of the type
+of an object. This is because by default object sizes are increased to be
+a multiple of the alignment of the object. For example,
+@code{Natural'Size} is
+31, but by default objects of type @code{Natural} will have a size of 32 bits.
+Similarly, a record containing an integer and a character:
+
+@smallexample @c ada
+type Rec is record
+ I : Integer;
+ C : Character;
+end record;
+@end smallexample
+
+@noindent
+will have a size of 40 (that is @code{Rec'Size} will be 40). The
+alignment will be 4, because of the
+integer field, and so the default size of record objects for this type
+will be 64 (8 bytes).
+
+If the alignment of the above record is specified to be 1, then the
+object size will be 40 (5 bytes). This is true by default, and also
+an object size of 40 can be explicitly specified in this case.
+
+A consequence of this capability is that different object sizes can be
+given to subtypes that would otherwise be considered in Ada to be
+statically matching. But it makes no sense to consider such subtypes
+as statically matching. Consequently, in @code{GNAT} we add a rule
+to the static matching rules that requires object sizes to match.
+Consider this example:
+
+@smallexample @c ada
+ 1. procedure BadAVConvert is
+ 2. type R is new Integer;
+ 3. subtype R1 is R range 1 .. 10;
+ 4. subtype R2 is R range 1 .. 10;
+ 5. for R1'Object_Size use 8;
+ 6. for R2'Object_Size use 16;
+ 7. type R1P is access all R1;
+ 8. type R2P is access all R2;
+ 9. R1PV : R1P := new R1'(4);
+10. R2PV : R2P;
+11. begin
+12. R2PV := R2P (R1PV);
+ |
+ >>> target designated subtype not compatible with
+ type "R1" defined at line 3
+
+13. end;
+@end smallexample
+
+@noindent
+In the absence of lines 5 and 6,
+types @code{R1} and @code{R2} statically match and
+hence the conversion on line 12 is legal. But since lines 5 and 6
+cause the object sizes to differ, @code{GNAT} considers that types
+@code{R1} and @code{R2} are not statically matching, and line 12
+generates the diagnostic shown above.
+
+@noindent
+Similar additional checks are performed in other contexts requiring
+statically matching subtypes.
+
+@node Attribute Passed_By_Reference
+@unnumberedsec Attribute Passed_By_Reference
+@cindex Parameters, when passed by reference
+@findex Passed_By_Reference
+@noindent
+@code{@var{type}'Passed_By_Reference} for any subtype @var{type} returns
+a value of type @code{Boolean} value that is @code{True} if the type is
+normally passed by reference and @code{False} if the type is normally
+passed by copy in calls. For scalar types, the result is always @code{False}
+and is static. For non-scalar types, the result is non-static.
+
+@node Attribute Pool_Address
+@unnumberedsec Attribute Pool_Address
+@cindex Parameters, when passed by reference
+@findex Pool_Address
+@noindent
+@code{@var{X}'Pool_Address} for any object @var{X} returns the address
+of X within its storage pool. This is the same as
+@code{@var{X}'Address}, except that for an unconstrained array whose
+bounds are allocated just before the first component,
+@code{@var{X}'Pool_Address} returns the address of those bounds,
+whereas @code{@var{X}'Address} returns the address of the first
+component.
+
+Here, we are interpreting ``storage pool'' broadly to mean ``wherever
+the object is allocated'', which could be a user-defined storage pool,
+the global heap, on the stack, or in a static memory area. For an
+object created by @code{new}, @code{@var{Ptr.all}'Pool_Address} is
+what is passed to @code{Allocate} and returned from @code{Deallocate}.
+
+@node Attribute Range_Length
+@unnumberedsec Attribute Range_Length
+@findex Range_Length
+@noindent
+@code{@var{type}'Range_Length} for any discrete type @var{type} yields
+the number of values represented by the subtype (zero for a null
+range). The result is static for static subtypes. @code{Range_Length}
+applied to the index subtype of a one dimensional array always gives the
+same result as @code{Length} applied to the array itself.
+
+@node Attribute Ref
+@unnumberedsec Attribute Ref
+@findex Ref
+@noindent
+
+
+@node Attribute Restriction_Set
+@unnumberedsec Attribute Restriction_Set
+@findex Restriction_Set
+@cindex Restrictions
+@noindent
+This attribute allows compile time testing of restrictions that
+are currently in effect. It is primarily intended for specializing
+code in the run-time based on restrictions that are active (e.g.
+don't need to save fpt registers if restriction No_Floating_Point
+is known to be in effect), but can be used anywhere.
+
+There are two forms:
+
+@smallexample @c ada
+System'Restriction_Set (partition_boolean_restriction_NAME)
+System'Restriction_Set (No_Dependence => library_unit_NAME);
+@end smallexample
+
+@noindent
+In the case of the first form, the only restriction names
+allowed are parameterless restrictions that are checked
+for consistency at bind time. For a complete list see the
+subtype @code{System.Rident.Partition_Boolean_Restrictions}.
+
+The result returned is True if the restriction is known to
+be in effect, and False if the restriction is known not to
+be in effect. An important guarantee is that the value of
+a Restriction_Set attribute is known to be consistent throughout
+all the code of a partition.
+
+This is trivially achieved if the entire partition is compiled
+with a consistent set of restriction pragmas. However, the
+compilation model does not require this. It is possible to
+compile one set of units with one set of pragmas, and another
+set of units with another set of pragmas. It is even possible
+to compile a spec with one set of pragmas, and then WITH the
+same spec with a different set of pragmas. Inconsistencies
+in the actual use of the restriction are checked at bind time.
+
+In order to achieve the guarantee of consistency for the
+Restriction_Set pragma, we consider that a use of the pragma
+that yields False is equivalent to a violation of the
+restriction.
+
+So for example if you write
+
+@smallexample @c ada
+if System'Restriction_Set (No_Floating_Point) then
+ ...
+else
+ ...
+end if;
+@end smallexample
+
+@noindent
+And the result is False, so that the else branch is executed,
+you can assume that this restriction is not set for any unit
+in the partition. This is checked by considering this use of
+the restriction pragma to be a violation of the restriction
+No_Floating_Point. This means that no other unit can attempt
+to set this restriction (if some unit does attempt to set it,
+the binder will refuse to bind the partition).
+
+Technical note: The restriction name and the unit name are
+intepreted entirely syntactically, as in the corresponding
+Restrictions pragma, they are not analyzed semantically,
+so they do not have a type.
+
+@node Attribute Result
+@unnumberedsec Attribute Result
+@findex Result
+@noindent
+@code{@var{function}'Result} can only be used with in a Postcondition pragma
+for a function. The prefix must be the name of the corresponding function. This
+is used to refer to the result of the function in the postcondition expression.
+For a further discussion of the use of this attribute and examples of its use,
+see the description of pragma Postcondition.
+
+@node Attribute Safe_Emax
+@unnumberedsec Attribute Safe_Emax
+@cindex Ada 83 attributes
+@findex Safe_Emax
+@noindent
+The @code{Safe_Emax} attribute is provided for compatibility with Ada 83. See
+the Ada 83 reference manual for an exact description of the semantics of
+this attribute.
+
+@node Attribute Safe_Large
+@unnumberedsec Attribute Safe_Large
+@cindex Ada 83 attributes
+@findex Safe_Large
+@noindent
+The @code{Safe_Large} attribute is provided for compatibility with Ada 83. See
+the Ada 83 reference manual for an exact description of the semantics of
+this attribute.
+
+@node Attribute Scalar_Storage_Order
+@unnumberedsec Attribute Scalar_Storage_Order
+@cindex Endianness
+@cindex Scalar storage order
+@findex Scalar_Storage_Order
+@noindent
+For every array or record type @var{S}, the representation attribute
+@code{Scalar_Storage_Order} denotes the order in which storage elements
+that make up scalar components are ordered within S:
+
+@smallexample @c ada
+ -- Component type definitions
+
+ subtype Yr_Type is Natural range 0 .. 127;
+ subtype Mo_Type is Natural range 1 .. 12;
+ subtype Da_Type is Natural range 1 .. 31;
+
+ -- Record declaration
+
+ type Date is record
+ Years_Since_1980 : Yr_Type;
+ Month : Mo_Type;
+ Day_Of_Month : Da_Type;
+ end record;
+
+ -- Record representation clause
+
+ for Date use record
+ Years_Since_1980 at 0 range 0 .. 6;
+ Month at 0 range 7 .. 10;
+ Day_Of_Month at 0 range 11 .. 15;
+ end record;
+
+ -- Attribute definition clauses
+
+ for Date'Bit_Order use System.High_Order_First;
+ for Date'Scalar_Storage_Order use System.High_Order_First;
+ -- If Scalar_Storage_Order is specified, it must be consistent with
+ -- Bit_Order, so it's best to always define the latter explicitly if
+ -- the former is used.
+@end smallexample
+
+Other properties are
+as for standard representation attribute @code{Bit_Order}, as defined by
+Ada RM 13.5.3(4). The default is @code{System.Default_Bit_Order}.
+
+For a record type @var{S}, if @code{@var{S}'Scalar_Storage_Order} is
+specified explicitly, it shall be equal to @code{@var{S}'Bit_Order}. Note:
+this means that if a @code{Scalar_Storage_Order} attribute definition
+clause is not confirming, then the type's @code{Bit_Order} shall be
+specified explicitly and set to the same value.
+
+For a record extension, the derived type shall have the same scalar storage
+order as the parent type.
+
+If a component of @var{S} has itself a record or array type, then it shall also
+have a @code{Scalar_Storage_Order} attribute definition clause. In addition,
+if the component is a packed array, or does not start on a byte boundary, then
+the scalar storage order specified for S and for the nested component type shall
+be identical.
+
+If @var{S} appears as the type of a record or array component, the enclosing
+record or array shall also have a @code{Scalar_Storage_Order} attribute
+definition clause.
+
+No component of a type that has a @code{Scalar_Storage_Order} attribute
+definition may be aliased.
+
+A confirming @code{Scalar_Storage_Order} attribute definition clause (i.e.
+with a value equal to @code{System.Default_Bit_Order}) has no effect.
+
+If the opposite storage order is specified, then whenever the value of
+a scalar component of an object of type @var{S} is read, the storage
+elements of the enclosing machine scalar are first reversed (before
+retrieving the component value, possibly applying some shift and mask
+operatings on the enclosing machine scalar), and the opposite operation
+is done for writes.
+
+In that case, the restrictions set forth in 13.5.1(10.3/2) for scalar components
+are relaxed. Instead, the following rules apply:
+
+@itemize @bullet
+@item the underlying storage elements are those at positions
+ @code{(position + first_bit / storage_element_size) ..
+ (position + (last_bit + storage_element_size - 1) /
+ storage_element_size)}
+@item the sequence of underlying storage elements shall have
+ a size no greater than the largest machine scalar
+@item the enclosing machine scalar is defined as the smallest machine
+ scalar starting at a position no greater than
+ @code{position + first_bit / storage_element_size} and covering
+ storage elements at least up to @code{position + (last_bit +
+ storage_element_size - 1) / storage_element_size}
+@item the position of the component is interpreted relative to that machine
+ scalar.
+
+@end itemize
+
+@node Attribute Simple_Storage_Pool
+@unnumberedsec Attribute Simple_Storage_Pool
+@cindex Storage pool, simple
+@cindex Simple storage pool
+@findex Simple_Storage_Pool
+@noindent
+For every nonformal, nonderived access-to-object type @var{Acc}, the
+representation attribute @code{Simple_Storage_Pool} may be specified
+via an attribute_definition_clause (or by specifying the equivalent aspect):
+
+@smallexample @c ada
+
+My_Pool : My_Simple_Storage_Pool_Type;
+
+type Acc is access My_Data_Type;
+
+for Acc'Simple_Storage_Pool use My_Pool;
+
+@end smallexample
+
+@noindent
+The name given in an attribute_definition_clause for the
+@code{Simple_Storage_Pool} attribute shall denote a variable of
+a ``simple storage pool type'' (see pragma @code{Simple_Storage_Pool_Type}).
+
+The use of this attribute is only allowed for a prefix denoting a type
+for which it has been specified. The type of the attribute is the type
+of the variable specified as the simple storage pool of the access type,
+and the attribute denotes that variable.
+
+It is illegal to specify both @code{Storage_Pool} and @code{Simple_Storage_Pool}
+for the same access type.
+
+If the @code{Simple_Storage_Pool} attribute has been specified for an access
+type, then applying the @code{Storage_Pool} attribute to the type is flagged
+with a warning and its evaluation raises the exception @code{Program_Error}.
+
+If the Simple_Storage_Pool attribute has been specified for an access
+type @var{S}, then the evaluation of the attribute @code{@var{S}'Storage_Size}
+returns the result of calling @code{Storage_Size (@var{S}'Simple_Storage_Pool)},
+which is intended to indicate the number of storage elements reserved for
+the simple storage pool. If the Storage_Size function has not been defined
+for the simple storage pool type, then this attribute returns zero.
+
+If an access type @var{S} has a specified simple storage pool of type
+@var{SSP}, then the evaluation of an allocator for that access type calls
+the primitive @code{Allocate} procedure for type @var{SSP}, passing
+@code{@var{S}'Simple_Storage_Pool} as the pool parameter. The detailed
+semantics of such allocators is the same as those defined for allocators
+in section 13.11 of the Ada Reference Manual, with the term
+``simple storage pool'' substituted for ``storage pool''.
+
+If an access type @var{S} has a specified simple storage pool of type
+@var{SSP}, then a call to an instance of the @code{Ada.Unchecked_Deallocation}
+for that access type invokes the primitive @code{Deallocate} procedure
+for type @var{SSP}, passing @code{@var{S}'Simple_Storage_Pool} as the pool
+parameter. The detailed semantics of such unchecked deallocations is the same
+as defined in section 13.11.2 of the Ada Reference Manual, except that the
+term ``simple storage pool'' is substituted for ``storage pool''.
+
+@node Attribute Small
+@unnumberedsec Attribute Small
+@cindex Ada 83 attributes
+@findex Small
+@noindent
+The @code{Small} attribute is defined in Ada 95 (and Ada 2005) only for
+fixed-point types.
+GNAT also allows this attribute to be applied to floating-point types
+for compatibility with Ada 83. See
+the Ada 83 reference manual for an exact description of the semantics of
+this attribute when applied to floating-point types.
+
+@node Attribute Storage_Unit
+@unnumberedsec Attribute Storage_Unit
+@findex Storage_Unit
+@noindent
+@code{Standard'Storage_Unit} (@code{Standard} is the only permissible
+prefix) provides the same value as @code{System.Storage_Unit}.
+
+@node Attribute Stub_Type
+@unnumberedsec Attribute Stub_Type
+@findex Stub_Type
+@noindent
+The GNAT implementation of remote access-to-classwide types is
+organized as described in AARM section E.4 (20.t): a value of an RACW type
+(designating a remote object) is represented as a normal access
+value, pointing to a "stub" object which in turn contains the
+necessary information to contact the designated remote object. A
+call on any dispatching operation of such a stub object does the
+remote call, if necessary, using the information in the stub object
+to locate the target partition, etc.
+
+For a prefix @code{T} that denotes a remote access-to-classwide type,
+@code{T'Stub_Type} denotes the type of the corresponding stub objects.
+
+By construction, the layout of @code{T'Stub_Type} is identical to that of
+type @code{RACW_Stub_Type} declared in the internal implementation-defined
+unit @code{System.Partition_Interface}. Use of this attribute will create
+an implicit dependency on this unit.
+
+@node Attribute System_Allocator_Alignment
+@unnumberedsec Attribute System_Allocator_Alignment
+@cindex Alignment, allocator
+@findex System_Allocator_Alignment
+@noindent
+@code{Standard'System_Allocator_Alignment} (@code{Standard} is the only
+permissible prefix) provides the observable guaranted to be honored by
+the system allocator (malloc). This is a static value that can be used
+in user storage pools based on malloc either to reject allocation
+with alignment too large or to enable a realignment circuitry if the
+alignment request is larger than this value.
+
+@node Attribute Target_Name
+@unnumberedsec Attribute Target_Name
+@findex Target_Name
+@noindent
+@code{Standard'Target_Name} (@code{Standard} is the only permissible
+prefix) provides a static string value that identifies the target
+for the current compilation. For GCC implementations, this is the
+standard gcc target name without the terminating slash (for
+example, GNAT 5.0 on windows yields "i586-pc-mingw32msv").
+
+@node Attribute Tick
+@unnumberedsec Attribute Tick
+@findex Tick
+@noindent
+@code{Standard'Tick} (@code{Standard} is the only permissible prefix)
+provides the same value as @code{System.Tick},
+
+@node Attribute To_Address
+@unnumberedsec Attribute To_Address
+@findex To_Address
+@noindent
+The @code{System'To_Address}
+(@code{System} is the only permissible prefix)
+denotes a function identical to
+@code{System.Storage_Elements.To_Address} except that
+it is a static attribute. This means that if its argument is
+a static expression, then the result of the attribute is a
+static expression. This means that such an expression can be
+used in contexts (e.g.@: preelaborable packages) which require a
+static expression and where the function call could not be used
+(since the function call is always non-static, even if its
+argument is static). The argument must be in the range
+-(2**(m-1) .. 2**m-1, where m is the memory size
+(typically 32 or 64). Negative values are intepreted in a
+modular manner (e.g. -1 means the same as 16#FFFF_FFFF# on
+a 32 bits machine).
+
+@node Attribute Type_Class
+@unnumberedsec Attribute Type_Class
+@findex Type_Class
+@noindent
+@code{@var{type}'Type_Class} for any type or subtype @var{type} yields
+the value of the type class for the full type of @var{type}. If
+@var{type} is a generic formal type, the value is the value for the
+corresponding actual subtype. The value of this attribute is of type
+@code{System.Aux_DEC.Type_Class}, which has the following definition:
+
+@smallexample @c ada
+ type Type_Class is
+ (Type_Class_Enumeration,
+ Type_Class_Integer,
+ Type_Class_Fixed_Point,
+ Type_Class_Floating_Point,
+ Type_Class_Array,
+ Type_Class_Record,
+ Type_Class_Access,
+ Type_Class_Task,
+ Type_Class_Address);
+@end smallexample
+
+@noindent
+Protected types yield the value @code{Type_Class_Task}, which thus
+applies to all concurrent types. This attribute is designed to
+be compatible with the DEC Ada 83 attribute of the same name.
+
+@node Attribute UET_Address
+@unnumberedsec Attribute UET_Address
+@findex UET_Address
+@noindent
+The @code{UET_Address} attribute can only be used for a prefix which
+denotes a library package. It yields the address of the unit exception
+table when zero cost exception handling is used. This attribute is
+intended only for use within the GNAT implementation. See the unit
+@code{Ada.Exceptions} in files @file{a-except.ads} and @file{a-except.adb}
+for details on how this attribute is used in the implementation.
+
+@node Attribute Unconstrained_Array
+@unnumberedsec Attribute Unconstrained_Array
+@findex Unconstrained_Array
+@noindent
+The @code{Unconstrained_Array} attribute can be used with a prefix that
+denotes any type or subtype. It is a static attribute that yields
+@code{True} if the prefix designates an unconstrained array,
+and @code{False} otherwise. In a generic instance, the result is
+still static, and yields the result of applying this test to the
+generic actual.
+
+@node Attribute Universal_Literal_String
+@unnumberedsec Attribute Universal_Literal_String
+@cindex Named numbers, representation of
+@findex Universal_Literal_String
+@noindent
+The prefix of @code{Universal_Literal_String} must be a named
+number. The static result is the string consisting of the characters of
+the number as defined in the original source. This allows the user
+program to access the actual text of named numbers without intermediate
+conversions and without the need to enclose the strings in quotes (which
+would preclude their use as numbers).
+
+For example, the following program prints the first 50 digits of pi:
+
+@smallexample @c ada
+with Text_IO; use Text_IO;
+with Ada.Numerics;
+procedure Pi is
+begin
+ Put (Ada.Numerics.Pi'Universal_Literal_String);
+end;
+@end smallexample
+
+@node Attribute Unrestricted_Access
+@unnumberedsec Attribute Unrestricted_Access
+@cindex @code{Access}, unrestricted
+@findex Unrestricted_Access
+@noindent
+The @code{Unrestricted_Access} attribute is similar to @code{Access}
+except that all accessibility and aliased view checks are omitted. This
+is a user-beware attribute. It is similar to
+@code{Address}, for which it is a desirable replacement where the value
+desired is an access type. In other words, its effect is identical to
+first applying the @code{Address} attribute and then doing an unchecked
+conversion to a desired access type. In GNAT, but not necessarily in
+other implementations, the use of static chains for inner level
+subprograms means that @code{Unrestricted_Access} applied to a
+subprogram yields a value that can be called as long as the subprogram
+is in scope (normal Ada accessibility rules restrict this usage).
+
+It is possible to use @code{Unrestricted_Access} for any type, but care
+must be exercised if it is used to create pointers to unconstrained
+objects. In this case, the resulting pointer has the same scope as the
+context of the attribute, and may not be returned to some enclosing
+scope. For instance, a function cannot use @code{Unrestricted_Access}
+to create a unconstrained pointer and then return that value to the
+caller.
+
+@node Attribute Update
+@unnumberedsec Attribute Update
+@findex Update
+@noindent
+The @code{Update} attribute creates a copy of an array or record value
+with one or more modified components. The syntax is:
+
+@smallexample @c ada
+PREFIX'Update ( RECORD_COMPONENT_ASSOCIATION_LIST )
+PREFIX'Update ( ARRAY_COMPONENT_ASSOCIATION @{, ARRAY_COMPONENT_ASSOCIATION @} )
+PREFIX'Update ( MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION
+ @{, MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION @} )
+
+MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION ::= INDEX_EXPRESSION_LIST_LIST => EXPRESSION
+INDEX_EXPRESSION_LIST_LIST ::= INDEX_EXPRESSION_LIST @{| INDEX_EXPRESSION_LIST @}
+INDEX_EXPRESSION_LIST ::= ( EXPRESSION @{, EXPRESSION @} )
+@end smallexample
+
+@noindent
+where @code{PREFIX} is the name of an array or record object, and
+the association list in parentheses does not contain an @code{others}
+choice. The effect is to yield a copy of the array or record value which
+is unchanged apart from the components mentioned in the association list, which
+are changed to the indicated value. The original value of the array or
+record value is not affected. For example:
+
+@smallexample @c ada
+type Arr is Array (1 .. 5) of Integer;
+...
+Avar1 : Arr := (1,2,3,4,5);
+Avar2 : Arr := Avar1'Update (2 => 10, 3 .. 4 => 20);
+@end smallexample
+
+@noindent
+yields a value for @code{Avar2} of 1,10,20,20,5 with @code{Avar1}
+begin unmodified. Similarly:
+
+@smallexample @c ada
+type Rec is A, B, C : Integer;
+...
+Rvar1 : Rec := (A => 1, B => 2, C => 3);
+Rvar2 : Rec := Rvar1'Update (B => 20);
+@end smallexample
+
+@noindent
+yields a value for @code{Rvar2} of (A => 1, B => 20, C => 3),
+with @code{Rvar1} being unmodifed.
+Note that the value of the attribute reference is computed
+completely before it is used. This means that if you write:
+
+@smallexample @c ada
+Avar1 := Avar1'Update (1 => 10, 2 => Function_Call);
+@end smallexample
+
+@noindent
+then the value of @code{Avar1} is not modified if @code{Function_Call}
+raises an exception, unlike the effect of a series of direct assignments
+to elements of @code{Avar1}. In general this requires that
+two extra complete copies of the object are required, which should be
+kept in mind when considering efficiency.
+
+The @code{Update} attribute cannot be applied to prefixes of a limited
+type, and cannot reference discriminants in the case of a record type.
+The accessibility level of an Update attribute result object is defined
+as for an aggregate.
+
+In the record case, no component can be mentioned more than once. In
+the array case, two overlapping ranges can appear in the association list,
+in which case the modifications are processed left to right.
+
+Multi-dimensional arrays can be modified, as shown by this example:
+
+@smallexample @c ada
+A : array (1 .. 10, 1 .. 10) of Integer;
+..
+A := A'Update ((1, 2) => 20, (3, 4) => 30);
+@end smallexample
+
+@noindent
+which changes element (1,2) to 20 and (3,4) to 30.
+
+@node Attribute Valid_Scalars
+@unnumberedsec Attribute Valid_Scalars
+@findex Valid_Scalars
+@noindent
+The @code{'Valid_Scalars} attribute is intended to make it easier to
+check the validity of scalar subcomponents of composite objects. It
+is defined for any prefix @code{X} that denotes an object.
+The value of this attribute is of the predefined type Boolean.
+@code{X'Valid_Scalars} yields True if and only if evaluation of
+@code{P'Valid} yields True for every scalar part P of X or if X has
+no scalar parts. It is not specified in what order the scalar parts
+are checked, nor whether any more are checked after any one of them
+is determined to be invalid. If the prefix @code{X} is of a class-wide
+type @code{T'Class} (where @code{T} is the associated specific type),
+or if the prefix @code{X} is of a specific tagged type @code{T}, then
+only the scalar parts of components of @code{T} are traversed; in other
+words, components of extensions of @code{T} are not traversed even if
+@code{T'Class (X)'Tag /= T'Tag} . The compiler will issue a warning if it can
+be determined at compile time that the prefix of the attribute has no
+scalar parts (e.g., if the prefix is of an access type, an interface type,
+an undiscriminated task type, or an undiscriminated protected type).
+
+@node Attribute VADS_Size
+@unnumberedsec Attribute VADS_Size
+@cindex @code{Size}, VADS compatibility
+@findex VADS_Size
+@noindent
+The @code{'VADS_Size} attribute is intended to make it easier to port
+legacy code which relies on the semantics of @code{'Size} as implemented
+by the VADS Ada 83 compiler. GNAT makes a best effort at duplicating the
+same semantic interpretation. In particular, @code{'VADS_Size} applied
+to a predefined or other primitive type with no Size clause yields the
+Object_Size (for example, @code{Natural'Size} is 32 rather than 31 on
+typical machines). In addition @code{'VADS_Size} applied to an object
+gives the result that would be obtained by applying the attribute to
+the corresponding type.
+
+@node Attribute Value_Size
+@unnumberedsec Attribute Value_Size
+@cindex @code{Size}, setting for not-first subtype
+@findex Value_Size
+@code{@var{type}'Value_Size} is the number of bits required to represent
+a value of the given subtype. It is the same as @code{@var{type}'Size},
+but, unlike @code{Size}, may be set for non-first subtypes.
+
+@node Attribute Wchar_T_Size
+@unnumberedsec Attribute Wchar_T_Size
+@findex Wchar_T_Size
+@code{Standard'Wchar_T_Size} (@code{Standard} is the only permissible
+prefix) provides the size in bits of the C @code{wchar_t} type
+primarily for constructing the definition of this type in
+package @code{Interfaces.C}.
+
+@node Attribute Word_Size
+@unnumberedsec Attribute Word_Size
+@findex Word_Size
+@code{Standard'Word_Size} (@code{Standard} is the only permissible
+prefix) provides the value @code{System.Word_Size}.
+
+@node Standard and Implementation Defined Restrictions
+@chapter Standard and Implementation Defined Restrictions
+
+@noindent
+All RM defined Restriction identifiers are implemented:
+
+@itemize @bullet
+@item language-defined restrictions (see 13.12.1)
+@item tasking restrictions (see D.7)
+@item high integrity restrictions (see H.4)
+@end itemize
+
+@noindent
+GNAT implements additional restriction identifiers. All restrictions, whether
+language defined or GNAT-specific, are listed in the following.
+
+@menu
+* Partition-Wide Restrictions::
+* Program Unit Level Restrictions::
+@end menu
+
+@node Partition-Wide Restrictions
+@section Partition-Wide Restrictions
+
+There are two separate lists of restriction identifiers. The first
+set requires consistency throughout a partition (in other words, if the
+restriction identifier is used for any compilation unit in the partition,
+then all compilation units in the partition must obey the restriction).
+
+@menu
+* Immediate_Reclamation::
+* Max_Asynchronous_Select_Nesting::
+* Max_Entry_Queue_Length::
+* Max_Protected_Entries::
+* Max_Select_Alternatives::
+* Max_Storage_At_Blocking::
+* Max_Task_Entries::
+* Max_Tasks::
+* No_Abort_Statements::
+* No_Access_Parameter_Allocators::
+* No_Access_Subprograms::
+* No_Allocators::
+* No_Anonymous_Allocators::
+* No_Calendar::
+* No_Coextensions::
+* No_Default_Initialization::
+* No_Delay::
+* No_Dependence::
+* No_Direct_Boolean_Operators::
+* No_Dispatch::
+* No_Dispatching_Calls::
+* No_Dynamic_Attachment::
+* No_Dynamic_Priorities::
+* No_Entry_Calls_In_Elaboration_Code::
+* No_Enumeration_Maps::
+* No_Exception_Handlers::
+* No_Exception_Propagation::
+* No_Exception_Registration::
+* No_Exceptions::
+* No_Finalization::
+* No_Fixed_Point::
+* No_Floating_Point::
+* No_Implicit_Conditionals::
+* No_Implicit_Dynamic_Code::
+* No_Implicit_Heap_Allocations::
+* No_Implicit_Loops::
+* No_Initialize_Scalars::
+* No_IO::
+* No_Local_Allocators::
+* No_Local_Protected_Objects::
+* No_Local_Timing_Events::
+* No_Nested_Finalization::
+* No_Protected_Type_Allocators::
+* No_Protected_Types::
+* No_Recursion::
+* No_Reentrancy::
+* No_Relative_Delay::
+* No_Requeue_Statements::
+* No_Secondary_Stack::
+* No_Select_Statements::
+* No_Specific_Termination_Handlers::
+* No_Specification_of_Aspect::
+* No_Standard_Allocators_After_Elaboration::
+* No_Standard_Storage_Pools::
+* No_Stream_Optimizations::
+* No_Streams::
+* No_Task_Allocators::
+* No_Task_Attributes_Package::
+* No_Task_Hierarchy::
+* No_Task_Termination::
+* No_Tasking::
+* No_Terminate_Alternatives::
+* No_Unchecked_Access::
+* Simple_Barriers::
+* Static_Priorities::
+* Static_Storage_Size::
+@end menu
+
+@node Immediate_Reclamation
+@unnumberedsubsec Immediate_Reclamation
+@findex Immediate_Reclamation
+[RM H.4] This restriction ensures that, except for storage occupied by
+objects created by allocators and not deallocated via unchecked
+deallocation, any storage reserved at run time for an object is
+immediately reclaimed when the object no longer exists.
+
+@node Max_Asynchronous_Select_Nesting
+@unnumberedsubsec Max_Asynchronous_Select_Nesting
+@findex Max_Asynchronous_Select_Nesting
+[RM D.7] Specifies the maximum dynamic nesting level of asynchronous
+selects. Violations of this restriction with a value of zero are
+detected at compile time. Violations of this restriction with values
+other than zero cause Storage_Error to be raised.
+
+@node Max_Entry_Queue_Length
+@unnumberedsubsec Max_Entry_Queue_Length
+@findex Max_Entry_Queue_Length
+[RM D.7] This restriction is a declaration that any protected entry compiled in
+the scope of the restriction has at most the specified number of
+tasks waiting on the entry at any one time, and so no queue is required.
+Note that this restriction is checked at run time. Violation of this
+restriction results in the raising of Program_Error exception at the point of
+the call.
+
+@findex Max_Entry_Queue_Depth
+The restriction @code{Max_Entry_Queue_Depth} is recognized as a
+synonym for @code{Max_Entry_Queue_Length}. This is retained for historical
+compatibility purposes (and a warning will be generated for its use if
+warnings on obsolescent features are activated).
+
+@node Max_Protected_Entries
+@unnumberedsubsec Max_Protected_Entries
+@findex Max_Protected_Entries
+[RM D.7] Specifies the maximum number of entries per protected type. The
+bounds of every entry family of a protected unit shall be static, or shall be
+defined by a discriminant of a subtype whose corresponding bound is static.
+
+@node Max_Select_Alternatives
+@unnumberedsubsec Max_Select_Alternatives
+@findex Max_Select_Alternatives
+[RM D.7] Specifies the maximum number of alternatives in a selective accept.
+
+@node Max_Storage_At_Blocking
+@unnumberedsubsec Max_Storage_At_Blocking
+@findex Max_Storage_At_Blocking
+[RM D.7] Specifies the maximum portion (in storage elements) of a task's
+Storage_Size that can be retained by a blocked task. A violation of this
+restriction causes Storage_Error to be raised.
+
+@node Max_Task_Entries
+@unnumberedsubsec Max_Task_Entries
+@findex Max_Task_Entries
+[RM D.7] Specifies the maximum number of entries
+per task. The bounds of every entry family
+of a task unit shall be static, or shall be
+defined by a discriminant of a subtype whose
+corresponding bound is static.
+
+@node Max_Tasks
+@unnumberedsubsec Max_Tasks
+@findex Max_Tasks
+[RM D.7] Specifies the maximum number of task that may be created, not
+counting the creation of the environment task. Violations of this
+restriction with a value of zero are detected at compile
+time. Violations of this restriction with values other than zero cause
+Storage_Error to be raised.
+
+@node No_Abort_Statements
+@unnumberedsubsec No_Abort_Statements
+@findex No_Abort_Statements
+[RM D.7] There are no abort_statements, and there are
+no calls to Task_Identification.Abort_Task.
+
+@node No_Access_Parameter_Allocators
+@unnumberedsubsec No_Access_Parameter_Allocators
+@findex No_Access_Parameter_Allocators
+[RM H.4] This restriction ensures at compile time that there are no
+occurrences of an allocator as the actual parameter to an access
+parameter.
+
+@node No_Access_Subprograms
+@unnumberedsubsec No_Access_Subprograms
+@findex No_Access_Subprograms
+[RM H.4] This restriction ensures at compile time that there are no
+declarations of access-to-subprogram types.
+
+@node No_Allocators
+@unnumberedsubsec No_Allocators
+@findex No_Allocators
+[RM H.4] This restriction ensures at compile time that there are no
+occurrences of an allocator.
+
+@node No_Anonymous_Allocators
+@unnumberedsubsec No_Anonymous_Allocators
+@findex No_Anonymous_Allocators
+[RM H.4] This restriction ensures at compile time that there are no
+occurrences of an allocator of anonymous access type.
+
+@node No_Calendar
+@unnumberedsubsec No_Calendar
+@findex No_Calendar
+[GNAT] This restriction ensures at compile time that there is no implicit or
+explicit dependence on the package @code{Ada.Calendar}.
+
+@node No_Coextensions
+@unnumberedsubsec No_Coextensions
+@findex No_Coextensions
+[RM H.4] This restriction ensures at compile time that there are no
+coextensions. See 3.10.2.
+
+@node No_Default_Initialization
+@unnumberedsubsec No_Default_Initialization
+@findex No_Default_Initialization
+
+[GNAT] This restriction prohibits any instance of default initialization
+of variables. The binder implements a consistency rule which prevents
+any unit compiled without the restriction from with'ing a unit with the
+restriction (this allows the generation of initialization procedures to
+be skipped, since you can be sure that no call is ever generated to an
+initialization procedure in a unit with the restriction active). If used
+in conjunction with Initialize_Scalars or Normalize_Scalars, the effect
+is to prohibit all cases of variables declared without a specific
+initializer (including the case of OUT scalar parameters).
+
+@node No_Delay
+@unnumberedsubsec No_Delay
+@findex No_Delay
+[RM H.4] This restriction ensures at compile time that there are no
+delay statements and no dependences on package Calendar.
+
+@node No_Dependence
+@unnumberedsubsec No_Dependence
+@findex No_Dependence
+[RM 13.12.1] This restriction checks at compile time that there are no
+dependence on a library unit.
+
+@node No_Direct_Boolean_Operators
+@unnumberedsubsec No_Direct_Boolean_Operators
+@findex No_Direct_Boolean_Operators
+[GNAT] This restriction ensures that no logical operators (and/or/xor)
+are used on operands of type Boolean (or any type derived from Boolean).
+This is intended for use in safety critical programs where the certification
+protocol requires the use of short-circuit (and then, or else) forms for all
+composite boolean operations.
+
+@node No_Dispatch
+@unnumberedsubsec No_Dispatch
+@findex No_Dispatch
+[RM H.4] This restriction ensures at compile time that there are no
+occurrences of @code{T'Class}, for any (tagged) subtype @code{T}.
+
+@node No_Dispatching_Calls
+@unnumberedsubsec No_Dispatching_Calls
+@findex No_Dispatching_Calls
+[GNAT] This restriction ensures at compile time that the code generated by the
+compiler involves no dispatching calls. The use of this restriction allows the
+safe use of record extensions, classwide membership tests and other classwide
+features not involving implicit dispatching. This restriction ensures that
+the code contains no indirect calls through a dispatching mechanism. Note that
+this includes internally-generated calls created by the compiler, for example
+in the implementation of class-wide objects assignments. The
+membership test is allowed in the presence of this restriction, because its
+implementation requires no dispatching.
+This restriction is comparable to the official Ada restriction
+@code{No_Dispatch} except that it is a bit less restrictive in that it allows
+all classwide constructs that do not imply dispatching.
+The following example indicates constructs that violate this restriction.
+
+@smallexample
+package Pkg is
+ type T is tagged record
+ Data : Natural;
+ end record;
+ procedure P (X : T);
+
+ type DT is new T with record
+ More_Data : Natural;
+ end record;
+ procedure Q (X : DT);
+end Pkg;
+
+with Pkg; use Pkg;
+procedure Example is
+ procedure Test (O : T'Class) is
+ N : Natural := O'Size;-- Error: Dispatching call
+ C : T'Class := O; -- Error: implicit Dispatching Call
+ begin
+ if O in DT'Class then -- OK : Membership test
+ Q (DT (O)); -- OK : Type conversion plus direct call
+ else
+ P (O); -- Error: Dispatching call
+ end if;
+ end Test;
+
+ Obj : DT;
+begin
+ P (Obj); -- OK : Direct call
+ P (T (Obj)); -- OK : Type conversion plus direct call
+ P (T'Class (Obj)); -- Error: Dispatching call
+
+ Test (Obj); -- OK : Type conversion
+
+ if Obj in T'Class then -- OK : Membership test
+ null;
+ end if;
+end Example;
+@end smallexample
+
+@node No_Dynamic_Attachment
+@unnumberedsubsec No_Dynamic_Attachment
+@findex No_Dynamic_Attachment
+[RM D.7] This restriction ensures that there is no call to any of the
+operations defined in package Ada.Interrupts
+(Is_Reserved, Is_Attached, Current_Handler, Attach_Handler, Exchange_Handler,
+Detach_Handler, and Reference).
+
+@findex No_Dynamic_Interrupts
+The restriction @code{No_Dynamic_Interrupts} is recognized as a
+synonym for @code{No_Dynamic_Attachment}. This is retained for historical
+compatibility purposes (and a warning will be generated for its use if
+warnings on obsolescent features are activated).
+
+@node No_Dynamic_Priorities
+@unnumberedsubsec No_Dynamic_Priorities
+@findex No_Dynamic_Priorities
+[RM D.7] There are no semantic dependencies on the package Dynamic_Priorities.
+
+@node No_Entry_Calls_In_Elaboration_Code
+@unnumberedsubsec No_Entry_Calls_In_Elaboration_Code
+@findex No_Entry_Calls_In_Elaboration_Code
+[GNAT] This restriction ensures at compile time that no task or protected entry
+calls are made during elaboration code. As a result of the use of this
+restriction, the compiler can assume that no code past an accept statement
+in a task can be executed at elaboration time.
+
+@node No_Enumeration_Maps
+@unnumberedsubsec No_Enumeration_Maps
+@findex No_Enumeration_Maps
+[GNAT] This restriction ensures at compile time that no operations requiring
+enumeration maps are used (that is Image and Value attributes applied
+to enumeration types).
+
+@node No_Exception_Handlers
+@unnumberedsubsec No_Exception_Handlers
+@findex No_Exception_Handlers
+[GNAT] This restriction ensures at compile time that there are no explicit
+exception handlers. It also indicates that no exception propagation will
+be provided. In this mode, exceptions may be raised but will result in
+an immediate call to the last chance handler, a routine that the user
+must define with the following profile:
+
+@smallexample @c ada
+procedure Last_Chance_Handler
+ (Source_Location : System.Address; Line : Integer);
+pragma Export (C, Last_Chance_Handler,
+ "__gnat_last_chance_handler");
+@end smallexample
+
+The parameter is a C null-terminated string representing a message to be
+associated with the exception (typically the source location of the raise
+statement generated by the compiler). The Line parameter when nonzero
+represents the line number in the source program where the raise occurs.
+
+@node No_Exception_Propagation
+@unnumberedsubsec No_Exception_Propagation
+@findex No_Exception_Propagation
+[GNAT] This restriction guarantees that exceptions are never propagated
+to an outer subprogram scope. The only case in which an exception may
+be raised is when the handler is statically in the same subprogram, so
+that the effect of a raise is essentially like a goto statement. Any
+other raise statement (implicit or explicit) will be considered
+unhandled. Exception handlers are allowed, but may not contain an
+exception occurrence identifier (exception choice). In addition, use of
+the package GNAT.Current_Exception is not permitted, and reraise
+statements (raise with no operand) are not permitted.
+
+@node No_Exception_Registration
+@unnumberedsubsec No_Exception_Registration
+@findex No_Exception_Registration
+[GNAT] This restriction ensures at compile time that no stream operations for
+types Exception_Id or Exception_Occurrence are used. This also makes it
+impossible to pass exceptions to or from a partition with this restriction
+in a distributed environment. If this exception is active, then the generated
+code is simplified by omitting the otherwise-required global registration
+of exceptions when they are declared.
+
+@node No_Exceptions
+@unnumberedsubsec No_Exceptions
+@findex No_Exceptions
+[RM H.4] This restriction ensures at compile time that there are no
+raise statements and no exception handlers.
+
+@node No_Finalization
+@unnumberedsubsec No_Finalization
+@findex No_Finalization
+[GNAT] This restriction disables the language features described in
+chapter 7.6 of the Ada 2005 RM as well as all form of code generation
+performed by the compiler to support these features. The following types
+are no longer considered controlled when this restriction is in effect:
+@itemize @bullet
+@item
+@code{Ada.Finalization.Controlled}
+@item
+@code{Ada.Finalization.Limited_Controlled}
+@item
+Derivations from @code{Controlled} or @code{Limited_Controlled}
+@item
+Class-wide types
+@item
+Protected types
+@item
+Task types
+@item
+Array and record types with controlled components
+@end itemize
+The compiler no longer generates code to initialize, finalize or adjust an
+object or a nested component, either declared on the stack or on the heap. The
+deallocation of a controlled object no longer finalizes its contents.
+
+@node No_Fixed_Point
+@unnumberedsubsec No_Fixed_Point
+@findex No_Fixed_Point
+[RM H.4] This restriction ensures at compile time that there are no
+occurrences of fixed point types and operations.
+
+@node No_Floating_Point
+@unnumberedsubsec No_Floating_Point
+@findex No_Floating_Point
+[RM H.4] This restriction ensures at compile time that there are no
+occurrences of floating point types and operations.
+
+@node No_Implicit_Conditionals
+@unnumberedsubsec No_Implicit_Conditionals
+@findex No_Implicit_Conditionals
+[GNAT] This restriction ensures that the generated code does not contain any
+implicit conditionals, either by modifying the generated code where possible,
+or by rejecting any construct that would otherwise generate an implicit
+conditional. Note that this check does not include run time constraint
+checks, which on some targets may generate implicit conditionals as
+well. To control the latter, constraint checks can be suppressed in the
+normal manner. Constructs generating implicit conditionals include comparisons
+of composite objects and the Max/Min attributes.
+
+@node No_Implicit_Dynamic_Code
+@unnumberedsubsec No_Implicit_Dynamic_Code
+@findex No_Implicit_Dynamic_Code
+@cindex trampoline
+[GNAT] This restriction prevents the compiler from building ``trampolines''.
+This is a structure that is built on the stack and contains dynamic
+code to be executed at run time. On some targets, a trampoline is
+built for the following features: @code{Access},
+@code{Unrestricted_Access}, or @code{Address} of a nested subprogram;
+nested task bodies; primitive operations of nested tagged types.
+Trampolines do not work on machines that prevent execution of stack
+data. For example, on windows systems, enabling DEP (data execution
+protection) will cause trampolines to raise an exception.
+Trampolines are also quite slow at run time.
+
+On many targets, trampolines have been largely eliminated. Look at the
+version of system.ads for your target --- if it has
+Always_Compatible_Rep equal to False, then trampolines are largely
+eliminated. In particular, a trampoline is built for the following
+features: @code{Address} of a nested subprogram;
+@code{Access} or @code{Unrestricted_Access} of a nested subprogram,
+but only if pragma Favor_Top_Level applies, or the access type has a
+foreign-language convention; primitive operations of nested tagged
+types.
+
+@node No_Implicit_Heap_Allocations
+@unnumberedsubsec No_Implicit_Heap_Allocations
+@findex No_Implicit_Heap_Allocations
+[RM D.7] No constructs are allowed to cause implicit heap allocation.
+
+@node No_Implicit_Loops
+@unnumberedsubsec No_Implicit_Loops
+@findex No_Implicit_Loops
+[GNAT] This restriction ensures that the generated code does not contain any
+implicit @code{for} loops, either by modifying
+the generated code where possible,
+or by rejecting any construct that would otherwise generate an implicit
+@code{for} loop. If this restriction is active, it is possible to build
+large array aggregates with all static components without generating an
+intermediate temporary, and without generating a loop to initialize individual
+components. Otherwise, a loop is created for arrays larger than about 5000
+scalar components.
+
+@node No_Initialize_Scalars
+@unnumberedsubsec No_Initialize_Scalars
+@findex No_Initialize_Scalars
+[GNAT] This restriction ensures that no unit in the partition is compiled with
+pragma Initialize_Scalars. This allows the generation of more efficient
+code, and in particular eliminates dummy null initialization routines that
+are otherwise generated for some record and array types.
+
+@node No_IO
+@unnumberedsubsec No_IO
+@findex No_IO
+[RM H.4] This restriction ensures at compile time that there are no
+dependences on any of the library units Sequential_IO, Direct_IO,
+Text_IO, Wide_Text_IO, Wide_Wide_Text_IO, or Stream_IO.
+
+@node No_Local_Allocators
+@unnumberedsubsec No_Local_Allocators
+@findex No_Local_Allocators
+[RM H.4] This restriction ensures at compile time that there are no
+occurrences of an allocator in subprograms, generic subprograms, tasks,
+and entry bodies.
+
+@node No_Local_Protected_Objects
+@unnumberedsubsec No_Local_Protected_Objects
+@findex No_Local_Protected_Objects
+[RM D.7] This restriction ensures at compile time that protected objects are
+only declared at the library level.
+
+@node No_Local_Timing_Events
+@unnumberedsubsec No_Local_Timing_Events
+@findex No_Local_Timing_Events
+[RM D.7] All objects of type Ada.Timing_Events.Timing_Event are
+declared at the library level.
+
+@node No_Nested_Finalization
+@unnumberedsubsec No_Nested_Finalization
+@findex No_Nested_Finalization
+[RM D.7] All objects requiring finalization are declared at the library level.
+
+@node No_Protected_Type_Allocators
+@unnumberedsubsec No_Protected_Type_Allocators
+@findex No_Protected_Type_Allocators
+[RM D.7] This restriction ensures at compile time that there are no allocator
+expressions that attempt to allocate protected objects.
+
+@node No_Protected_Types
+@unnumberedsubsec No_Protected_Types
+@findex No_Protected_Types
+[RM H.4] This restriction ensures at compile time that there are no
+declarations of protected types or protected objects.
+
+@node No_Recursion
+@unnumberedsubsec No_Recursion
+@findex No_Recursion
+[RM H.4] A program execution is erroneous if a subprogram is invoked as
+part of its execution.
+
+@node No_Reentrancy
+@unnumberedsubsec No_Reentrancy
+@findex No_Reentrancy
+[RM H.4] A program execution is erroneous if a subprogram is executed by
+two tasks at the same time.
+
+@node No_Relative_Delay
+@unnumberedsubsec No_Relative_Delay
+@findex No_Relative_Delay
+[RM D.7] This restriction ensures at compile time that there are no delay
+relative statements and prevents expressions such as @code{delay 1.23;} from
+appearing in source code.
+
+@node No_Requeue_Statements
+@unnumberedsubsec No_Requeue_Statements
+@findex No_Requeue_Statements
+[RM D.7] This restriction ensures at compile time that no requeue statements
+are permitted and prevents keyword @code{requeue} from being used in source
+code.
+
+@findex No_Requeue
+The restriction @code{No_Requeue} is recognized as a
+synonym for @code{No_Requeue_Statements}. This is retained for historical
+compatibility purposes (and a warning will be generated for its use if
+warnings on oNobsolescent features are activated).
+
+@node No_Secondary_Stack
+@unnumberedsubsec No_Secondary_Stack
+@findex No_Secondary_Stack
+[GNAT] This restriction ensures at compile time that the generated code
+does not contain any reference to the secondary stack. The secondary
+stack is used to implement functions returning unconstrained objects
+(arrays or records) on some targets.
+
+@node No_Select_Statements
+@unnumberedsubsec No_Select_Statements
+@findex No_Select_Statements
+[RM D.7] This restriction ensures at compile time no select statements of any
+kind are permitted, that is the keyword @code{select} may not appear.
+
+@node No_Specific_Termination_Handlers
+@unnumberedsubsec No_Specific_Termination_Handlers
+@findex No_Specific_Termination_Handlers
+[RM D.7] There are no calls to Ada.Task_Termination.Set_Specific_Handler
+or to Ada.Task_Termination.Specific_Handler.
+
+@node No_Specification_of_Aspect
+@unnumberedsubsec No_Specification_of_Aspect
+@findex No_Specification_of_Aspect
+[RM 13.12.1] This restriction checks at compile time that no aspect
+specification, attribute definition clause, or pragma is given for a
+given aspect.
+
+@node No_Standard_Allocators_After_Elaboration
+@unnumberedsubsec No_Standard_Allocators_After_Elaboration
+@findex No_Standard_Allocators_After_Elaboration
+[RM D.7] Specifies that an allocator using a standard storage pool
+should never be evaluated at run time after the elaboration of the
+library items of the partition has completed. Otherwise, Storage_Error
+is raised.
+
+@node No_Standard_Storage_Pools
+@unnumberedsubsec No_Standard_Storage_Pools
+@findex No_Standard_Storage_Pools
+[GNAT] This restriction ensures at compile time that no access types
+use the standard default storage pool. Any access type declared must
+have an explicit Storage_Pool attribute defined specifying a
+user-defined storage pool.
+
+@node No_Stream_Optimizations
+@unnumberedsubsec No_Stream_Optimizations
+@findex No_Stream_Optimizations
+[GNAT] This restriction affects the performance of stream operations on types
+@code{String}, @code{Wide_String} and @code{Wide_Wide_String}. By default, the
+compiler uses block reads and writes when manipulating @code{String} objects
+due to their supperior performance. When this restriction is in effect, the
+compiler performs all IO operations on a per-character basis.
+
+@node No_Streams
+@unnumberedsubsec No_Streams
+@findex No_Streams
+[GNAT] This restriction ensures at compile/bind time that there are no
+stream objects created and no use of stream attributes.
+This restriction does not forbid dependences on the package
+@code{Ada.Streams}. So it is permissible to with
+@code{Ada.Streams} (or another package that does so itself)
+as long as no actual stream objects are created and no
+stream attributes are used.
+
+Note that the use of restriction allows optimization of tagged types,
+since they do not need to worry about dispatching stream operations.
+To take maximum advantage of this space-saving optimization, any
+unit declaring a tagged type should be compiled with the restriction,
+though this is not required.
+
+@node No_Task_Allocators
+@unnumberedsubsec No_Task_Allocators
+@findex No_Task_Allocators
+[RM D.7] There are no allocators for task types
+or types containing task subcomponents.
+
+@node No_Task_Attributes_Package
+@unnumberedsubsec No_Task_Attributes_Package
+@findex No_Task_Attributes_Package
+[GNAT] This restriction ensures at compile time that there are no implicit or
+explicit dependencies on the package @code{Ada.Task_Attributes}.
+
+@findex No_Task_Attributes
+The restriction @code{No_Task_Attributes} is recognized as a synonym
+for @code{No_Task_Attributes_Package}. This is retained for historical
+compatibility purposes (and a warning will be generated for its use if
+warnings on obsolescent features are activated).
+
+@node No_Task_Hierarchy
+@unnumberedsubsec No_Task_Hierarchy
+@findex No_Task_Hierarchy
+[RM D.7] All (non-environment) tasks depend
+directly on the environment task of the partition.
+
+@node No_Task_Termination
+@unnumberedsubsec No_Task_Termination
+@findex No_Task_Termination
+[RM D.7] Tasks which terminate are erroneous.
+
+@node No_Tasking
+@unnumberedsubsec No_Tasking
+@findex No_Tasking
+[GNAT] This restriction prevents the declaration of tasks or task types
+throughout the partition. It is similar in effect to the use of
+@code{Max_Tasks => 0} except that violations are caught at compile time
+and cause an error message to be output either by the compiler or
+binder.
+
+@node No_Terminate_Alternatives
+@unnumberedsubsec No_Terminate_Alternatives
+@findex No_Terminate_Alternatives
+[RM D.7] There are no selective accepts with terminate alternatives.
+
+@node No_Unchecked_Access
+@unnumberedsubsec No_Unchecked_Access
+@findex No_Unchecked_Access
+[RM H.4] This restriction ensures at compile time that there are no
+occurrences of the Unchecked_Access attribute.
+
+@node Simple_Barriers
+@unnumberedsubsec Simple_Barriers
+@findex Simple_Barriers
+[RM D.7] This restriction ensures at compile time that barriers in entry
+declarations for protected types are restricted to either static boolean
+expressions or references to simple boolean variables defined in the private
+part of the protected type. No other form of entry barriers is permitted.
+
+@findex Boolean_Entry_Barriers
+The restriction @code{Boolean_Entry_Barriers} is recognized as a
+synonym for @code{Simple_Barriers}. This is retained for historical
+compatibility purposes (and a warning will be generated for its use if
+warnings on obsolescent features are activated).
+
+@node Static_Priorities
+@unnumberedsubsec Static_Priorities
+@findex Static_Priorities
+[GNAT] This restriction ensures at compile time that all priority expressions
+are static, and that there are no dependences on the package
+@code{Ada.Dynamic_Priorities}.
+
+@node Static_Storage_Size
+@unnumberedsubsec Static_Storage_Size
+@findex Static_Storage_Size
+[GNAT] This restriction ensures at compile time that any expression appearing
+in a Storage_Size pragma or attribute definition clause is static.
+
+@node Program Unit Level Restrictions
+@section Program Unit Level Restrictions
+
+@noindent
+The second set of restriction identifiers
+does not require partition-wide consistency.
+The restriction may be enforced for a single
+compilation unit without any effect on any of the
+other compilation units in the partition.
+
+@menu
+* No_Elaboration_Code::
+* No_Entry_Queue::
+* No_Implementation_Aspect_Specifications::
+* No_Implementation_Attributes::
+* No_Implementation_Identifiers::
+* No_Implementation_Pragmas::
+* No_Implementation_Restrictions::
+* No_Implementation_Units::
+* No_Implicit_Aliasing::
+* No_Obsolescent_Features::
+* No_Wide_Characters::
+* SPARK_05::
+@end menu
+
+@node No_Elaboration_Code
+@unnumberedsubsec No_Elaboration_Code
+@findex No_Elaboration_Code
+[GNAT] This restriction ensures at compile time that no elaboration code is
+generated. Note that this is not the same condition as is enforced
+by pragma @code{Preelaborate}. There are cases in which pragma
+@code{Preelaborate} still permits code to be generated (e.g.@: code
+to initialize a large array to all zeroes), and there are cases of units
+which do not meet the requirements for pragma @code{Preelaborate},
+but for which no elaboration code is generated. Generally, it is
+the case that preelaborable units will meet the restrictions, with
+the exception of large aggregates initialized with an others_clause,
+and exception declarations (which generate calls to a run-time
+registry procedure). This restriction is enforced on
+a unit by unit basis, it need not be obeyed consistently
+throughout a partition.
+
+In the case of aggregates with others, if the aggregate has a dynamic
+size, there is no way to eliminate the elaboration code (such dynamic
+bounds would be incompatible with @code{Preelaborate} in any case). If
+the bounds are static, then use of this restriction actually modifies
+the code choice of the compiler to avoid generating a loop, and instead
+generate the aggregate statically if possible, no matter how many times
+the data for the others clause must be repeatedly generated.
+
+It is not possible to precisely document
+the constructs which are compatible with this restriction, since,
+unlike most other restrictions, this is not a restriction on the
+source code, but a restriction on the generated object code. For
+example, if the source contains a declaration:
+
+@smallexample
+ Val : constant Integer := X;
+@end smallexample
+
+@noindent
+where X is not a static constant, it may be possible, depending
+on complex optimization circuitry, for the compiler to figure
+out the value of X at compile time, in which case this initialization
+can be done by the loader, and requires no initialization code. It
+is not possible to document the precise conditions under which the
+optimizer can figure this out.
+
+Note that this the implementation of this restriction requires full
+code generation. If it is used in conjunction with "semantics only"
+checking, then some cases of violations may be missed.
+
+@node No_Entry_Queue
+@unnumberedsubsec No_Entry_Queue
+@findex No_Entry_Queue
+[GNAT] This restriction is a declaration that any protected entry compiled in
+the scope of the restriction has at most one task waiting on the entry
+at any one time, and so no queue is required. This restriction is not
+checked at compile time. A program execution is erroneous if an attempt
+is made to queue a second task on such an entry.
+
+@node No_Implementation_Aspect_Specifications
+@unnumberedsubsec No_Implementation_Aspect_Specifications
+@findex No_Implementation_Aspect_Specifications
+[RM 13.12.1] This restriction checks at compile time that no
+GNAT-defined aspects are present. With this restriction, the only
+aspects that can be used are those defined in the Ada Reference Manual.
+
+@node No_Implementation_Attributes
+@unnumberedsubsec No_Implementation_Attributes
+@findex No_Implementation_Attributes
+[RM 13.12.1] This restriction checks at compile time that no
+GNAT-defined attributes are present. With this restriction, the only
+attributes that can be used are those defined in the Ada Reference
+Manual.
+
+@node No_Implementation_Identifiers
+@unnumberedsubsec No_Implementation_Identifiers
+@findex No_Implementation_Identifiers
+[RM 13.12.1] This restriction checks at compile time that no
+implementation-defined identifiers (marked with pragma Implementation_Defined)
+occur within language-defined packages.
+
+@node No_Implementation_Pragmas
+@unnumberedsubsec No_Implementation_Pragmas
+@findex No_Implementation_Pragmas
+[RM 13.12.1] This restriction checks at compile time that no
+GNAT-defined pragmas are present. With this restriction, the only
+pragmas that can be used are those defined in the Ada Reference Manual.
+
+@node No_Implementation_Restrictions
+@unnumberedsubsec No_Implementation_Restrictions
+@findex No_Implementation_Restrictions
+[GNAT] This restriction checks at compile time that no GNAT-defined restriction
+identifiers (other than @code{No_Implementation_Restrictions} itself)
+are present. With this restriction, the only other restriction identifiers
+that can be used are those defined in the Ada Reference Manual.
+
+@node No_Implementation_Units
+@unnumberedsubsec No_Implementation_Units
+@findex No_Implementation_Units
+[RM 13.12.1] This restriction checks at compile time that there is no
+mention in the context clause of any implementation-defined descendants
+of packages Ada, Interfaces, or System.
+
+@node No_Implicit_Aliasing
+@unnumberedsubsec No_Implicit_Aliasing
+@findex No_Implicit_Aliasing
+[GNAT] This restriction, which is not required to be partition-wide consistent,
+requires an explicit aliased keyword for an object to which 'Access,
+'Unchecked_Access, or 'Address is applied, and forbids entirely the use of
+the 'Unrestricted_Access attribute for objects. Note: the reason that
+Unrestricted_Access is forbidden is that it would require the prefix
+to be aliased, and in such cases, it can always be replaced by
+the standard attribute Unchecked_Access which is preferable.
+
+@node No_Obsolescent_Features
+@unnumberedsubsec No_Obsolescent_Features
+@findex No_Obsolescent_Features
+[RM 13.12.1] This restriction checks at compile time that no obsolescent
+features are used, as defined in Annex J of the Ada Reference Manual.
+
+@node No_Wide_Characters
+@unnumberedsubsec No_Wide_Characters
+@findex No_Wide_Characters
+[GNAT] This restriction ensures at compile time that no uses of the types
+@code{Wide_Character} or @code{Wide_String} or corresponding wide
+wide types
+appear, and that no wide or wide wide string or character literals
+appear in the program (that is literals representing characters not in
+type @code{Character}).
+
+@node SPARK_05
+@unnumberedsubsec SPARK_05
+@findex SPARK_05
+[GNAT] This restriction checks at compile time that some constructs
+forbidden in SPARK 2005 are not present. Error messages related to
+SPARK restriction have the form:
+
+@findex SPARK
+The restriction @code{SPARK} is recognized as a
+synonym for @code{SPARK_05}. This is retained for historical
+compatibility purposes (and an unconditional warning will be generated
+for its use, advising replacement by @code{SPARK}.
+
+@smallexample
+violation of restriction "SPARK" at <file>
+ <error message>
+@end smallexample
+
+This is not a replacement for the semantic checks performed by the
+SPARK Examiner tool, as the compiler only deals currently with code,
+not at all with SPARK 2005 annotations and does not guarantee catching all
+cases of constructs forbidden by SPARK 2005.
+
+Thus it may well be the case that code which passes the compiler with
+the SPARK restriction is rejected by the SPARK Examiner, e.g. due to
+the different visibility rules of the Examiner based on SPARK 2005
+@code{inherit} annotations.
+
+This restriction can be useful in providing an initial filter for code
+developed using SPARK 2005, or in examining legacy code to see how far
+it is from meeting SPARK restrictions.
+
+Note that if a unit is compiled in Ada 95 mode with SPARK restriction,
+violations will be reported for constructs forbidden in SPARK 95,
+instead of SPARK 2005.
+
+@c ------------------------
+@node Implementation Advice
+@chapter Implementation Advice
+@noindent
+The main text of the Ada Reference Manual describes the required
+behavior of all Ada compilers, and the GNAT compiler conforms to
+these requirements.
+
+In addition, there are sections throughout the Ada Reference Manual headed
+by the phrase ``Implementation advice''. These sections are not normative,
+i.e., they do not specify requirements that all compilers must
+follow. Rather they provide advice on generally desirable behavior. You
+may wonder why they are not requirements. The most typical answer is
+that they describe behavior that seems generally desirable, but cannot
+be provided on all systems, or which may be undesirable on some systems.
+
+As far as practical, GNAT follows the implementation advice sections in
+the Ada Reference Manual. This chapter contains a table giving the
+reference manual section number, paragraph number and several keywords
+for each advice. Each entry consists of the text of the advice followed
+by the GNAT interpretation of this advice. Most often, this simply says
+``followed'', which means that GNAT follows the advice. However, in a
+number of cases, GNAT deliberately deviates from this advice, in which
+case the text describes what GNAT does and why.
+
+@cindex Error detection
+@unnumberedsec 1.1.3(20): Error Detection
+@sp 1
+@cartouche
+If an implementation detects the use of an unsupported Specialized Needs
+Annex feature at run time, it should raise @code{Program_Error} if
+feasible.
+@end cartouche
+Not relevant. All specialized needs annex features are either supported,
+or diagnosed at compile time.
+
+@cindex Child Units
+@unnumberedsec 1.1.3(31): Child Units
+@sp 1
+@cartouche
+If an implementation wishes to provide implementation-defined
+extensions to the functionality of a language-defined library unit, it
+should normally do so by adding children to the library unit.
+@end cartouche
+Followed.
+
+@cindex Bounded errors
+@unnumberedsec 1.1.5(12): Bounded Errors
+@sp 1
+@cartouche
+If an implementation detects a bounded error or erroneous
+execution, it should raise @code{Program_Error}.
+@end cartouche
+Followed in all cases in which the implementation detects a bounded
+error or erroneous execution. Not all such situations are detected at
+runtime.
+
+@cindex Pragmas
+@unnumberedsec 2.8(16): Pragmas
+@sp 1
+@cartouche
+Normally, implementation-defined pragmas should have no semantic effect
+for error-free programs; that is, if the implementation-defined pragmas
+are removed from a working program, the program should still be legal,
+and should still have the same semantics.
+@end cartouche
+The following implementation defined pragmas are exceptions to this
+rule:
+
+@table @code
+@item Abort_Defer
+Affects semantics
+@item Ada_83
+Affects legality
+@item Assert
+Affects semantics
+@item CPP_Class
+Affects semantics
+@item CPP_Constructor
+Affects semantics
+@item Debug
+Affects semantics
+@item Interface_Name
+Affects semantics
+@item Machine_Attribute
+Affects semantics
+@item Unimplemented_Unit
+Affects legality
+@item Unchecked_Union
+Affects semantics
+@end table
+
+@noindent
+In each of the above cases, it is essential to the purpose of the pragma
+that this advice not be followed. For details see the separate section
+on implementation defined pragmas.
+
+@unnumberedsec 2.8(17-19): Pragmas
+@sp 1
+@cartouche
+Normally, an implementation should not define pragmas that can
+make an illegal program legal, except as follows:
+@end cartouche
+@sp 1
+@cartouche
+A pragma used to complete a declaration, such as a pragma @code{Import};
+@end cartouche
+@sp 1
+@cartouche
+A pragma used to configure the environment by adding, removing, or
+replacing @code{library_items}.
+@end cartouche
+See response to paragraph 16 of this same section.
+
+@cindex Character Sets
+@cindex Alternative Character Sets
+@unnumberedsec 3.5.2(5): Alternative Character Sets
+@sp 1
+@cartouche
+If an implementation supports a mode with alternative interpretations
+for @code{Character} and @code{Wide_Character}, the set of graphic
+characters of @code{Character} should nevertheless remain a proper
+subset of the set of graphic characters of @code{Wide_Character}. Any
+character set ``localizations'' should be reflected in the results of
+the subprograms defined in the language-defined package
+@code{Characters.Handling} (see A.3) available in such a mode. In a mode with
+an alternative interpretation of @code{Character}, the implementation should
+also support a corresponding change in what is a legal
+@code{identifier_letter}.
+@end cartouche
+Not all wide character modes follow this advice, in particular the JIS
+and IEC modes reflect standard usage in Japan, and in these encoding,
+the upper half of the Latin-1 set is not part of the wide-character
+subset, since the most significant bit is used for wide character
+encoding. However, this only applies to the external forms. Internally
+there is no such restriction.
+
+@cindex Integer types
+@unnumberedsec 3.5.4(28): Integer Types
+
+@sp 1
+@cartouche
+An implementation should support @code{Long_Integer} in addition to
+@code{Integer} if the target machine supports 32-bit (or longer)
+arithmetic. No other named integer subtypes are recommended for package
+@code{Standard}. Instead, appropriate named integer subtypes should be
+provided in the library package @code{Interfaces} (see B.2).
+@end cartouche
+@code{Long_Integer} is supported. Other standard integer types are supported
+so this advice is not fully followed. These types
+are supported for convenient interface to C, and so that all hardware
+types of the machine are easily available.
+@unnumberedsec 3.5.4(29): Integer Types
+
+@sp 1
+@cartouche
+An implementation for a two's complement machine should support
+modular types with a binary modulus up to @code{System.Max_Int*2+2}. An
+implementation should support a non-binary modules up to @code{Integer'Last}.
+@end cartouche
+Followed.
+
+@cindex Enumeration values
+@unnumberedsec 3.5.5(8): Enumeration Values
+@sp 1
+@cartouche
+For the evaluation of a call on @code{@var{S}'Pos} for an enumeration
+subtype, if the value of the operand does not correspond to the internal
+code for any enumeration literal of its type (perhaps due to an
+un-initialized variable), then the implementation should raise
+@code{Program_Error}. This is particularly important for enumeration
+types with noncontiguous internal codes specified by an
+enumeration_representation_clause.
+@end cartouche
+Followed.
+
+@cindex Float types
+@unnumberedsec 3.5.7(17): Float Types
+@sp 1
+@cartouche
+An implementation should support @code{Long_Float} in addition to
+@code{Float} if the target machine supports 11 or more digits of
+precision. No other named floating point subtypes are recommended for
+package @code{Standard}. Instead, appropriate named floating point subtypes
+should be provided in the library package @code{Interfaces} (see B.2).
+@end cartouche
+@code{Short_Float} and @code{Long_Long_Float} are also provided. The
+former provides improved compatibility with other implementations
+supporting this type. The latter corresponds to the highest precision
+floating-point type supported by the hardware. On most machines, this
+will be the same as @code{Long_Float}, but on some machines, it will
+correspond to the IEEE extended form. The notable case is all ia32
+(x86) implementations, where @code{Long_Long_Float} corresponds to
+the 80-bit extended precision format supported in hardware on this
+processor. Note that the 128-bit format on SPARC is not supported,
+since this is a software rather than a hardware format.
+
+@cindex Multidimensional arrays
+@cindex Arrays, multidimensional
+@unnumberedsec 3.6.2(11): Multidimensional Arrays
+@sp 1
+@cartouche
+An implementation should normally represent multidimensional arrays in
+row-major order, consistent with the notation used for multidimensional
+array aggregates (see 4.3.3). However, if a pragma @code{Convention}
+(@code{Fortran}, @dots{}) applies to a multidimensional array type, then
+column-major order should be used instead (see B.5, ``Interfacing with
+Fortran'').
+@end cartouche
+Followed.
+
+@findex Duration'Small
+@unnumberedsec 9.6(30-31): Duration'Small
+@sp 1
+@cartouche
+Whenever possible in an implementation, the value of @code{Duration'Small}
+should be no greater than 100 microseconds.
+@end cartouche
+Followed. (@code{Duration'Small} = 10**(@minus{}9)).
+
+@sp 1
+@cartouche
+The time base for @code{delay_relative_statements} should be monotonic;
+it need not be the same time base as used for @code{Calendar.Clock}.
+@end cartouche
+Followed.
+
+@unnumberedsec 10.2.1(12): Consistent Representation
+@sp 1
+@cartouche
+In an implementation, a type declared in a pre-elaborated package should
+have the same representation in every elaboration of a given version of
+the package, whether the elaborations occur in distinct executions of
+the same program, or in executions of distinct programs or partitions
+that include the given version.
+@end cartouche
+Followed, except in the case of tagged types. Tagged types involve
+implicit pointers to a local copy of a dispatch table, and these pointers
+have representations which thus depend on a particular elaboration of the
+package. It is not easy to see how it would be possible to follow this
+advice without severely impacting efficiency of execution.
+
+@cindex Exception information
+@unnumberedsec 11.4.1(19): Exception Information
+@sp 1
+@cartouche
+@code{Exception_Message} by default and @code{Exception_Information}
+should produce information useful for
+debugging. @code{Exception_Message} should be short, about one
+line. @code{Exception_Information} can be long. @code{Exception_Message}
+should not include the
+@code{Exception_Name}. @code{Exception_Information} should include both
+the @code{Exception_Name} and the @code{Exception_Message}.
+@end cartouche
+Followed. For each exception that doesn't have a specified
+@code{Exception_Message}, the compiler generates one containing the location
+of the raise statement. This location has the form ``file:line'', where
+file is the short file name (without path information) and line is the line
+number in the file. Note that in the case of the Zero Cost Exception
+mechanism, these messages become redundant with the Exception_Information that
+contains a full backtrace of the calling sequence, so they are disabled.
+To disable explicitly the generation of the source location message, use the
+Pragma @code{Discard_Names}.
+
+@cindex Suppression of checks
+@cindex Checks, suppression of
+@unnumberedsec 11.5(28): Suppression of Checks
+@sp 1
+@cartouche
+The implementation should minimize the code executed for checks that
+have been suppressed.
+@end cartouche
+Followed.
+
+@cindex Representation clauses
+@unnumberedsec 13.1 (21-24): Representation Clauses
+@sp 1
+@cartouche
+The recommended level of support for all representation items is
+qualified as follows:
+@end cartouche
+@sp 1
+@cartouche
+An implementation need not support representation items containing
+non-static expressions, except that an implementation should support a
+representation item for a given entity if each non-static expression in
+the representation item is a name that statically denotes a constant
+declared before the entity.
+@end cartouche
+Followed. In fact, GNAT goes beyond the recommended level of support
+by allowing nonstatic expressions in some representation clauses even
+without the need to declare constants initialized with the values of
+such expressions.
+For example:
+
+@smallexample @c ada
+ X : Integer;
+ Y : Float;
+ for Y'Address use X'Address;>>
+@end smallexample
+
+@sp 1
+@cartouche
+An implementation need not support a specification for the @code{Size}
+for a given composite subtype, nor the size or storage place for an
+object (including a component) of a given composite subtype, unless the
+constraints on the subtype and its composite subcomponents (if any) are
+all static constraints.
+@end cartouche
+Followed. Size Clauses are not permitted on non-static components, as
+described above.
+
+@sp 1
+@cartouche
+An aliased component, or a component whose type is by-reference, should
+always be allocated at an addressable location.
+@end cartouche
+Followed.
+
+@cindex Packed types
+@unnumberedsec 13.2(6-8): Packed Types
+@sp 1
+@cartouche
+If a type is packed, then the implementation should try to minimize
+storage allocated to objects of the type, possibly at the expense of
+speed of accessing components, subject to reasonable complexity in
+addressing calculations.
+@end cartouche
+@sp 1
+@cartouche
+The recommended level of support pragma @code{Pack} is:
+
+For a packed record type, the components should be packed as tightly as
+possible subject to the Sizes of the component subtypes, and subject to
+any @code{record_representation_clause} that applies to the type; the
+implementation may, but need not, reorder components or cross aligned
+word boundaries to improve the packing. A component whose @code{Size} is
+greater than the word size may be allocated an integral number of words.
+@end cartouche
+Followed. Tight packing of arrays is supported for all component sizes
+up to 64-bits. If the array component size is 1 (that is to say, if
+the component is a boolean type or an enumeration type with two values)
+then values of the type are implicitly initialized to zero. This
+happens both for objects of the packed type, and for objects that have a
+subcomponent of the packed type.
+
+@sp 1
+@cartouche
+An implementation should support Address clauses for imported
+subprograms.
+@end cartouche
+Followed.
+@cindex @code{Address} clauses
+@unnumberedsec 13.3(14-19): Address Clauses
+
+@sp 1
+@cartouche
+For an array @var{X}, @code{@var{X}'Address} should point at the first
+component of the array, and not at the array bounds.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+The recommended level of support for the @code{Address} attribute is:
+
+@code{@var{X}'Address} should produce a useful result if @var{X} is an
+object that is aliased or of a by-reference type, or is an entity whose
+@code{Address} has been specified.
+@end cartouche
+Followed. A valid address will be produced even if none of those
+conditions have been met. If necessary, the object is forced into
+memory to ensure the address is valid.
+
+@sp 1
+@cartouche
+An implementation should support @code{Address} clauses for imported
+subprograms.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+Objects (including subcomponents) that are aliased or of a by-reference
+type should be allocated on storage element boundaries.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+If the @code{Address} of an object is specified, or it is imported or exported,
+then the implementation should not perform optimizations based on
+assumptions of no aliases.
+@end cartouche
+Followed.
+
+@cindex @code{Alignment} clauses
+@unnumberedsec 13.3(29-35): Alignment Clauses
+@sp 1
+@cartouche
+The recommended level of support for the @code{Alignment} attribute for
+subtypes is:
+
+An implementation should support specified Alignments that are factors
+and multiples of the number of storage elements per word, subject to the
+following:
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An implementation need not support specified @code{Alignment}s for
+combinations of @code{Size}s and @code{Alignment}s that cannot be easily
+loaded and stored by available machine instructions.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An implementation need not support specified @code{Alignment}s that are
+greater than the maximum @code{Alignment} the implementation ever returns by
+default.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+The recommended level of support for the @code{Alignment} attribute for
+objects is:
+
+Same as above, for subtypes, but in addition:
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+For stand-alone library-level objects of statically constrained
+subtypes, the implementation should support all @code{Alignment}s
+supported by the target linker. For example, page alignment is likely to
+be supported for such objects, but not for subtypes.
+@end cartouche
+Followed.
+
+@cindex @code{Size} clauses
+@unnumberedsec 13.3(42-43): Size Clauses
+@sp 1
+@cartouche
+The recommended level of support for the @code{Size} attribute of
+objects is:
+
+A @code{Size} clause should be supported for an object if the specified
+@code{Size} is at least as large as its subtype's @code{Size}, and
+corresponds to a size in storage elements that is a multiple of the
+object's @code{Alignment} (if the @code{Alignment} is nonzero).
+@end cartouche
+Followed.
+
+@unnumberedsec 13.3(50-56): Size Clauses
+@sp 1
+@cartouche
+If the @code{Size} of a subtype is specified, and allows for efficient
+independent addressability (see 9.10) on the target architecture, then
+the @code{Size} of the following objects of the subtype should equal the
+@code{Size} of the subtype:
+
+Aliased objects (including components).
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+@code{Size} clause on a composite subtype should not affect the
+internal layout of components.
+@end cartouche
+Followed. But note that this can be overridden by use of the implementation
+pragma Implicit_Packing in the case of packed arrays.
+
+@sp 1
+@cartouche
+The recommended level of support for the @code{Size} attribute of subtypes is:
+@end cartouche
+@sp 1
+@cartouche
+The @code{Size} (if not specified) of a static discrete or fixed point
+subtype should be the number of bits needed to represent each value
+belonging to the subtype using an unbiased representation, leaving space
+for a sign bit only if the subtype contains negative values. If such a
+subtype is a first subtype, then an implementation should support a
+specified @code{Size} for it that reflects this representation.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+For a subtype implemented with levels of indirection, the @code{Size}
+should include the size of the pointers, but not the size of what they
+point at.
+@end cartouche
+Followed.
+
+@cindex @code{Component_Size} clauses
+@unnumberedsec 13.3(71-73): Component Size Clauses
+@sp 1
+@cartouche
+The recommended level of support for the @code{Component_Size}
+attribute is:
+@end cartouche
+@sp 1
+@cartouche
+An implementation need not support specified @code{Component_Sizes} that are
+less than the @code{Size} of the component subtype.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An implementation should support specified @code{Component_Size}s that
+are factors and multiples of the word size. For such
+@code{Component_Size}s, the array should contain no gaps between
+components. For other @code{Component_Size}s (if supported), the array
+should contain no gaps between components when packing is also
+specified; the implementation should forbid this combination in cases
+where it cannot support a no-gaps representation.
+@end cartouche
+Followed.
+
+@cindex Enumeration representation clauses
+@cindex Representation clauses, enumeration
+@unnumberedsec 13.4(9-10): Enumeration Representation Clauses
+@sp 1
+@cartouche
+The recommended level of support for enumeration representation clauses
+is:
+
+An implementation need not support enumeration representation clauses
+for boolean types, but should at minimum support the internal codes in
+the range @code{System.Min_Int.System.Max_Int}.
+@end cartouche
+Followed.
+
+@cindex Record representation clauses
+@cindex Representation clauses, records
+@unnumberedsec 13.5.1(17-22): Record Representation Clauses
+@sp 1
+@cartouche
+The recommended level of support for
+@*@code{record_representation_clauses} is:
+
+An implementation should support storage places that can be extracted
+with a load, mask, shift sequence of machine code, and set with a load,
+shift, mask, store sequence, given the available machine instructions
+and run-time model.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+A storage place should be supported if its size is equal to the
+@code{Size} of the component subtype, and it starts and ends on a
+boundary that obeys the @code{Alignment} of the component subtype.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+If the default bit ordering applies to the declaration of a given type,
+then for a component whose subtype's @code{Size} is less than the word
+size, any storage place that does not cross an aligned word boundary
+should be supported.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An implementation may reserve a storage place for the tag field of a
+tagged type, and disallow other components from overlapping that place.
+@end cartouche
+Followed. The storage place for the tag field is the beginning of the tagged
+record, and its size is Address'Size. GNAT will reject an explicit component
+clause for the tag field.
+
+@sp 1
+@cartouche
+An implementation need not support a @code{component_clause} for a
+component of an extension part if the storage place is not after the
+storage places of all components of the parent type, whether or not
+those storage places had been specified.
+@end cartouche
+Followed. The above advice on record representation clauses is followed,
+and all mentioned features are implemented.
+
+@cindex Storage place attributes
+@unnumberedsec 13.5.2(5): Storage Place Attributes
+@sp 1
+@cartouche
+If a component is represented using some form of pointer (such as an
+offset) to the actual data of the component, and this data is contiguous
+with the rest of the object, then the storage place attributes should
+reflect the place of the actual data, not the pointer. If a component is
+allocated discontinuously from the rest of the object, then a warning
+should be generated upon reference to one of its storage place
+attributes.
+@end cartouche
+Followed. There are no such components in GNAT@.
+
+@cindex Bit ordering
+@unnumberedsec 13.5.3(7-8): Bit Ordering
+@sp 1
+@cartouche
+The recommended level of support for the non-default bit ordering is:
+@end cartouche
+@sp 1
+@cartouche
+If @code{Word_Size} = @code{Storage_Unit}, then the implementation
+should support the non-default bit ordering in addition to the default
+bit ordering.
+@end cartouche
+Followed. Word size does not equal storage size in this implementation.
+Thus non-default bit ordering is not supported.
+
+@cindex @code{Address}, as private type
+@unnumberedsec 13.7(37): Address as Private
+@sp 1
+@cartouche
+@code{Address} should be of a private type.
+@end cartouche
+Followed.
+
+@cindex Operations, on @code{Address}
+@cindex @code{Address}, operations of
+@unnumberedsec 13.7.1(16): Address Operations
+@sp 1
+@cartouche
+Operations in @code{System} and its children should reflect the target
+environment semantics as closely as is reasonable. For example, on most
+machines, it makes sense for address arithmetic to ``wrap around''.
+Operations that do not make sense should raise @code{Program_Error}.
+@end cartouche
+Followed. Address arithmetic is modular arithmetic that wraps around. No
+operation raises @code{Program_Error}, since all operations make sense.
+
+@cindex Unchecked conversion
+@unnumberedsec 13.9(14-17): Unchecked Conversion
+@sp 1
+@cartouche
+The @code{Size} of an array object should not include its bounds; hence,
+the bounds should not be part of the converted data.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+The implementation should not generate unnecessary run-time checks to
+ensure that the representation of @var{S} is a representation of the
+target type. It should take advantage of the permission to return by
+reference when possible. Restrictions on unchecked conversions should be
+avoided unless required by the target environment.
+@end cartouche
+Followed. There are no restrictions on unchecked conversion. A warning is
+generated if the source and target types do not have the same size since
+the semantics in this case may be target dependent.
+
+@sp 1
+@cartouche
+The recommended level of support for unchecked conversions is:
+@end cartouche
+@sp 1
+@cartouche
+Unchecked conversions should be supported and should be reversible in
+the cases where this clause defines the result. To enable meaningful use
+of unchecked conversion, a contiguous representation should be used for
+elementary subtypes, for statically constrained array subtypes whose
+component subtype is one of the subtypes described in this paragraph,
+and for record subtypes without discriminants whose component subtypes
+are described in this paragraph.
+@end cartouche
+Followed.
+
+@cindex Heap usage, implicit
+@unnumberedsec 13.11(23-25): Implicit Heap Usage
+@sp 1
+@cartouche
+An implementation should document any cases in which it dynamically
+allocates heap storage for a purpose other than the evaluation of an
+allocator.
+@end cartouche
+Followed, the only other points at which heap storage is dynamically
+allocated are as follows:
+
+@itemize @bullet
+@item
+At initial elaboration time, to allocate dynamically sized global
+objects.
+
+@item
+To allocate space for a task when a task is created.
+
+@item
+To extend the secondary stack dynamically when needed. The secondary
+stack is used for returning variable length results.
+@end itemize
+
+@sp 1
+@cartouche
+A default (implementation-provided) storage pool for an
+access-to-constant type should not have overhead to support deallocation of
+individual objects.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+A storage pool for an anonymous access type should be created at the
+point of an allocator for the type, and be reclaimed when the designated
+object becomes inaccessible.
+@end cartouche
+Followed.
+
+@cindex Unchecked deallocation
+@unnumberedsec 13.11.2(17): Unchecked De-allocation
+@sp 1
+@cartouche
+For a standard storage pool, @code{Free} should actually reclaim the
+storage.
+@end cartouche
+Followed.
+
+@cindex Stream oriented attributes
+@unnumberedsec 13.13.2(17): Stream Oriented Attributes
+@sp 1
+@cartouche
+If a stream element is the same size as a storage element, then the
+normal in-memory representation should be used by @code{Read} and
+@code{Write} for scalar objects. Otherwise, @code{Read} and @code{Write}
+should use the smallest number of stream elements needed to represent
+all values in the base range of the scalar type.
+@end cartouche
+
+Followed. By default, GNAT uses the interpretation suggested by AI-195,
+which specifies using the size of the first subtype.
+However, such an implementation is based on direct binary
+representations and is therefore target- and endianness-dependent.
+To address this issue, GNAT also supplies an alternate implementation
+of the stream attributes @code{Read} and @code{Write},
+which uses the target-independent XDR standard representation
+for scalar types.
+@cindex XDR representation
+@cindex @code{Read} attribute
+@cindex @code{Write} attribute
+@cindex Stream oriented attributes
+The XDR implementation is provided as an alternative body of the
+@code{System.Stream_Attributes} package, in the file
+@file{s-stratt-xdr.adb} in the GNAT library.
+There is no @file{s-stratt-xdr.ads} file.
+In order to install the XDR implementation, do the following:
+@enumerate
+@item Replace the default implementation of the
+@code{System.Stream_Attributes} package with the XDR implementation.
+For example on a Unix platform issue the commands:
+@smallexample
+$ mv s-stratt.adb s-stratt-default.adb
+$ mv s-stratt-xdr.adb s-stratt.adb
+@end smallexample
+
+@item
+Rebuild the GNAT run-time library as documented in
+@ref{GNAT and Libraries,,, gnat_ugn, @value{EDITION} User's Guide}.
+@end enumerate
+
+@unnumberedsec A.1(52): Names of Predefined Numeric Types
+@sp 1
+@cartouche
+If an implementation provides additional named predefined integer types,
+then the names should end with @samp{Integer} as in
+@samp{Long_Integer}. If an implementation provides additional named
+predefined floating point types, then the names should end with
+@samp{Float} as in @samp{Long_Float}.
+@end cartouche
+Followed.
+
+@findex Ada.Characters.Handling
+@unnumberedsec A.3.2(49): @code{Ada.Characters.Handling}
+@sp 1
+@cartouche
+If an implementation provides a localized definition of @code{Character}
+or @code{Wide_Character}, then the effects of the subprograms in
+@code{Characters.Handling} should reflect the localizations. See also
+3.5.2.
+@end cartouche
+Followed. GNAT provides no such localized definitions.
+
+@cindex Bounded-length strings
+@unnumberedsec A.4.4(106): Bounded-Length String Handling
+@sp 1
+@cartouche
+Bounded string objects should not be implemented by implicit pointers
+and dynamic allocation.
+@end cartouche
+Followed. No implicit pointers or dynamic allocation are used.
+
+@cindex Random number generation
+@unnumberedsec A.5.2(46-47): Random Number Generation
+@sp 1
+@cartouche
+Any storage associated with an object of type @code{Generator} should be
+reclaimed on exit from the scope of the object.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+If the generator period is sufficiently long in relation to the number
+of distinct initiator values, then each possible value of
+@code{Initiator} passed to @code{Reset} should initiate a sequence of
+random numbers that does not, in a practical sense, overlap the sequence
+initiated by any other value. If this is not possible, then the mapping
+between initiator values and generator states should be a rapidly
+varying function of the initiator value.
+@end cartouche
+Followed. The generator period is sufficiently long for the first
+condition here to hold true.
+
+@findex Get_Immediate
+@unnumberedsec A.10.7(23): @code{Get_Immediate}
+@sp 1
+@cartouche
+The @code{Get_Immediate} procedures should be implemented with
+unbuffered input. For a device such as a keyboard, input should be
+@dfn{available} if a key has already been typed, whereas for a disk
+file, input should always be available except at end of file. For a file
+associated with a keyboard-like device, any line-editing features of the
+underlying operating system should be disabled during the execution of
+@code{Get_Immediate}.
+@end cartouche
+Followed on all targets except VxWorks. For VxWorks, there is no way to
+provide this functionality that does not result in the input buffer being
+flushed before the @code{Get_Immediate} call. A special unit
+@code{Interfaces.Vxworks.IO} is provided that contains routines to enable
+this functionality.
+
+@findex Export
+@unnumberedsec B.1(39-41): Pragma @code{Export}
+@sp 1
+@cartouche
+If an implementation supports pragma @code{Export} to a given language,
+then it should also allow the main subprogram to be written in that
+language. It should support some mechanism for invoking the elaboration
+of the Ada library units included in the system, and for invoking the
+finalization of the environment task. On typical systems, the
+recommended mechanism is to provide two subprograms whose link names are
+@code{adainit} and @code{adafinal}. @code{adainit} should contain the
+elaboration code for library units. @code{adafinal} should contain the
+finalization code. These subprograms should have no effect the second
+and subsequent time they are called.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+Automatic elaboration of pre-elaborated packages should be
+provided when pragma @code{Export} is supported.
+@end cartouche
+Followed when the main program is in Ada. If the main program is in a
+foreign language, then
+@code{adainit} must be called to elaborate pre-elaborated
+packages.
+
+@sp 1
+@cartouche
+For each supported convention @var{L} other than @code{Intrinsic}, an
+implementation should support @code{Import} and @code{Export} pragmas
+for objects of @var{L}-compatible types and for subprograms, and pragma
+@code{Convention} for @var{L}-eligible types and for subprograms,
+presuming the other language has corresponding features. Pragma
+@code{Convention} need not be supported for scalar types.
+@end cartouche
+Followed.
+
+@cindex Package @code{Interfaces}
+@findex Interfaces
+@unnumberedsec B.2(12-13): Package @code{Interfaces}
+@sp 1
+@cartouche
+For each implementation-defined convention identifier, there should be a
+child package of package Interfaces with the corresponding name. This
+package should contain any declarations that would be useful for
+interfacing to the language (implementation) represented by the
+convention. Any declarations useful for interfacing to any language on
+the given hardware architecture should be provided directly in
+@code{Interfaces}.
+@end cartouche
+Followed. An additional package not defined
+in the Ada Reference Manual is @code{Interfaces.CPP}, used
+for interfacing to C++.
+
+@sp 1
+@cartouche
+An implementation supporting an interface to C, COBOL, or Fortran should
+provide the corresponding package or packages described in the following
+clauses.
+@end cartouche
+Followed. GNAT provides all the packages described in this section.
+
+@cindex C, interfacing with
+@unnumberedsec B.3(63-71): Interfacing with C
+@sp 1
+@cartouche
+An implementation should support the following interface correspondences
+between Ada and C@.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada procedure corresponds to a void-returning C function.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada function corresponds to a non-void C function.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada @code{in} scalar parameter is passed as a scalar argument to a C
+function.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada @code{in} parameter of an access-to-object type with designated
+type @var{T} is passed as a @code{@var{t}*} argument to a C function,
+where @var{t} is the C type corresponding to the Ada type @var{T}.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada access @var{T} parameter, or an Ada @code{out} or @code{in out}
+parameter of an elementary type @var{T}, is passed as a @code{@var{t}*}
+argument to a C function, where @var{t} is the C type corresponding to
+the Ada type @var{T}. In the case of an elementary @code{out} or
+@code{in out} parameter, a pointer to a temporary copy is used to
+preserve by-copy semantics.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada parameter of a record type @var{T}, of any mode, is passed as a
+@code{@var{t}*} argument to a C function, where @var{t} is the C
+structure corresponding to the Ada type @var{T}.
+@end cartouche
+Followed. This convention may be overridden by the use of the C_Pass_By_Copy
+pragma, or Convention, or by explicitly specifying the mechanism for a given
+call using an extended import or export pragma.
+
+@sp 1
+@cartouche
+An Ada parameter of an array type with component type @var{T}, of any
+mode, is passed as a @code{@var{t}*} argument to a C function, where
+@var{t} is the C type corresponding to the Ada type @var{T}.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada parameter of an access-to-subprogram type is passed as a pointer
+to a C function whose prototype corresponds to the designated
+subprogram's specification.
+@end cartouche
+Followed.
+
+@cindex COBOL, interfacing with
+@unnumberedsec B.4(95-98): Interfacing with COBOL
+@sp 1
+@cartouche
+An Ada implementation should support the following interface
+correspondences between Ada and COBOL@.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada access @var{T} parameter is passed as a @samp{BY REFERENCE} data item of
+the COBOL type corresponding to @var{T}.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada in scalar parameter is passed as a @samp{BY CONTENT} data item of
+the corresponding COBOL type.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+Any other Ada parameter is passed as a @samp{BY REFERENCE} data item of the
+COBOL type corresponding to the Ada parameter type; for scalars, a local
+copy is used if necessary to ensure by-copy semantics.
+@end cartouche
+Followed.
+
+@cindex Fortran, interfacing with
+@unnumberedsec B.5(22-26): Interfacing with Fortran
+@sp 1
+@cartouche
+An Ada implementation should support the following interface
+correspondences between Ada and Fortran:
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada procedure corresponds to a Fortran subroutine.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada function corresponds to a Fortran function.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada parameter of an elementary, array, or record type @var{T} is
+passed as a @var{T} argument to a Fortran procedure, where @var{T} is
+the Fortran type corresponding to the Ada type @var{T}, and where the
+INTENT attribute of the corresponding dummy argument matches the Ada
+formal parameter mode; the Fortran implementation's parameter passing
+conventions are used. For elementary types, a local copy is used if
+necessary to ensure by-copy semantics.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+An Ada parameter of an access-to-subprogram type is passed as a
+reference to a Fortran procedure whose interface corresponds to the
+designated subprogram's specification.
+@end cartouche
+Followed.
+
+@cindex Machine operations
+@unnumberedsec C.1(3-5): Access to Machine Operations
+@sp 1
+@cartouche
+The machine code or intrinsic support should allow access to all
+operations normally available to assembly language programmers for the
+target environment, including privileged instructions, if any.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+The interfacing pragmas (see Annex B) should support interface to
+assembler; the default assembler should be associated with the
+convention identifier @code{Assembler}.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+If an entity is exported to assembly language, then the implementation
+should allocate it at an addressable location, and should ensure that it
+is retained by the linking process, even if not otherwise referenced
+from the Ada code. The implementation should assume that any call to a
+machine code or assembler subprogram is allowed to read or update every
+object that is specified as exported.
+@end cartouche
+Followed.
+
+@unnumberedsec C.1(10-16): Access to Machine Operations
+@sp 1
+@cartouche
+The implementation should ensure that little or no overhead is
+associated with calling intrinsic and machine-code subprograms.
+@end cartouche
+Followed for both intrinsics and machine-code subprograms.
+
+@sp 1
+@cartouche
+It is recommended that intrinsic subprograms be provided for convenient
+access to any machine operations that provide special capabilities or
+efficiency and that are not otherwise available through the language
+constructs.
+@end cartouche
+Followed. A full set of machine operation intrinsic subprograms is provided.
+
+@sp 1
+@cartouche
+Atomic read-modify-write operations---e.g.@:, test and set, compare and
+swap, decrement and test, enqueue/dequeue.
+@end cartouche
+Followed on any target supporting such operations.
+
+@sp 1
+@cartouche
+Standard numeric functions---e.g.@:, sin, log.
+@end cartouche
+Followed on any target supporting such operations.
+
+@sp 1
+@cartouche
+String manipulation operations---e.g.@:, translate and test.
+@end cartouche
+Followed on any target supporting such operations.
+
+@sp 1
+@cartouche
+Vector operations---e.g.@:, compare vector against thresholds.
+@end cartouche
+Followed on any target supporting such operations.
+
+@sp 1
+@cartouche
+Direct operations on I/O ports.
+@end cartouche
+Followed on any target supporting such operations.
+
+@cindex Interrupt support
+@unnumberedsec C.3(28): Interrupt Support
+@sp 1
+@cartouche
+If the @code{Ceiling_Locking} policy is not in effect, the
+implementation should provide means for the application to specify which
+interrupts are to be blocked during protected actions, if the underlying
+system allows for a finer-grain control of interrupt blocking.
+@end cartouche
+Followed. The underlying system does not allow for finer-grain control
+of interrupt blocking.
+
+@cindex Protected procedure handlers
+@unnumberedsec C.3.1(20-21): Protected Procedure Handlers
+@sp 1
+@cartouche
+Whenever possible, the implementation should allow interrupt handlers to
+be called directly by the hardware.
+@end cartouche
+Followed on any target where the underlying operating system permits
+such direct calls.
+
+@sp 1
+@cartouche
+Whenever practical, violations of any
+implementation-defined restrictions should be detected before run time.
+@end cartouche
+Followed. Compile time warnings are given when possible.
+
+@cindex Package @code{Interrupts}
+@findex Interrupts
+@unnumberedsec C.3.2(25): Package @code{Interrupts}
+
+@sp 1
+@cartouche
+If implementation-defined forms of interrupt handler procedures are
+supported, such as protected procedures with parameters, then for each
+such form of a handler, a type analogous to @code{Parameterless_Handler}
+should be specified in a child package of @code{Interrupts}, with the
+same operations as in the predefined package Interrupts.
+@end cartouche
+Followed.
+
+@cindex Pre-elaboration requirements
+@unnumberedsec C.4(14): Pre-elaboration Requirements
+@sp 1
+@cartouche
+It is recommended that pre-elaborated packages be implemented in such a
+way that there should be little or no code executed at run time for the
+elaboration of entities not already covered by the Implementation
+Requirements.
+@end cartouche
+Followed. Executable code is generated in some cases, e.g.@: loops
+to initialize large arrays.
+
+@unnumberedsec C.5(8): Pragma @code{Discard_Names}
+@sp 1
+@cartouche
+If the pragma applies to an entity, then the implementation should
+reduce the amount of storage used for storing names associated with that
+entity.
+@end cartouche
+Followed.
+
+@cindex Package @code{Task_Attributes}
+@findex Task_Attributes
+@unnumberedsec C.7.2(30): The Package Task_Attributes
+@sp 1
+@cartouche
+Some implementations are targeted to domains in which memory use at run
+time must be completely deterministic. For such implementations, it is
+recommended that the storage for task attributes will be pre-allocated
+statically and not from the heap. This can be accomplished by either
+placing restrictions on the number and the size of the task's
+attributes, or by using the pre-allocated storage for the first @var{N}
+attribute objects, and the heap for the others. In the latter case,
+@var{N} should be documented.
+@end cartouche
+Not followed. This implementation is not targeted to such a domain.
+
+@cindex Locking Policies
+@unnumberedsec D.3(17): Locking Policies
+
+@sp 1
+@cartouche
+The implementation should use names that end with @samp{_Locking} for
+locking policies defined by the implementation.
+@end cartouche
+Followed. Two implementation-defined locking policies are defined,
+whose names (@code{Inheritance_Locking} and
+@code{Concurrent_Readers_Locking}) follow this suggestion.
+
+@cindex Entry queuing policies
+@unnumberedsec D.4(16): Entry Queuing Policies
+@sp 1
+@cartouche
+Names that end with @samp{_Queuing} should be used
+for all implementation-defined queuing policies.
+@end cartouche
+Followed. No such implementation-defined queuing policies exist.
+
+@cindex Preemptive abort
+@unnumberedsec D.6(9-10): Preemptive Abort
+@sp 1
+@cartouche
+Even though the @code{abort_statement} is included in the list of
+potentially blocking operations (see 9.5.1), it is recommended that this
+statement be implemented in a way that never requires the task executing
+the @code{abort_statement} to block.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+On a multi-processor, the delay associated with aborting a task on
+another processor should be bounded; the implementation should use
+periodic polling, if necessary, to achieve this.
+@end cartouche
+Followed.
+
+@cindex Tasking restrictions
+@unnumberedsec D.7(21): Tasking Restrictions
+@sp 1
+@cartouche
+When feasible, the implementation should take advantage of the specified
+restrictions to produce a more efficient implementation.
+@end cartouche
+GNAT currently takes advantage of these restrictions by providing an optimized
+run time when the Ravenscar profile and the GNAT restricted run time set
+of restrictions are specified. See pragma @code{Profile (Ravenscar)} and
+pragma @code{Profile (Restricted)} for more details.
+
+@cindex Time, monotonic
+@unnumberedsec D.8(47-49): Monotonic Time
+@sp 1
+@cartouche
+When appropriate, implementations should provide configuration
+mechanisms to change the value of @code{Tick}.
+@end cartouche
+Such configuration mechanisms are not appropriate to this implementation
+and are thus not supported.
+
+@sp 1
+@cartouche
+It is recommended that @code{Calendar.Clock} and @code{Real_Time.Clock}
+be implemented as transformations of the same time base.
+@end cartouche
+Followed.
+
+@sp 1
+@cartouche
+It is recommended that the @dfn{best} time base which exists in
+the underlying system be available to the application through
+@code{Clock}. @dfn{Best} may mean highest accuracy or largest range.
+@end cartouche
+Followed.
+
+@cindex Partition communication subsystem
+@cindex PCS
+@unnumberedsec E.5(28-29): Partition Communication Subsystem
+@sp 1
+@cartouche
+Whenever possible, the PCS on the called partition should allow for
+multiple tasks to call the RPC-receiver with different messages and
+should allow them to block until the corresponding subprogram body
+returns.
+@end cartouche
+Followed by GLADE, a separately supplied PCS that can be used with
+GNAT.
+
+@sp 1
+@cartouche
+The @code{Write} operation on a stream of type @code{Params_Stream_Type}
+should raise @code{Storage_Error} if it runs out of space trying to
+write the @code{Item} into the stream.
+@end cartouche
+Followed by GLADE, a separately supplied PCS that can be used with
+GNAT@.
+
+@cindex COBOL support
+@unnumberedsec F(7): COBOL Support
+@sp 1
+@cartouche
+If COBOL (respectively, C) is widely supported in the target
+environment, implementations supporting the Information Systems Annex
+should provide the child package @code{Interfaces.COBOL} (respectively,
+@code{Interfaces.C}) specified in Annex B and should support a
+@code{convention_identifier} of COBOL (respectively, C) in the interfacing
+pragmas (see Annex B), thus allowing Ada programs to interface with
+programs written in that language.
+@end cartouche
+Followed.
+
+@cindex Decimal radix support
+@unnumberedsec F.1(2): Decimal Radix Support
+@sp 1
+@cartouche
+Packed decimal should be used as the internal representation for objects
+of subtype @var{S} when @var{S}'Machine_Radix = 10.
+@end cartouche
+Not followed. GNAT ignores @var{S}'Machine_Radix and always uses binary
+representations.
+
+@cindex Numerics
+@unnumberedsec G: Numerics
+@sp 2
+@cartouche
+If Fortran (respectively, C) is widely supported in the target
+environment, implementations supporting the Numerics Annex
+should provide the child package @code{Interfaces.Fortran} (respectively,
+@code{Interfaces.C}) specified in Annex B and should support a
+@code{convention_identifier} of Fortran (respectively, C) in the interfacing
+pragmas (see Annex B), thus allowing Ada programs to interface with
+programs written in that language.
+@end cartouche
+Followed.
+
+@cindex Complex types
+@unnumberedsec G.1.1(56-58): Complex Types
+@sp 2
+@cartouche
+Because the usual mathematical meaning of multiplication of a complex
+operand and a real operand is that of the scaling of both components of
+the former by the latter, an implementation should not perform this
+operation by first promoting the real operand to complex type and then
+performing a full complex multiplication. In systems that, in the
+future, support an Ada binding to IEC 559:1989, the latter technique
+will not generate the required result when one of the components of the
+complex operand is infinite. (Explicit multiplication of the infinite
+component by the zero component obtained during promotion yields a NaN
+that propagates into the final result.) Analogous advice applies in the
+case of multiplication of a complex operand and a pure-imaginary
+operand, and in the case of division of a complex operand by a real or
+pure-imaginary operand.
+@end cartouche
+Not followed.
+
+@sp 1
+@cartouche
+Similarly, because the usual mathematical meaning of addition of a
+complex operand and a real operand is that the imaginary operand remains
+unchanged, an implementation should not perform this operation by first
+promoting the real operand to complex type and then performing a full
+complex addition. In implementations in which the @code{Signed_Zeros}
+attribute of the component type is @code{True} (and which therefore
+conform to IEC 559:1989 in regard to the handling of the sign of zero in
+predefined arithmetic operations), the latter technique will not
+generate the required result when the imaginary component of the complex
+operand is a negatively signed zero. (Explicit addition of the negative
+zero to the zero obtained during promotion yields a positive zero.)
+Analogous advice applies in the case of addition of a complex operand
+and a pure-imaginary operand, and in the case of subtraction of a
+complex operand and a real or pure-imaginary operand.
+@end cartouche
+Not followed.
+
+@sp 1
+@cartouche
+Implementations in which @code{Real'Signed_Zeros} is @code{True} should
+attempt to provide a rational treatment of the signs of zero results and
+result components. As one example, the result of the @code{Argument}
+function should have the sign of the imaginary component of the
+parameter @code{X} when the point represented by that parameter lies on
+the positive real axis; as another, the sign of the imaginary component
+of the @code{Compose_From_Polar} function should be the same as
+(respectively, the opposite of) that of the @code{Argument} parameter when that
+parameter has a value of zero and the @code{Modulus} parameter has a
+nonnegative (respectively, negative) value.
+@end cartouche
+Followed.
+
+@cindex Complex elementary functions
+@unnumberedsec G.1.2(49): Complex Elementary Functions
+@sp 1
+@cartouche
+Implementations in which @code{Complex_Types.Real'Signed_Zeros} is
+@code{True} should attempt to provide a rational treatment of the signs
+of zero results and result components. For example, many of the complex
+elementary functions have components that are odd functions of one of
+the parameter components; in these cases, the result component should
+have the sign of the parameter component at the origin. Other complex
+elementary functions have zero components whose sign is opposite that of
+a parameter component at the origin, or is always positive or always
+negative.
+@end cartouche
+Followed.
+
+@cindex Accuracy requirements
+@unnumberedsec G.2.4(19): Accuracy Requirements
+@sp 1
+@cartouche
+The versions of the forward trigonometric functions without a
+@code{Cycle} parameter should not be implemented by calling the
+corresponding version with a @code{Cycle} parameter of
+@code{2.0*Numerics.Pi}, since this will not provide the required
+accuracy in some portions of the domain. For the same reason, the
+version of @code{Log} without a @code{Base} parameter should not be
+implemented by calling the corresponding version with a @code{Base}
+parameter of @code{Numerics.e}.
+@end cartouche
+Followed.
+
+@cindex Complex arithmetic accuracy
+@cindex Accuracy, complex arithmetic
+@unnumberedsec G.2.6(15): Complex Arithmetic Accuracy
+
+@sp 1
+@cartouche
+The version of the @code{Compose_From_Polar} function without a
+@code{Cycle} parameter should not be implemented by calling the
+corresponding version with a @code{Cycle} parameter of
+@code{2.0*Numerics.Pi}, since this will not provide the required
+accuracy in some portions of the domain.
+@end cartouche
+Followed.
+
+@cindex Sequential elaboration policy
+@unnumberedsec H.6(15/2): Pragma Partition_Elaboration_Policy
+
+@sp 1
+@cartouche
+If the partition elaboration policy is @code{Sequential} and the
+Environment task becomes permanently blocked during elaboration then the
+partition is deadlocked and it is recommended that the partition be
+immediately terminated.
+@end cartouche
+Not followed.
+
+@c -----------------------------------------
+@node Implementation Defined Characteristics
+@chapter Implementation Defined Characteristics
+
+@noindent
+In addition to the implementation dependent pragmas and attributes, and the
+implementation advice, there are a number of other Ada features that are
+potentially implementation dependent and are designated as
+implementation-defined. These are mentioned throughout the Ada Reference
+Manual, and are summarized in Annex M@.
+
+A requirement for conforming Ada compilers is that they provide
+documentation describing how the implementation deals with each of these
+issues. In this chapter, you will find each point in Annex M listed
+followed by a description in italic font of how GNAT
+handles the implementation dependence.
+
+You can use this chapter as a guide to minimizing implementation
+dependent features in your programs if portability to other compilers
+and other operating systems is an important consideration. The numbers
+in each section below correspond to the paragraph number in the Ada
+Reference Manual.
+
+@sp 1
+@cartouche
+@noindent
+@strong{2}. Whether or not each recommendation given in Implementation
+Advice is followed. See 1.1.2(37).
+@end cartouche
+@noindent
+@xref{Implementation Advice}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{3}. Capacity limitations of the implementation. See 1.1.3(3).
+@end cartouche
+@noindent
+The complexity of programs that can be processed is limited only by the
+total amount of available virtual memory, and disk space for the
+generated object files.
+
+@sp 1
+@cartouche
+@noindent
+@strong{4}. Variations from the standard that are impractical to avoid
+given the implementation's execution environment. See 1.1.3(6).
+@end cartouche
+@noindent
+There are no variations from the standard.
+
+@sp 1
+@cartouche
+@noindent
+@strong{5}. Which @code{code_statement}s cause external
+interactions. See 1.1.3(10).
+@end cartouche
+@noindent
+Any @code{code_statement} can potentially cause external interactions.
+
+@sp 1
+@cartouche
+@noindent
+@strong{6}. The coded representation for the text of an Ada
+program. See 2.1(4).
+@end cartouche
+@noindent
+See separate section on source representation.
+
+@sp 1
+@cartouche
+@noindent
+@strong{7}. The control functions allowed in comments. See 2.1(14).
+@end cartouche
+@noindent
+See separate section on source representation.
+
+@sp 1
+@cartouche
+@noindent
+@strong{8}. The representation for an end of line. See 2.2(2).
+@end cartouche
+@noindent
+See separate section on source representation.
+
+@sp 1
+@cartouche
+@noindent
+@strong{9}. Maximum supported line length and lexical element
+length. See 2.2(15).
+@end cartouche
+@noindent
+The maximum line length is 255 characters and the maximum length of
+a lexical element is also 255 characters. This is the default setting
+if not overridden by the use of compiler switch @option{-gnaty} (which
+sets the maximum to 79) or @option{-gnatyMnn} which allows the maximum
+line length to be specified to be any value up to 32767. The maximum
+length of a lexical element is the same as the maximum line length.
+
+@sp 1
+@cartouche
+@noindent
+@strong{10}. Implementation defined pragmas. See 2.8(14).
+@end cartouche
+@noindent
+
+@xref{Implementation Defined Pragmas}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{11}. Effect of pragma @code{Optimize}. See 2.8(27).
+@end cartouche
+@noindent
+Pragma @code{Optimize}, if given with a @code{Time} or @code{Space}
+parameter, checks that the optimization flag is set, and aborts if it is
+not.
+
+@sp 1
+@cartouche
+@noindent
+@strong{12}. The sequence of characters of the value returned by
+@code{@var{S}'Image} when some of the graphic characters of
+@code{@var{S}'Wide_Image} are not defined in @code{Character}. See
+3.5(37).
+@end cartouche
+@noindent
+The sequence of characters is as defined by the wide character encoding
+method used for the source. See section on source representation for
+further details.
+
+@sp 1
+@cartouche
+@noindent
+@strong{13}. The predefined integer types declared in
+@code{Standard}. See 3.5.4(25).
+@end cartouche
+@noindent
+@table @code
+@item Short_Short_Integer
+8 bit signed
+@item Short_Integer
+(Short) 16 bit signed
+@item Integer
+32 bit signed
+@item Long_Integer
+64 bit signed (on most 64 bit targets, depending on the C definition of long).
+32 bit signed (all other targets)
+@item Long_Long_Integer
+64 bit signed
+@end table
+
+@sp 1
+@cartouche
+@noindent
+@strong{14}. Any nonstandard integer types and the operators defined
+for them. See 3.5.4(26).
+@end cartouche
+@noindent
+There are no nonstandard integer types.
+
+@sp 1
+@cartouche
+@noindent
+@strong{15}. Any nonstandard real types and the operators defined for
+them. See 3.5.6(8).
+@end cartouche
+@noindent
+There are no nonstandard real types.
+
+@sp 1
+@cartouche
+@noindent
+@strong{16}. What combinations of requested decimal precision and range
+are supported for floating point types. See 3.5.7(7).
+@end cartouche
+@noindent
+The precision and range is as defined by the IEEE standard.
+
+@sp 1
+@cartouche
+@noindent
+@strong{17}. The predefined floating point types declared in
+@code{Standard}. See 3.5.7(16).
+@end cartouche
+@noindent
+@table @code
+@item Short_Float
+32 bit IEEE short
+@item Float
+(Short) 32 bit IEEE short
+@item Long_Float
+64 bit IEEE long
+@item Long_Long_Float
+64 bit IEEE long (80 bit IEEE long on x86 processors)
+@end table
+
+@sp 1
+@cartouche
+@noindent
+@strong{18}. The small of an ordinary fixed point type. See 3.5.9(8).
+@end cartouche
+@noindent
+@code{Fine_Delta} is 2**(@minus{}63)
+
+@sp 1
+@cartouche
+@noindent
+@strong{19}. What combinations of small, range, and digits are
+supported for fixed point types. See 3.5.9(10).
+@end cartouche
+@noindent
+Any combinations are permitted that do not result in a small less than
+@code{Fine_Delta} and do not result in a mantissa larger than 63 bits.
+If the mantissa is larger than 53 bits on machines where Long_Long_Float
+is 64 bits (true of all architectures except ia32), then the output from
+Text_IO is accurate to only 53 bits, rather than the full mantissa. This
+is because floating-point conversions are used to convert fixed point.
+
+@sp 1
+@cartouche
+@noindent
+@strong{20}. The result of @code{Tags.Expanded_Name} for types declared
+within an unnamed @code{block_statement}. See 3.9(10).
+@end cartouche
+@noindent
+Block numbers of the form @code{B@var{nnn}}, where @var{nnn} is a
+decimal integer are allocated.
+
+@sp 1
+@cartouche
+@noindent
+@strong{21}. Implementation-defined attributes. See 4.1.4(12).
+@end cartouche
+@noindent
+@xref{Implementation Defined Attributes}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{22}. Any implementation-defined time types. See 9.6(6).
+@end cartouche
+@noindent
+There are no implementation-defined time types.
+
+@sp 1
+@cartouche
+@noindent
+@strong{23}. The time base associated with relative delays.
+@end cartouche
+@noindent
+See 9.6(20). The time base used is that provided by the C library
+function @code{gettimeofday}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{24}. The time base of the type @code{Calendar.Time}. See
+9.6(23).
+@end cartouche
+@noindent
+The time base used is that provided by the C library function
+@code{gettimeofday}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{25}. The time zone used for package @code{Calendar}
+operations. See 9.6(24).
+@end cartouche
+@noindent
+The time zone used by package @code{Calendar} is the current system time zone
+setting for local time, as accessed by the C library function
+@code{localtime}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{26}. Any limit on @code{delay_until_statements} of
+@code{select_statements}. See 9.6(29).
+@end cartouche
+@noindent
+There are no such limits.
+
+@sp 1
+@cartouche
+@noindent
+@strong{27}. Whether or not two non-overlapping parts of a composite
+object are independently addressable, in the case where packing, record
+layout, or @code{Component_Size} is specified for the object. See
+9.10(1).
+@end cartouche
+@noindent
+Separate components are independently addressable if they do not share
+overlapping storage units.
+
+@sp 1
+@cartouche
+@noindent
+@strong{28}. The representation for a compilation. See 10.1(2).
+@end cartouche
+@noindent
+A compilation is represented by a sequence of files presented to the
+compiler in a single invocation of the @command{gcc} command.
+
+@sp 1
+@cartouche
+@noindent
+@strong{29}. Any restrictions on compilations that contain multiple
+compilation_units. See 10.1(4).
+@end cartouche
+@noindent
+No single file can contain more than one compilation unit, but any
+sequence of files can be presented to the compiler as a single
+compilation.
+
+@sp 1
+@cartouche
+@noindent
+@strong{30}. The mechanisms for creating an environment and for adding
+and replacing compilation units. See 10.1.4(3).
+@end cartouche
+@noindent
+See separate section on compilation model.
+
+@sp 1
+@cartouche
+@noindent
+@strong{31}. The manner of explicitly assigning library units to a
+partition. See 10.2(2).
+@end cartouche
+@noindent
+If a unit contains an Ada main program, then the Ada units for the partition
+are determined by recursive application of the rules in the Ada Reference
+Manual section 10.2(2-6). In other words, the Ada units will be those that
+are needed by the main program, and then this definition of need is applied
+recursively to those units, and the partition contains the transitive
+closure determined by this relationship. In short, all the necessary units
+are included, with no need to explicitly specify the list. If additional
+units are required, e.g.@: by foreign language units, then all units must be
+mentioned in the context clause of one of the needed Ada units.
+
+If the partition contains no main program, or if the main program is in
+a language other than Ada, then GNAT
+provides the binder options @option{-z} and @option{-n} respectively, and in
+this case a list of units can be explicitly supplied to the binder for
+inclusion in the partition (all units needed by these units will also
+be included automatically). For full details on the use of these
+options, refer to @ref{The GNAT Make Program gnatmake,,, gnat_ugn,
+@value{EDITION} User's Guide}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{32}. The implementation-defined means, if any, of specifying
+which compilation units are needed by a given compilation unit. See
+10.2(2).
+@end cartouche
+@noindent
+The units needed by a given compilation unit are as defined in
+the Ada Reference Manual section 10.2(2-6). There are no
+implementation-defined pragmas or other implementation-defined
+means for specifying needed units.
+
+@sp 1
+@cartouche
+@noindent
+@strong{33}. The manner of designating the main subprogram of a
+partition. See 10.2(7).
+@end cartouche
+@noindent
+The main program is designated by providing the name of the
+corresponding @file{ALI} file as the input parameter to the binder.
+
+@sp 1
+@cartouche
+@noindent
+@strong{34}. The order of elaboration of @code{library_items}. See
+10.2(18).
+@end cartouche
+@noindent
+The first constraint on ordering is that it meets the requirements of
+Chapter 10 of the Ada Reference Manual. This still leaves some
+implementation dependent choices, which are resolved by first
+elaborating bodies as early as possible (i.e., in preference to specs
+where there is a choice), and second by evaluating the immediate with
+clauses of a unit to determine the probably best choice, and
+third by elaborating in alphabetical order of unit names
+where a choice still remains.
+
+@sp 1
+@cartouche
+@noindent
+@strong{35}. Parameter passing and function return for the main
+subprogram. See 10.2(21).
+@end cartouche
+@noindent
+The main program has no parameters. It may be a procedure, or a function
+returning an integer type. In the latter case, the returned integer
+value is the return code of the program (overriding any value that
+may have been set by a call to @code{Ada.Command_Line.Set_Exit_Status}).
+
+@sp 1
+@cartouche
+@noindent
+@strong{36}. The mechanisms for building and running partitions. See
+10.2(24).
+@end cartouche
+@noindent
+GNAT itself supports programs with only a single partition. The GNATDIST
+tool provided with the GLADE package (which also includes an implementation
+of the PCS) provides a completely flexible method for building and running
+programs consisting of multiple partitions. See the separate GLADE manual
+for details.
+
+@sp 1
+@cartouche
+@noindent
+@strong{37}. The details of program execution, including program
+termination. See 10.2(25).
+@end cartouche
+@noindent
+See separate section on compilation model.
+
+@sp 1
+@cartouche
+@noindent
+@strong{38}. The semantics of any non-active partitions supported by the
+implementation. See 10.2(28).
+@end cartouche
+@noindent
+Passive partitions are supported on targets where shared memory is
+provided by the operating system. See the GLADE reference manual for
+further details.
+
+@sp 1
+@cartouche
+@noindent
+@strong{39}. The information returned by @code{Exception_Message}. See
+11.4.1(10).
+@end cartouche
+@noindent
+Exception message returns the null string unless a specific message has
+been passed by the program.
+
+@sp 1
+@cartouche
+@noindent
+@strong{40}. The result of @code{Exceptions.Exception_Name} for types
+declared within an unnamed @code{block_statement}. See 11.4.1(12).
+@end cartouche
+@noindent
+Blocks have implementation defined names of the form @code{B@var{nnn}}
+where @var{nnn} is an integer.
+
+@sp 1
+@cartouche
+@noindent
+@strong{41}. The information returned by
+@code{Exception_Information}. See 11.4.1(13).
+@end cartouche
+@noindent
+@code{Exception_Information} returns a string in the following format:
+
+@smallexample
+@emph{Exception_Name:} nnnnn
+@emph{Message:} mmmmm
+@emph{PID:} ppp
+@emph{Load address:} 0xhhhh
+@emph{Call stack traceback locations:}
+0xhhhh 0xhhhh 0xhhhh ... 0xhhh
+@end smallexample
+
+@noindent
+where
+
+@itemize @bullet
+@item
+@code{nnnn} is the fully qualified name of the exception in all upper
+case letters. This line is always present.
+
+@item
+@code{mmmm} is the message (this line present only if message is non-null)
+
+@item
+@code{ppp} is the Process Id value as a decimal integer (this line is
+present only if the Process Id is nonzero). Currently we are
+not making use of this field.
+
+@item
+The Load address line, the Call stack traceback locations line and the
+following values are present only if at least one traceback location was
+recorded. The Load address indicates the address at which the main executable
+was loaded; this line may not be present if operating system hasn't relocated
+the main executable. The values are given in C style format, with lower case
+letters for a-f, and only as many digits present as are necessary.
+@end itemize
+
+@noindent
+The line terminator sequence at the end of each line, including
+the last line is a single @code{LF} character (@code{16#0A#}).
+
+@sp 1
+@cartouche
+@noindent
+@strong{42}. Implementation-defined check names. See 11.5(27).
+@end cartouche
+@noindent
+The implementation defined check name Alignment_Check controls checking of
+address clause values for proper alignment (that is, the address supplied
+must be consistent with the alignment of the type).
+
+The implementation defined check name Predicate_Check controls whether
+predicate checks are generated.
+
+The implementation defined check name Validity_Check controls whether
+validity checks are generated.
+
+In addition, a user program can add implementation-defined check names
+by means of the pragma Check_Name.
+
+@sp 1
+@cartouche
+@noindent
+@strong{43}. The interpretation of each aspect of representation. See
+13.1(20).
+@end cartouche
+@noindent
+See separate section on data representations.
+
+@sp 1
+@cartouche
+@noindent
+@strong{44}. Any restrictions placed upon representation items. See
+13.1(20).
+@end cartouche
+@noindent
+See separate section on data representations.
+
+@sp 1
+@cartouche
+@noindent
+@strong{45}. The meaning of @code{Size} for indefinite subtypes. See
+13.3(48).
+@end cartouche
+@noindent
+Size for an indefinite subtype is the maximum possible size, except that
+for the case of a subprogram parameter, the size of the parameter object
+is the actual size.
+
+@sp 1
+@cartouche
+@noindent
+@strong{46}. The default external representation for a type tag. See
+13.3(75).
+@end cartouche
+@noindent
+The default external representation for a type tag is the fully expanded
+name of the type in upper case letters.
+
+@sp 1
+@cartouche
+@noindent
+@strong{47}. What determines whether a compilation unit is the same in
+two different partitions. See 13.3(76).
+@end cartouche
+@noindent
+A compilation unit is the same in two different partitions if and only
+if it derives from the same source file.
+
+@sp 1
+@cartouche
+@noindent
+@strong{48}. Implementation-defined components. See 13.5.1(15).
+@end cartouche
+@noindent
+The only implementation defined component is the tag for a tagged type,
+which contains a pointer to the dispatching table.
+
+@sp 1
+@cartouche
+@noindent
+@strong{49}. If @code{Word_Size} = @code{Storage_Unit}, the default bit
+ordering. See 13.5.3(5).
+@end cartouche
+@noindent
+@code{Word_Size} (32) is not the same as @code{Storage_Unit} (8) for this
+implementation, so no non-default bit ordering is supported. The default
+bit ordering corresponds to the natural endianness of the target architecture.
+
+@sp 1
+@cartouche
+@noindent
+@strong{50}. The contents of the visible part of package @code{System}
+and its language-defined children. See 13.7(2).
+@end cartouche
+@noindent
+See the definition of these packages in files @file{system.ads} and
+@file{s-stoele.ads}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{51}. The contents of the visible part of package
+@code{System.Machine_Code}, and the meaning of
+@code{code_statements}. See 13.8(7).
+@end cartouche
+@noindent
+See the definition and documentation in file @file{s-maccod.ads}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{52}. The effect of unchecked conversion. See 13.9(11).
+@end cartouche
+@noindent
+Unchecked conversion between types of the same size
+results in an uninterpreted transmission of the bits from one type
+to the other. If the types are of unequal sizes, then in the case of
+discrete types, a shorter source is first zero or sign extended as
+necessary, and a shorter target is simply truncated on the left.
+For all non-discrete types, the source is first copied if necessary
+to ensure that the alignment requirements of the target are met, then
+a pointer is constructed to the source value, and the result is obtained
+by dereferencing this pointer after converting it to be a pointer to the
+target type. Unchecked conversions where the target subtype is an
+unconstrained array are not permitted. If the target alignment is
+greater than the source alignment, then a copy of the result is
+made with appropriate alignment
+
+@sp 1
+@cartouche
+@noindent
+@strong{53}. The semantics of operations on invalid representations.
+See 13.9.2(10-11).
+@end cartouche
+@noindent
+For assignments and other operations where the use of invalid values cannot
+result in erroneous behavior, the compiler ignores the possibility of invalid
+values. An exception is raised at the point where an invalid value would
+result in erroneous behavior. For example executing:
+
+@smallexample @c ada
+procedure invalidvals is
+ X : Integer := -1;
+ Y : Natural range 1 .. 10;
+ for Y'Address use X'Address;
+ Z : Natural range 1 .. 10;
+ A : array (Natural range 1 .. 10) of Integer;
+begin
+ Z := Y; -- no exception
+ A (Z) := 3; -- exception raised;
+end;
+@end smallexample
+
+@noindent
+As indicated, an exception is raised on the array assignment, but not
+on the simple assignment of the invalid negative value from Y to Z.
+
+@sp 1
+@cartouche
+@noindent
+@strong{53}. The manner of choosing a storage pool for an access type
+when @code{Storage_Pool} is not specified for the type. See 13.11(17).
+@end cartouche
+@noindent
+There are 3 different standard pools used by the compiler when
+@code{Storage_Pool} is not specified depending whether the type is local
+to a subprogram or defined at the library level and whether
+@code{Storage_Size}is specified or not. See documentation in the runtime
+library units @code{System.Pool_Global}, @code{System.Pool_Size} and
+@code{System.Pool_Local} in files @file{s-poosiz.ads},
+@file{s-pooglo.ads} and @file{s-pooloc.ads} for full details on the
+default pools used.
+
+@sp 1
+@cartouche
+@noindent
+@strong{54}. Whether or not the implementation provides user-accessible
+names for the standard pool type(s). See 13.11(17).
+@end cartouche
+@noindent
+
+See documentation in the sources of the run time mentioned in paragraph
+@strong{53} . All these pools are accessible by means of @code{with}'ing
+these units.
+
+@sp 1
+@cartouche
+@noindent
+@strong{55}. The meaning of @code{Storage_Size}. See 13.11(18).
+@end cartouche
+@noindent
+@code{Storage_Size} is measured in storage units, and refers to the
+total space available for an access type collection, or to the primary
+stack space for a task.
+
+@sp 1
+@cartouche
+@noindent
+@strong{56}. Implementation-defined aspects of storage pools. See
+13.11(22).
+@end cartouche
+@noindent
+See documentation in the sources of the run time mentioned in paragraph
+@strong{53} for details on GNAT-defined aspects of storage pools.
+
+@sp 1
+@cartouche
+@noindent
+@strong{57}. The set of restrictions allowed in a pragma
+@code{Restrictions}. See 13.12(7).
+@end cartouche
+@noindent
+@xref{Standard and Implementation Defined Restrictions}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{58}. The consequences of violating limitations on
+@code{Restrictions} pragmas. See 13.12(9).
+@end cartouche
+@noindent
+Restrictions that can be checked at compile time result in illegalities
+if violated. Currently there are no other consequences of violating
+restrictions.
+
+@sp 1
+@cartouche
+@noindent
+@strong{59}. The representation used by the @code{Read} and
+@code{Write} attributes of elementary types in terms of stream
+elements. See 13.13.2(9).
+@end cartouche
+@noindent
+The representation is the in-memory representation of the base type of
+the type, using the number of bits corresponding to the
+@code{@var{type}'Size} value, and the natural ordering of the machine.
+
+@sp 1
+@cartouche
+@noindent
+@strong{60}. The names and characteristics of the numeric subtypes
+declared in the visible part of package @code{Standard}. See A.1(3).
+@end cartouche
+@noindent
+See items describing the integer and floating-point types supported.
+
+@sp 1
+@cartouche
+@noindent
+@strong{61}. The string returned by @code{Character_Set_Version}.
+See A.3.5(3).
+@end cartouche
+@noindent
+@code{Ada.Wide_Characters.Handling.Character_Set_Version} returns
+the string "Unicode 4.0", referring to version 4.0 of the
+Unicode specification.
+
+@sp 1
+@cartouche
+@noindent
+@strong{62}. The accuracy actually achieved by the elementary
+functions. See A.5.1(1).
+@end cartouche
+@noindent
+The elementary functions correspond to the functions available in the C
+library. Only fast math mode is implemented.
+
+@sp 1
+@cartouche
+@noindent
+@strong{63}. The sign of a zero result from some of the operators or
+functions in @code{Numerics.Generic_Elementary_Functions}, when
+@code{Float_Type'Signed_Zeros} is @code{True}. See A.5.1(46).
+@end cartouche
+@noindent
+The sign of zeroes follows the requirements of the IEEE 754 standard on
+floating-point.
+
+@sp 1
+@cartouche
+@noindent
+@strong{64}. The value of
+@code{Numerics.Float_Random.Max_Image_Width}. See A.5.2(27).
+@end cartouche
+@noindent
+Maximum image width is 6864, see library file @file{s-rannum.ads}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{65}. The value of
+@code{Numerics.Discrete_Random.Max_Image_Width}. See A.5.2(27).
+@end cartouche
+@noindent
+Maximum image width is 6864, see library file @file{s-rannum.ads}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{66}. The algorithms for random number generation. See
+A.5.2(32).
+@end cartouche
+@noindent
+The algorithm is the Mersenne Twister, as documented in the source file
+@file{s-rannum.adb}. This version of the algorithm has a period of
+2**19937-1.
+
+@sp 1
+@cartouche
+@noindent
+@strong{67}. The string representation of a random number generator's
+state. See A.5.2(38).
+@end cartouche
+@noindent
+The value returned by the Image function is the concatenation of
+the fixed-width decimal representations of the 624 32-bit integers
+of the state vector.
+
+@sp 1
+@cartouche
+@noindent
+@strong{68}. The minimum time interval between calls to the
+time-dependent Reset procedure that are guaranteed to initiate different
+random number sequences. See A.5.2(45).
+@end cartouche
+@noindent
+The minimum period between reset calls to guarantee distinct series of
+random numbers is one microsecond.
+
+@sp 1
+@cartouche
+@noindent
+@strong{69}. The values of the @code{Model_Mantissa},
+@code{Model_Emin}, @code{Model_Epsilon}, @code{Model},
+@code{Safe_First}, and @code{Safe_Last} attributes, if the Numerics
+Annex is not supported. See A.5.3(72).
+@end cartouche
+@noindent
+Run the compiler with @option{-gnatS} to produce a listing of package
+@code{Standard}, has the values of all numeric attributes.
+
+@sp 1
+@cartouche
+@noindent
+@strong{70}. Any implementation-defined characteristics of the
+input-output packages. See A.7(14).
+@end cartouche
+@noindent
+There are no special implementation defined characteristics for these
+packages.
+
+@sp 1
+@cartouche
+@noindent
+@strong{71}. The value of @code{Buffer_Size} in @code{Storage_IO}. See
+A.9(10).
+@end cartouche
+@noindent
+All type representations are contiguous, and the @code{Buffer_Size} is
+the value of @code{@var{type}'Size} rounded up to the next storage unit
+boundary.
+
+@sp 1
+@cartouche
+@noindent
+@strong{72}. External files for standard input, standard output, and
+standard error See A.10(5).
+@end cartouche
+@noindent
+These files are mapped onto the files provided by the C streams
+libraries. See source file @file{i-cstrea.ads} for further details.
+
+@sp 1
+@cartouche
+@noindent
+@strong{73}. The accuracy of the value produced by @code{Put}. See
+A.10.9(36).
+@end cartouche
+@noindent
+If more digits are requested in the output than are represented by the
+precision of the value, zeroes are output in the corresponding least
+significant digit positions.
+
+@sp 1
+@cartouche
+@noindent
+@strong{74}. The meaning of @code{Argument_Count}, @code{Argument}, and
+@code{Command_Name}. See A.15(1).
+@end cartouche
+@noindent
+These are mapped onto the @code{argv} and @code{argc} parameters of the
+main program in the natural manner.
+
+@sp 1
+@cartouche
+@noindent
+@strong{75}. The interpretation of the @code{Form} parameter in procedure
+@code{Create_Directory}. See A.16(56).
+@end cartouche
+@noindent
+The @code{Form} parameter is not used.
+
+@sp 1
+@cartouche
+@noindent
+@strong{76}. The interpretation of the @code{Form} parameter in procedure
+@code{Create_Path}. See A.16(60).
+@end cartouche
+@noindent
+The @code{Form} parameter is not used.
+
+@sp 1
+@cartouche
+@noindent
+@strong{77}. The interpretation of the @code{Form} parameter in procedure
+@code{Copy_File}. See A.16(68).
+@end cartouche
+@noindent
+The @code{Form} parameter is case-insensitive.
+
+Two fields are recognized in the @code{Form} parameter:
+
+@table @code
+
+@item preserve=<value>
+
+@item mode=<value>
+
+@end table
+
+@noindent
+<value> starts immediately after the character '=' and ends with the
+character immediately preceding the next comma (',') or with the last
+character of the parameter.
+
+The only possible values for preserve= are:
+
+@table @code
+
+@item no_attributes
+Do not try to preserve any file attributes. This is the default if no
+preserve= is found in Form.
+
+@item all_attributes
+Try to preserve all file attributes (timestamps, access rights).
+
+@item timestamps
+Preserve the timestamp of the copied file, but not the other file attributes.
+
+@end table
+
+@noindent
+The only possible values for mode= are:
+
+@table @code
+
+@item copy
+Only do the copy if the destination file does not already exist. If it already
+exists, Copy_File fails.
+
+@item overwrite
+Copy the file in all cases. Overwrite an already existing destination file.
+
+@item append
+Append the original file to the destination file. If the destination file does
+not exist, the destination file is a copy of the source file. When mode=append,
+the field preserve=, if it exists, is not taken into account.
+
+@end table
+
+@noindent
+If the Form parameter includes one or both of the fields and the value or
+values are incorrect, Copy_file fails with Use_Error.
+
+Examples of correct Forms:
+
+@smallexample
+Form => "preserve=no_attributes,mode=overwrite" (the default)
+Form => "mode=append"
+Form => "mode=copy, preserve=all_attributes"
+@end smallexample
+
+@noindent
+Examples of incorrect Forms
+
+@smallexample
+Form => "preserve=junk"
+Form => "mode=internal, preserve=timestamps"
+@end smallexample
+
+@sp 1
+@cartouche
+@noindent
+@strong{78}. Implementation-defined convention names. See B.1(11).
+@end cartouche
+@noindent
+The following convention names are supported
+
+@table @code
+@item Ada
+Ada
+@item Ada_Pass_By_Copy
+Allowed for any types except by-reference types such as limited
+records. Compatible with convention Ada, but causes any parameters
+with this convention to be passed by copy.
+@item Ada_Pass_By_Reference
+Allowed for any types except by-copy types such as scalars.
+Compatible with convention Ada, but causes any parameters
+with this convention to be passed by reference.
+@item Assembler
+Assembly language
+@item Asm
+Synonym for Assembler
+@item Assembly
+Synonym for Assembler
+@item C
+C
+@item C_Pass_By_Copy
+Allowed only for record types, like C, but also notes that record
+is to be passed by copy rather than reference.
+@item COBOL
+COBOL
+@item C_Plus_Plus (or CPP)
+C++
+@item Default
+Treated the same as C
+@item External
+Treated the same as C
+@item Fortran
+Fortran
+@item Intrinsic
+For support of pragma @code{Import} with convention Intrinsic, see
+separate section on Intrinsic Subprograms.
+@item Stdcall
+Stdcall (used for Windows implementations only). This convention correspond
+to the WINAPI (previously called Pascal convention) C/C++ convention under
+Windows. A routine with this convention cleans the stack before
+exit. This pragma cannot be applied to a dispatching call.
+@item DLL
+Synonym for Stdcall
+@item Win32
+Synonym for Stdcall
+@item Stubbed
+Stubbed is a special convention used to indicate that the body of the
+subprogram will be entirely ignored. Any call to the subprogram
+is converted into a raise of the @code{Program_Error} exception. If a
+pragma @code{Import} specifies convention @code{stubbed} then no body need
+be present at all. This convention is useful during development for the
+inclusion of subprograms whose body has not yet been written.
+
+@end table
+@noindent
+In addition, all otherwise unrecognized convention names are also
+treated as being synonymous with convention C@. In all implementations
+except for VMS, use of such other names results in a warning. In VMS
+implementations, these names are accepted silently.
+
+@sp 1
+@cartouche
+@noindent
+@strong{79}. The meaning of link names. See B.1(36).
+@end cartouche
+@noindent
+Link names are the actual names used by the linker.
+
+@sp 1
+@cartouche
+@noindent
+@strong{80}. The manner of choosing link names when neither the link
+name nor the address of an imported or exported entity is specified. See
+B.1(36).
+@end cartouche
+@noindent
+The default linker name is that which would be assigned by the relevant
+external language, interpreting the Ada name as being in all lower case
+letters.
+
+@sp 1
+@cartouche
+@noindent
+@strong{81}. The effect of pragma @code{Linker_Options}. See B.1(37).
+@end cartouche
+@noindent
+The string passed to @code{Linker_Options} is presented uninterpreted as
+an argument to the link command, unless it contains ASCII.NUL characters.
+NUL characters if they appear act as argument separators, so for example
+
+@smallexample @c ada
+pragma Linker_Options ("-labc" & ASCII.NUL & "-ldef");
+@end smallexample
+
+@noindent
+causes two separate arguments @code{-labc} and @code{-ldef} to be passed to the
+linker. The order of linker options is preserved for a given unit. The final
+list of options passed to the linker is in reverse order of the elaboration
+order. For example, linker options for a body always appear before the options
+from the corresponding package spec.
+
+@sp 1
+@cartouche
+@noindent
+@strong{82}. The contents of the visible part of package
+@code{Interfaces} and its language-defined descendants. See B.2(1).
+@end cartouche
+@noindent
+See files with prefix @file{i-} in the distributed library.
+
+@sp 1
+@cartouche
+@noindent
+@strong{83}. Implementation-defined children of package
+@code{Interfaces}. The contents of the visible part of package
+@code{Interfaces}. See B.2(11).
+@end cartouche
+@noindent
+See files with prefix @file{i-} in the distributed library.
+
+@sp 1
+@cartouche
+@noindent
+@strong{84}. The types @code{Floating}, @code{Long_Floating},
+@code{Binary}, @code{Long_Binary}, @code{Decimal_ Element}, and
+@code{COBOL_Character}; and the initialization of the variables
+@code{Ada_To_COBOL} and @code{COBOL_To_Ada}, in
+@code{Interfaces.COBOL}. See B.4(50).
+@end cartouche
+@noindent
+@table @code
+@item Floating
+Float
+@item Long_Floating
+(Floating) Long_Float
+@item Binary
+Integer
+@item Long_Binary
+Long_Long_Integer
+@item Decimal_Element
+Character
+@item COBOL_Character
+Character
+@end table
+
+@noindent
+For initialization, see the file @file{i-cobol.ads} in the distributed library.
+
+@sp 1
+@cartouche
+@noindent
+@strong{85}. Support for access to machine instructions. See C.1(1).
+@end cartouche
+@noindent
+See documentation in file @file{s-maccod.ads} in the distributed library.
+
+@sp 1
+@cartouche
+@noindent
+@strong{86}. Implementation-defined aspects of access to machine
+operations. See C.1(9).
+@end cartouche
+@noindent
+See documentation in file @file{s-maccod.ads} in the distributed library.
+
+@sp 1
+@cartouche
+@noindent
+@strong{87}. Implementation-defined aspects of interrupts. See C.3(2).
+@end cartouche
+@noindent
+Interrupts are mapped to signals or conditions as appropriate. See
+definition of unit
+@code{Ada.Interrupt_Names} in source file @file{a-intnam.ads} for details
+on the interrupts supported on a particular target.
+
+@sp 1
+@cartouche
+@noindent
+@strong{88}. Implementation-defined aspects of pre-elaboration. See
+C.4(13).
+@end cartouche
+@noindent
+GNAT does not permit a partition to be restarted without reloading,
+except under control of the debugger.
+
+@sp 1
+@cartouche
+@noindent
+@strong{89}. The semantics of pragma @code{Discard_Names}. See C.5(7).
+@end cartouche
+@noindent
+Pragma @code{Discard_Names} causes names of enumeration literals to
+be suppressed. In the presence of this pragma, the Image attribute
+provides the image of the Pos of the literal, and Value accepts
+Pos values.
+
+@sp 1
+@cartouche
+@noindent
+@strong{90}. The result of the @code{Task_Identification.Image}
+attribute. See C.7.1(7).
+@end cartouche
+@noindent
+The result of this attribute is a string that identifies
+the object or component that denotes a given task. If a variable @code{Var}
+has a task type, the image for this task will have the form @code{Var_@var{XXXXXXXX}},
+where the suffix
+is the hexadecimal representation of the virtual address of the corresponding
+task control block. If the variable is an array of tasks, the image of each
+task will have the form of an indexed component indicating the position of a
+given task in the array, e.g.@: @code{Group(5)_@var{XXXXXXX}}. If the task is a
+component of a record, the image of the task will have the form of a selected
+component. These rules are fully recursive, so that the image of a task that
+is a subcomponent of a composite object corresponds to the expression that
+designates this task.
+@noindent
+If a task is created by an allocator, its image depends on the context. If the
+allocator is part of an object declaration, the rules described above are used
+to construct its image, and this image is not affected by subsequent
+assignments. If the allocator appears within an expression, the image
+includes only the name of the task type.
+@noindent
+If the configuration pragma Discard_Names is present, or if the restriction
+No_Implicit_Heap_Allocation is in effect, the image reduces to
+the numeric suffix, that is to say the hexadecimal representation of the
+virtual address of the control block of the task.
+@sp 1
+@cartouche
+@noindent
+@strong{91}. The value of @code{Current_Task} when in a protected entry
+or interrupt handler. See C.7.1(17).
+@end cartouche
+@noindent
+Protected entries or interrupt handlers can be executed by any
+convenient thread, so the value of @code{Current_Task} is undefined.
+
+@sp 1
+@cartouche
+@noindent
+@strong{92}. The effect of calling @code{Current_Task} from an entry
+body or interrupt handler. See C.7.1(19).
+@end cartouche
+@noindent
+The effect of calling @code{Current_Task} from an entry body or
+interrupt handler is to return the identification of the task currently
+executing the code.
+
+@sp 1
+@cartouche
+@noindent
+@strong{93}. Implementation-defined aspects of
+@code{Task_Attributes}. See C.7.2(19).
+@end cartouche
+@noindent
+There are no implementation-defined aspects of @code{Task_Attributes}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{94}. Values of all @code{Metrics}. See D(2).
+@end cartouche
+@noindent
+The metrics information for GNAT depends on the performance of the
+underlying operating system. The sources of the run-time for tasking
+implementation, together with the output from @option{-gnatG} can be
+used to determine the exact sequence of operating systems calls made
+to implement various tasking constructs. Together with appropriate
+information on the performance of the underlying operating system,
+on the exact target in use, this information can be used to determine
+the required metrics.
+
+@sp 1
+@cartouche
+@noindent
+@strong{95}. The declarations of @code{Any_Priority} and
+@code{Priority}. See D.1(11).
+@end cartouche
+@noindent
+See declarations in file @file{system.ads}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{96}. Implementation-defined execution resources. See D.1(15).
+@end cartouche
+@noindent
+There are no implementation-defined execution resources.
+
+@sp 1
+@cartouche
+@noindent
+@strong{97}. Whether, on a multiprocessor, a task that is waiting for
+access to a protected object keeps its processor busy. See D.2.1(3).
+@end cartouche
+@noindent
+On a multi-processor, a task that is waiting for access to a protected
+object does not keep its processor busy.
+
+@sp 1
+@cartouche
+@noindent
+@strong{98}. The affect of implementation defined execution resources
+on task dispatching. See D.2.1(9).
+@end cartouche
+@noindent
+Tasks map to threads in the threads package used by GNAT@. Where possible
+and appropriate, these threads correspond to native threads of the
+underlying operating system.
+
+@sp 1
+@cartouche
+@noindent
+@strong{99}. Implementation-defined @code{policy_identifiers} allowed
+in a pragma @code{Task_Dispatching_Policy}. See D.2.2(3).
+@end cartouche
+@noindent
+There are no implementation-defined policy-identifiers allowed in this
+pragma.
+
+@sp 1
+@cartouche
+@noindent
+@strong{100}. Implementation-defined aspects of priority inversion. See
+D.2.2(16).
+@end cartouche
+@noindent
+Execution of a task cannot be preempted by the implementation processing
+of delay expirations for lower priority tasks.
+
+@sp 1
+@cartouche
+@noindent
+@strong{101}. Implementation-defined task dispatching. See D.2.2(18).
+@end cartouche
+@noindent
+The policy is the same as that of the underlying threads implementation.
+
+@sp 1
+@cartouche
+@noindent
+@strong{102}. Implementation-defined @code{policy_identifiers} allowed
+in a pragma @code{Locking_Policy}. See D.3(4).
+@end cartouche
+@noindent
+The two implementation defined policies permitted in GNAT are
+@code{Inheritance_Locking} and @code{Conccurent_Readers_Locking}. On
+targets that support the @code{Inheritance_Locking} policy, locking is
+implemented by inheritance, i.e.@: the task owning the lock operates
+at a priority equal to the highest priority of any task currently
+requesting the lock. On targets that support the
+@code{Conccurent_Readers_Locking} policy, locking is implemented with a
+read/write lock allowing multiple propected object functions to enter
+concurrently.
+
+@sp 1
+@cartouche
+@noindent
+@strong{103}. Default ceiling priorities. See D.3(10).
+@end cartouche
+@noindent
+The ceiling priority of protected objects of the type
+@code{System.Interrupt_Priority'Last} as described in the Ada
+Reference Manual D.3(10),
+
+@sp 1
+@cartouche
+@noindent
+@strong{104}. The ceiling of any protected object used internally by
+the implementation. See D.3(16).
+@end cartouche
+@noindent
+The ceiling priority of internal protected objects is
+@code{System.Priority'Last}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{105}. Implementation-defined queuing policies. See D.4(1).
+@end cartouche
+@noindent
+There are no implementation-defined queuing policies.
+
+@sp 1
+@cartouche
+@noindent
+@strong{106}. On a multiprocessor, any conditions that cause the
+completion of an aborted construct to be delayed later than what is
+specified for a single processor. See D.6(3).
+@end cartouche
+@noindent
+The semantics for abort on a multi-processor is the same as on a single
+processor, there are no further delays.
+
+@sp 1
+@cartouche
+@noindent
+@strong{107}. Any operations that implicitly require heap storage
+allocation. See D.7(8).
+@end cartouche
+@noindent
+The only operation that implicitly requires heap storage allocation is
+task creation.
+
+@sp 1
+@cartouche
+@noindent
+@strong{108}. Implementation-defined aspects of pragma
+@code{Restrictions}. See D.7(20).
+@end cartouche
+@noindent
+There are no such implementation-defined aspects.
+
+@sp 1
+@cartouche
+@noindent
+@strong{109}. Implementation-defined aspects of package
+@code{Real_Time}. See D.8(17).
+@end cartouche
+@noindent
+There are no implementation defined aspects of package @code{Real_Time}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{110}. Implementation-defined aspects of
+@code{delay_statements}. See D.9(8).
+@end cartouche
+@noindent
+Any difference greater than one microsecond will cause the task to be
+delayed (see D.9(7)).
+
+@sp 1
+@cartouche
+@noindent
+@strong{111}. The upper bound on the duration of interrupt blocking
+caused by the implementation. See D.12(5).
+@end cartouche
+@noindent
+The upper bound is determined by the underlying operating system. In
+no cases is it more than 10 milliseconds.
+
+@sp 1
+@cartouche
+@noindent
+@strong{112}. The means for creating and executing distributed
+programs. See E(5).
+@end cartouche
+@noindent
+The GLADE package provides a utility GNATDIST for creating and executing
+distributed programs. See the GLADE reference manual for further details.
+
+@sp 1
+@cartouche
+@noindent
+@strong{113}. Any events that can result in a partition becoming
+inaccessible. See E.1(7).
+@end cartouche
+@noindent
+See the GLADE reference manual for full details on such events.
+
+@sp 1
+@cartouche
+@noindent
+@strong{114}. The scheduling policies, treatment of priorities, and
+management of shared resources between partitions in certain cases. See
+E.1(11).
+@end cartouche
+@noindent
+See the GLADE reference manual for full details on these aspects of
+multi-partition execution.
+
+@sp 1
+@cartouche
+@noindent
+@strong{115}. Events that cause the version of a compilation unit to
+change. See E.3(5).
+@end cartouche
+@noindent
+Editing the source file of a compilation unit, or the source files of
+any units on which it is dependent in a significant way cause the version
+to change. No other actions cause the version number to change. All changes
+are significant except those which affect only layout, capitalization or
+comments.
+
+@sp 1
+@cartouche
+@noindent
+@strong{116}. Whether the execution of the remote subprogram is
+immediately aborted as a result of cancellation. See E.4(13).
+@end cartouche
+@noindent
+See the GLADE reference manual for details on the effect of abort in
+a distributed application.
+
+@sp 1
+@cartouche
+@noindent
+@strong{117}. Implementation-defined aspects of the PCS@. See E.5(25).
+@end cartouche
+@noindent
+See the GLADE reference manual for a full description of all implementation
+defined aspects of the PCS@.
+
+@sp 1
+@cartouche
+@noindent
+@strong{118}. Implementation-defined interfaces in the PCS@. See
+E.5(26).
+@end cartouche
+@noindent
+See the GLADE reference manual for a full description of all
+implementation defined interfaces.
+
+@sp 1
+@cartouche
+@noindent
+@strong{119}. The values of named numbers in the package
+@code{Decimal}. See F.2(7).
+@end cartouche
+@noindent
+@table @code
+@item Max_Scale
++18
+@item Min_Scale
+-18
+@item Min_Delta
+1.0E-18
+@item Max_Delta
+1.0E+18
+@item Max_Decimal_Digits
+18
+@end table
+
+@sp 1
+@cartouche
+@noindent
+@strong{120}. The value of @code{Max_Picture_Length} in the package
+@code{Text_IO.Editing}. See F.3.3(16).
+@end cartouche
+@noindent
+64
+
+@sp 1
+@cartouche
+@noindent
+@strong{121}. The value of @code{Max_Picture_Length} in the package
+@code{Wide_Text_IO.Editing}. See F.3.4(5).
+@end cartouche
+@noindent
+64
+
+@sp 1
+@cartouche
+@noindent
+@strong{122}. The accuracy actually achieved by the complex elementary
+functions and by other complex arithmetic operations. See G.1(1).
+@end cartouche
+@noindent
+Standard library functions are used for the complex arithmetic
+operations. Only fast math mode is currently supported.
+
+@sp 1
+@cartouche
+@noindent
+@strong{123}. The sign of a zero result (or a component thereof) from
+any operator or function in @code{Numerics.Generic_Complex_Types}, when
+@code{Real'Signed_Zeros} is True. See G.1.1(53).
+@end cartouche
+@noindent
+The signs of zero values are as recommended by the relevant
+implementation advice.
+
+@sp 1
+@cartouche
+@noindent
+@strong{124}. The sign of a zero result (or a component thereof) from
+any operator or function in
+@code{Numerics.Generic_Complex_Elementary_Functions}, when
+@code{Real'Signed_Zeros} is @code{True}. See G.1.2(45).
+@end cartouche
+@noindent
+The signs of zero values are as recommended by the relevant
+implementation advice.
+
+@sp 1
+@cartouche
+@noindent
+@strong{125}. Whether the strict mode or the relaxed mode is the
+default. See G.2(2).
+@end cartouche
+@noindent
+The strict mode is the default. There is no separate relaxed mode. GNAT
+provides a highly efficient implementation of strict mode.
+
+@sp 1
+@cartouche
+@noindent
+@strong{126}. The result interval in certain cases of fixed-to-float
+conversion. See G.2.1(10).
+@end cartouche
+@noindent
+For cases where the result interval is implementation dependent, the
+accuracy is that provided by performing all operations in 64-bit IEEE
+floating-point format.
+
+@sp 1
+@cartouche
+@noindent
+@strong{127}. The result of a floating point arithmetic operation in
+overflow situations, when the @code{Machine_Overflows} attribute of the
+result type is @code{False}. See G.2.1(13).
+@end cartouche
+@noindent
+Infinite and NaN values are produced as dictated by the IEEE
+floating-point standard.
+
+Note that on machines that are not fully compliant with the IEEE
+floating-point standard, such as Alpha, the @option{-mieee} compiler flag
+must be used for achieving IEEE conforming behavior (although at the cost
+of a significant performance penalty), so infinite and NaN values are
+properly generated.
+
+@sp 1
+@cartouche
+@noindent
+@strong{128}. The result interval for division (or exponentiation by a
+negative exponent), when the floating point hardware implements division
+as multiplication by a reciprocal. See G.2.1(16).
+@end cartouche
+@noindent
+Not relevant, division is IEEE exact.
+
+@sp 1
+@cartouche
+@noindent
+@strong{129}. The definition of close result set, which determines the
+accuracy of certain fixed point multiplications and divisions. See
+G.2.3(5).
+@end cartouche
+@noindent
+Operations in the close result set are performed using IEEE long format
+floating-point arithmetic. The input operands are converted to
+floating-point, the operation is done in floating-point, and the result
+is converted to the target type.
+
+@sp 1
+@cartouche
+@noindent
+@strong{130}. Conditions on a @code{universal_real} operand of a fixed
+point multiplication or division for which the result shall be in the
+perfect result set. See G.2.3(22).
+@end cartouche
+@noindent
+The result is only defined to be in the perfect result set if the result
+can be computed by a single scaling operation involving a scale factor
+representable in 64-bits.
+
+@sp 1
+@cartouche
+@noindent
+@strong{131}. The result of a fixed point arithmetic operation in
+overflow situations, when the @code{Machine_Overflows} attribute of the
+result type is @code{False}. See G.2.3(27).
+@end cartouche
+@noindent
+Not relevant, @code{Machine_Overflows} is @code{True} for fixed-point
+types.
+
+@sp 1
+@cartouche
+@noindent
+@strong{132}. The result of an elementary function reference in
+overflow situations, when the @code{Machine_Overflows} attribute of the
+result type is @code{False}. See G.2.4(4).
+@end cartouche
+@noindent
+IEEE infinite and Nan values are produced as appropriate.
+
+@sp 1
+@cartouche
+@noindent
+@strong{133}. The value of the angle threshold, within which certain
+elementary functions, complex arithmetic operations, and complex
+elementary functions yield results conforming to a maximum relative
+error bound. See G.2.4(10).
+@end cartouche
+@noindent
+Information on this subject is not yet available.
+
+@sp 1
+@cartouche
+@noindent
+@strong{134}. The accuracy of certain elementary functions for
+parameters beyond the angle threshold. See G.2.4(10).
+@end cartouche
+@noindent
+Information on this subject is not yet available.
+
+@sp 1
+@cartouche
+@noindent
+@strong{135}. The result of a complex arithmetic operation or complex
+elementary function reference in overflow situations, when the
+@code{Machine_Overflows} attribute of the corresponding real type is
+@code{False}. See G.2.6(5).
+@end cartouche
+@noindent
+IEEE infinite and Nan values are produced as appropriate.
+
+@sp 1
+@cartouche
+@noindent
+@strong{136}. The accuracy of certain complex arithmetic operations and
+certain complex elementary functions for parameters (or components
+thereof) beyond the angle threshold. See G.2.6(8).
+@end cartouche
+@noindent
+Information on those subjects is not yet available.
+
+@sp 1
+@cartouche
+@noindent
+@strong{137}. Information regarding bounded errors and erroneous
+execution. See H.2(1).
+@end cartouche
+@noindent
+Information on this subject is not yet available.
+
+@sp 1
+@cartouche
+@noindent
+@strong{138}. Implementation-defined aspects of pragma
+@code{Inspection_Point}. See H.3.2(8).
+@end cartouche
+@noindent
+Pragma @code{Inspection_Point} ensures that the variable is live and can
+be examined by the debugger at the inspection point.
+
+@sp 1
+@cartouche
+@noindent
+@strong{139}. Implementation-defined aspects of pragma
+@code{Restrictions}. See H.4(25).
+@end cartouche
+@noindent
+There are no implementation-defined aspects of pragma @code{Restrictions}. The
+use of pragma @code{Restrictions [No_Exceptions]} has no effect on the
+generated code. Checks must suppressed by use of pragma @code{Suppress}.
+
+@sp 1
+@cartouche
+@noindent
+@strong{140}. Any restrictions on pragma @code{Restrictions}. See
+H.4(27).
+@end cartouche
+@noindent
+There are no restrictions on pragma @code{Restrictions}.
+
+@node Intrinsic Subprograms
+@chapter Intrinsic Subprograms
+@cindex Intrinsic Subprograms
+
+@menu
+* Intrinsic Operators::
+* Enclosing_Entity::
+* Exception_Information::
+* Exception_Message::
+* Exception_Name::
+* File::
+* Line::
+* Shifts and Rotates::
+* Source_Location::
+@end menu
+
+@noindent
+GNAT allows a user application program to write the declaration:
+
+@smallexample @c ada
+ pragma Import (Intrinsic, name);
+@end smallexample
+
+@noindent
+providing that the name corresponds to one of the implemented intrinsic
+subprograms in GNAT, and that the parameter profile of the referenced
+subprogram meets the requirements. This chapter describes the set of
+implemented intrinsic subprograms, and the requirements on parameter profiles.
+Note that no body is supplied; as with other uses of pragma Import, the
+body is supplied elsewhere (in this case by the compiler itself). Note
+that any use of this feature is potentially non-portable, since the
+Ada standard does not require Ada compilers to implement this feature.
+
+@node Intrinsic Operators
+@section Intrinsic Operators
+@cindex Intrinsic operator
+
+@noindent
+All the predefined numeric operators in package Standard
+in @code{pragma Import (Intrinsic,..)}
+declarations. In the binary operator case, the operands must have the same
+size. The operand or operands must also be appropriate for
+the operator. For example, for addition, the operands must
+both be floating-point or both be fixed-point, and the
+right operand for @code{"**"} must have a root type of
+@code{Standard.Integer'Base}.
+You can use an intrinsic operator declaration as in the following example:
+
+@smallexample @c ada
+ type Int1 is new Integer;
+ type Int2 is new Integer;
+
+ function "+" (X1 : Int1; X2 : Int2) return Int1;
+ function "+" (X1 : Int1; X2 : Int2) return Int2;
+ pragma Import (Intrinsic, "+");
+@end smallexample
+
+@noindent
+This declaration would permit ``mixed mode'' arithmetic on items
+of the differing types @code{Int1} and @code{Int2}.
+It is also possible to specify such operators for private types, if the
+full views are appropriate arithmetic types.
+
+@node Enclosing_Entity
+@section Enclosing_Entity
+@cindex Enclosing_Entity
+@noindent
+This intrinsic subprogram is used in the implementation of the
+library routine @code{GNAT.Source_Info}. The only useful use of the
+intrinsic import in this case is the one in this unit, so an
+application program should simply call the function
+@code{GNAT.Source_Info.Enclosing_Entity} to obtain the name of
+the current subprogram, package, task, entry, or protected subprogram.
+
+@node Exception_Information
+@section Exception_Information
+@cindex Exception_Information'
+@noindent
+This intrinsic subprogram is used in the implementation of the
+library routine @code{GNAT.Current_Exception}. The only useful
+use of the intrinsic import in this case is the one in this unit,
+so an application program should simply call the function
+@code{GNAT.Current_Exception.Exception_Information} to obtain
+the exception information associated with the current exception.
+
+@node Exception_Message
+@section Exception_Message
+@cindex Exception_Message
+@noindent
+This intrinsic subprogram is used in the implementation of the
+library routine @code{GNAT.Current_Exception}. The only useful
+use of the intrinsic import in this case is the one in this unit,
+so an application program should simply call the function
+@code{GNAT.Current_Exception.Exception_Message} to obtain
+the message associated with the current exception.
+
+@node Exception_Name
+@section Exception_Name
+@cindex Exception_Name
+@noindent
+This intrinsic subprogram is used in the implementation of the
+library routine @code{GNAT.Current_Exception}. The only useful
+use of the intrinsic import in this case is the one in this unit,
+so an application program should simply call the function
+@code{GNAT.Current_Exception.Exception_Name} to obtain
+the name of the current exception.
+
+@node File
+@section File
+@cindex File
+@noindent
+This intrinsic subprogram is used in the implementation of the
+library routine @code{GNAT.Source_Info}. The only useful use of the
+intrinsic import in this case is the one in this unit, so an
+application program should simply call the function
+@code{GNAT.Source_Info.File} to obtain the name of the current
+file.
+
+@node Line
+@section Line
+@cindex Line
+@noindent
+This intrinsic subprogram is used in the implementation of the
+library routine @code{GNAT.Source_Info}. The only useful use of the
+intrinsic import in this case is the one in this unit, so an
+application program should simply call the function
+@code{GNAT.Source_Info.Line} to obtain the number of the current
+source line.
+
+@node Shifts and Rotates
+@section Shifts and Rotates
+@cindex Shift_Left
+@cindex Shift_Right
+@cindex Shift_Right_Arithmetic
+@cindex Rotate_Left
+@cindex Rotate_Right
+@noindent
+In standard Ada, the shift and rotate functions are available only
+for the predefined modular types in package @code{Interfaces}. However, in
+GNAT it is possible to define these functions for any integer
+type (signed or modular), as in this example:
+
+@smallexample @c ada
+ function Shift_Left
+ (Value : T;
+ Amount : Natural) return T;
+@end smallexample
+
+@noindent
+The function name must be one of
+Shift_Left, Shift_Right, Shift_Right_Arithmetic, Rotate_Left, or
+Rotate_Right. T must be an integer type. T'Size must be
+8, 16, 32 or 64 bits; if T is modular, the modulus
+must be 2**8, 2**16, 2**32 or 2**64.
+The result type must be the same as the type of @code{Value}.
+The shift amount must be Natural.
+The formal parameter names can be anything.
+
+A more convenient way of providing these shift operators is to use
+the Provide_Shift_Operators pragma, which provides the function declarations
+and corresponding pragma Import's for all five shift functions.
+
+@node Source_Location
+@section Source_Location
+@cindex Source_Location
+@noindent
+This intrinsic subprogram is used in the implementation of the
+library routine @code{GNAT.Source_Info}. The only useful use of the
+intrinsic import in this case is the one in this unit, so an
+application program should simply call the function
+@code{GNAT.Source_Info.Source_Location} to obtain the current
+source file location.
+
+@node Representation Clauses and Pragmas
+@chapter Representation Clauses and Pragmas
+@cindex Representation Clauses
+
+@menu
+* Alignment Clauses::
+* Size Clauses::
+* Storage_Size Clauses::
+* Size of Variant Record Objects::
+* Biased Representation ::
+* Value_Size and Object_Size Clauses::
+* Component_Size Clauses::
+* Bit_Order Clauses::
+* Effect of Bit_Order on Byte Ordering::
+* Pragma Pack for Arrays::
+* Pragma Pack for Records::
+* Record Representation Clauses::
+* Handling of Records with Holes::
+* Enumeration Clauses::
+* Address Clauses::
+* Effect of Convention on Representation::
+* Conventions and Anonymous Access Types::
+* Determining the Representations chosen by GNAT::
+@end menu
+
+@noindent
+@cindex Representation Clause
+@cindex Representation Pragma
+@cindex Pragma, representation
+This section describes the representation clauses accepted by GNAT, and
+their effect on the representation of corresponding data objects.
+
+GNAT fully implements Annex C (Systems Programming). This means that all
+the implementation advice sections in chapter 13 are fully implemented.
+However, these sections only require a minimal level of support for
+representation clauses. GNAT provides much more extensive capabilities,
+and this section describes the additional capabilities provided.
+
+@node Alignment Clauses
+@section Alignment Clauses
+@cindex Alignment Clause
+
+@noindent
+GNAT requires that all alignment clauses specify a power of 2, and all
+default alignments are always a power of 2. The default alignment
+values are as follows:
+
+@itemize @bullet
+@item @emph{Primitive Types}.
+For primitive types, the alignment is the minimum of the actual size of
+objects of the type divided by @code{Storage_Unit},
+and the maximum alignment supported by the target.
+(This maximum alignment is given by the GNAT-specific attribute
+@code{Standard'Maximum_Alignment}; see @ref{Attribute Maximum_Alignment}.)
+@cindex @code{Maximum_Alignment} attribute
+For example, for type @code{Long_Float}, the object size is 8 bytes, and the
+default alignment will be 8 on any target that supports alignments
+this large, but on some targets, the maximum alignment may be smaller
+than 8, in which case objects of type @code{Long_Float} will be maximally
+aligned.
+
+@item @emph{Arrays}.
+For arrays, the alignment is equal to the alignment of the component type
+for the normal case where no packing or component size is given. If the
+array is packed, and the packing is effective (see separate section on
+packed arrays), then the alignment will be one for long packed arrays,
+or arrays whose length is not known at compile time. For short packed
+arrays, which are handled internally as modular types, the alignment
+will be as described for primitive types, e.g.@: a packed array of length
+31 bits will have an object size of four bytes, and an alignment of 4.
+
+@item @emph{Records}.
+For the normal non-packed case, the alignment of a record is equal to
+the maximum alignment of any of its components. For tagged records, this
+includes the implicit access type used for the tag. If a pragma @code{Pack}
+is used and all components are packable (see separate section on pragma
+@code{Pack}), then the resulting alignment is 1, unless the layout of the
+record makes it profitable to increase it.
+
+A special case is when:
+@itemize @bullet
+@item
+the size of the record is given explicitly, or a
+full record representation clause is given, and
+@item
+the size of the record is 2, 4, or 8 bytes.
+@end itemize
+@noindent
+In this case, an alignment is chosen to match the
+size of the record. For example, if we have:
+
+@smallexample @c ada
+ type Small is record
+ A, B : Character;
+ end record;
+ for Small'Size use 16;
+@end smallexample
+
+@noindent
+then the default alignment of the record type @code{Small} is 2, not 1. This
+leads to more efficient code when the record is treated as a unit, and also
+allows the type to specified as @code{Atomic} on architectures requiring
+strict alignment.
+
+@end itemize
+
+@noindent
+An alignment clause may specify a larger alignment than the default value
+up to some maximum value dependent on the target (obtainable by using the
+attribute reference @code{Standard'Maximum_Alignment}). It may also specify
+a smaller alignment than the default value for enumeration, integer and
+fixed point types, as well as for record types, for example
+
+@smallexample @c ada
+ type V is record
+ A : Integer;
+ end record;
+
+ for V'alignment use 1;
+@end smallexample
+
+@noindent
+@cindex Alignment, default
+The default alignment for the type @code{V} is 4, as a result of the
+Integer field in the record, but it is permissible, as shown, to
+override the default alignment of the record with a smaller value.
+
+@cindex Alignment, subtypes
+Note that according to the Ada standard, an alignment clause applies only
+to the first named subtype. If additional subtypes are declared, then the
+compiler is allowed to choose any alignment it likes, and there is no way
+to control this choice. Consider:
+
+@smallexample @c ada
+ type R is range 1 .. 10_000;
+ for R'Alignment use 1;
+ subtype RS is R range 1 .. 1000;
+@end smallexample
+
+@noindent
+The alignment clause specifies an alignment of 1 for the first named subtype
+@code{R} but this does not necessarily apply to @code{RS}. When writing
+portable Ada code, you should avoid writing code that explicitly or
+implicitly relies on the alignment of such subtypes.
+
+For the GNAT compiler, if an explicit alignment clause is given, this
+value is also used for any subsequent subtypes. So for GNAT, in the
+above example, you can count on the alignment of @code{RS} being 1. But this
+assumption is non-portable, and other compilers may choose different
+alignments for the subtype @code{RS}.
+
+@node Size Clauses
+@section Size Clauses
+@cindex Size Clause
+
+@noindent
+The default size for a type @code{T} is obtainable through the
+language-defined attribute @code{T'Size} and also through the
+equivalent GNAT-defined attribute @code{T'Value_Size}.
+For objects of type @code{T}, GNAT will generally increase the type size
+so that the object size (obtainable through the GNAT-defined attribute
+@code{T'Object_Size})
+is a multiple of @code{T'Alignment * Storage_Unit}.
+For example
+
+@smallexample @c ada
+ type Smallint is range 1 .. 6;
+
+ type Rec is record
+ Y1 : integer;
+ Y2 : boolean;
+ end record;
+@end smallexample
+
+@noindent
+In this example, @code{Smallint'Size} = @code{Smallint'Value_Size} = 3,
+as specified by the RM rules,
+but objects of this type will have a size of 8
+(@code{Smallint'Object_Size} = 8),
+since objects by default occupy an integral number
+of storage units. On some targets, notably older
+versions of the Digital Alpha, the size of stand
+alone objects of this type may be 32, reflecting
+the inability of the hardware to do byte load/stores.
+
+Similarly, the size of type @code{Rec} is 40 bits
+(@code{Rec'Size} = @code{Rec'Value_Size} = 40), but
+the alignment is 4, so objects of this type will have
+their size increased to 64 bits so that it is a multiple
+of the alignment (in bits). This decision is
+in accordance with the specific Implementation Advice in RM 13.3(43):
+
+@quotation
+A @code{Size} clause should be supported for an object if the specified
+@code{Size} is at least as large as its subtype's @code{Size}, and corresponds
+to a size in storage elements that is a multiple of the object's
+@code{Alignment} (if the @code{Alignment} is nonzero).
+@end quotation
+
+@noindent
+An explicit size clause may be used to override the default size by
+increasing it. For example, if we have:
+
+@smallexample @c ada
+ type My_Boolean is new Boolean;
+ for My_Boolean'Size use 32;
+@end smallexample
+
+@noindent
+then values of this type will always be 32 bits long. In the case of
+discrete types, the size can be increased up to 64 bits, with the effect
+that the entire specified field is used to hold the value, sign- or
+zero-extended as appropriate. If more than 64 bits is specified, then
+padding space is allocated after the value, and a warning is issued that
+there are unused bits.
+
+Similarly the size of records and arrays may be increased, and the effect
+is to add padding bits after the value. This also causes a warning message
+to be generated.
+
+The largest Size value permitted in GNAT is 2**31@minus{}1. Since this is a
+Size in bits, this corresponds to an object of size 256 megabytes (minus
+one). This limitation is true on all targets. The reason for this
+limitation is that it improves the quality of the code in many cases
+if it is known that a Size value can be accommodated in an object of
+type Integer.
+
+@node Storage_Size Clauses
+@section Storage_Size Clauses
+@cindex Storage_Size Clause
+
+@noindent
+For tasks, the @code{Storage_Size} clause specifies the amount of space
+to be allocated for the task stack. This cannot be extended, and if the
+stack is exhausted, then @code{Storage_Error} will be raised (if stack
+checking is enabled). Use a @code{Storage_Size} attribute definition clause,
+or a @code{Storage_Size} pragma in the task definition to set the
+appropriate required size. A useful technique is to include in every
+task definition a pragma of the form:
+
+@smallexample @c ada
+ pragma Storage_Size (Default_Stack_Size);
+@end smallexample
+
+@noindent
+Then @code{Default_Stack_Size} can be defined in a global package, and
+modified as required. Any tasks requiring stack sizes different from the
+default can have an appropriate alternative reference in the pragma.
+
+You can also use the @option{-d} binder switch to modify the default stack
+size.
+
+For access types, the @code{Storage_Size} clause specifies the maximum
+space available for allocation of objects of the type. If this space is
+exceeded then @code{Storage_Error} will be raised by an allocation attempt.
+In the case where the access type is declared local to a subprogram, the
+use of a @code{Storage_Size} clause triggers automatic use of a special
+predefined storage pool (@code{System.Pool_Size}) that ensures that all
+space for the pool is automatically reclaimed on exit from the scope in
+which the type is declared.
+
+A special case recognized by the compiler is the specification of a
+@code{Storage_Size} of zero for an access type. This means that no
+items can be allocated from the pool, and this is recognized at compile
+time, and all the overhead normally associated with maintaining a fixed
+size storage pool is eliminated. Consider the following example:
+
+@smallexample @c ada
+ procedure p is
+ type R is array (Natural) of Character;
+ type P is access all R;
+ for P'Storage_Size use 0;
+ -- Above access type intended only for interfacing purposes
+
+ y : P;
+
+ procedure g (m : P);
+ pragma Import (C, g);
+
+ -- @dots{}
+
+ begin
+ -- @dots{}
+ y := new R;
+ end;
+@end smallexample
+
+@noindent
+As indicated in this example, these dummy storage pools are often useful in
+connection with interfacing where no object will ever be allocated. If you
+compile the above example, you get the warning:
+
+@smallexample
+ p.adb:16:09: warning: allocation from empty storage pool
+ p.adb:16:09: warning: Storage_Error will be raised at run time
+@end smallexample
+
+@noindent
+Of course in practice, there will not be any explicit allocators in the
+case of such an access declaration.
+
+@node Size of Variant Record Objects
+@section Size of Variant Record Objects
+@cindex Size, variant record objects
+@cindex Variant record objects, size
+
+@noindent
+In the case of variant record objects, there is a question whether Size gives
+information about a particular variant, or the maximum size required
+for any variant. Consider the following program
+
+@smallexample @c ada
+with Text_IO; use Text_IO;
+procedure q is
+ type R1 (A : Boolean := False) is record
+ case A is
+ when True => X : Character;
+ when False => null;
+ end case;
+ end record;
+
+ V1 : R1 (False);
+ V2 : R1;
+
+begin
+ Put_Line (Integer'Image (V1'Size));
+ Put_Line (Integer'Image (V2'Size));
+end q;
+@end smallexample
+
+@noindent
+Here we are dealing with a variant record, where the True variant
+requires 16 bits, and the False variant requires 8 bits.
+In the above example, both V1 and V2 contain the False variant,
+which is only 8 bits long. However, the result of running the
+program is:
+
+@smallexample
+8
+16
+@end smallexample
+
+@noindent
+The reason for the difference here is that the discriminant value of
+V1 is fixed, and will always be False. It is not possible to assign
+a True variant value to V1, therefore 8 bits is sufficient. On the
+other hand, in the case of V2, the initial discriminant value is
+False (from the default), but it is possible to assign a True
+variant value to V2, therefore 16 bits must be allocated for V2
+in the general case, even fewer bits may be needed at any particular
+point during the program execution.
+
+As can be seen from the output of this program, the @code{'Size}
+attribute applied to such an object in GNAT gives the actual allocated
+size of the variable, which is the largest size of any of the variants.
+The Ada Reference Manual is not completely clear on what choice should
+be made here, but the GNAT behavior seems most consistent with the
+language in the RM@.
+
+In some cases, it may be desirable to obtain the size of the current
+variant, rather than the size of the largest variant. This can be
+achieved in GNAT by making use of the fact that in the case of a
+subprogram parameter, GNAT does indeed return the size of the current
+variant (because a subprogram has no way of knowing how much space
+is actually allocated for the actual).
+
+Consider the following modified version of the above program:
+
+@smallexample @c ada
+with Text_IO; use Text_IO;
+procedure q is
+ type R1 (A : Boolean := False) is record
+ case A is
+ when True => X : Character;
+ when False => null;
+ end case;
+ end record;
+
+ V2 : R1;
+
+ function Size (V : R1) return Integer is
+ begin
+ return V'Size;
+ end Size;
+
+begin
+ Put_Line (Integer'Image (V2'Size));
+ Put_Line (Integer'IMage (Size (V2)));
+ V2 := (True, 'x');
+ Put_Line (Integer'Image (V2'Size));
+ Put_Line (Integer'IMage (Size (V2)));
+end q;
+@end smallexample
+
+@noindent
+The output from this program is
+
+@smallexample
+16
+8
+16
+16
+@end smallexample
+
+@noindent
+Here we see that while the @code{'Size} attribute always returns
+the maximum size, regardless of the current variant value, the
+@code{Size} function does indeed return the size of the current
+variant value.
+
+@node Biased Representation
+@section Biased Representation
+@cindex Size for biased representation
+@cindex Biased representation
+
+@noindent
+In the case of scalars with a range starting at other than zero, it is
+possible in some cases to specify a size smaller than the default minimum
+value, and in such cases, GNAT uses an unsigned biased representation,
+in which zero is used to represent the lower bound, and successive values
+represent successive values of the type.
+
+For example, suppose we have the declaration:
+
+@smallexample @c ada
+ type Small is range -7 .. -4;
+ for Small'Size use 2;
+@end smallexample
+
+@noindent
+Although the default size of type @code{Small} is 4, the @code{Size}
+clause is accepted by GNAT and results in the following representation
+scheme:
+
+@smallexample
+ -7 is represented as 2#00#
+ -6 is represented as 2#01#
+ -5 is represented as 2#10#
+ -4 is represented as 2#11#
+@end smallexample
+
+@noindent
+Biased representation is only used if the specified @code{Size} clause
+cannot be accepted in any other manner. These reduced sizes that force
+biased representation can be used for all discrete types except for
+enumeration types for which a representation clause is given.
+
+@node Value_Size and Object_Size Clauses
+@section Value_Size and Object_Size Clauses
+@findex Value_Size
+@findex Object_Size
+@cindex Size, of objects
+
+@noindent
+In Ada 95 and Ada 2005, @code{T'Size} for a type @code{T} is the minimum
+number of bits required to hold values of type @code{T}.
+Although this interpretation was allowed in Ada 83, it was not required,
+and this requirement in practice can cause some significant difficulties.
+For example, in most Ada 83 compilers, @code{Natural'Size} was 32.
+However, in Ada 95 and Ada 2005,
+@code{Natural'Size} is
+typically 31. This means that code may change in behavior when moving
+from Ada 83 to Ada 95 or Ada 2005. For example, consider:
+
+@smallexample @c ada
+ type Rec is record;
+ A : Natural;
+ B : Natural;
+ end record;
+
+ for Rec use record
+ at 0 range 0 .. Natural'Size - 1;
+ at 0 range Natural'Size .. 2 * Natural'Size - 1;
+ end record;
+@end smallexample
+
+@noindent
+In the above code, since the typical size of @code{Natural} objects
+is 32 bits and @code{Natural'Size} is 31, the above code can cause
+unexpected inefficient packing in Ada 95 and Ada 2005, and in general
+there are cases where the fact that the object size can exceed the
+size of the type causes surprises.
+
+To help get around this problem GNAT provides two implementation
+defined attributes, @code{Value_Size} and @code{Object_Size}. When
+applied to a type, these attributes yield the size of the type
+(corresponding to the RM defined size attribute), and the size of
+objects of the type respectively.
+
+The @code{Object_Size} is used for determining the default size of
+objects and components. This size value can be referred to using the
+@code{Object_Size} attribute. The phrase ``is used'' here means that it is
+the basis of the determination of the size. The backend is free to
+pad this up if necessary for efficiency, e.g.@: an 8-bit stand-alone
+character might be stored in 32 bits on a machine with no efficient
+byte access instructions such as the Alpha.
+
+The default rules for the value of @code{Object_Size} for
+discrete types are as follows:
+
+@itemize @bullet
+@item
+The @code{Object_Size} for base subtypes reflect the natural hardware
+size in bits (run the compiler with @option{-gnatS} to find those values
+for numeric types). Enumeration types and fixed-point base subtypes have
+8, 16, 32 or 64 bits for this size, depending on the range of values
+to be stored.
+
+@item
+The @code{Object_Size} of a subtype is the same as the
+@code{Object_Size} of
+the type from which it is obtained.
+
+@item
+The @code{Object_Size} of a derived base type is copied from the parent
+base type, and the @code{Object_Size} of a derived first subtype is copied
+from the parent first subtype.
+@end itemize
+
+@noindent
+The @code{Value_Size} attribute
+is the (minimum) number of bits required to store a value
+of the type.
+This value is used to determine how tightly to pack
+records or arrays with components of this type, and also affects
+the semantics of unchecked conversion (unchecked conversions where
+the @code{Value_Size} values differ generate a warning, and are potentially
+target dependent).
+
+The default rules for the value of @code{Value_Size} are as follows:
+
+@itemize @bullet
+@item
+The @code{Value_Size} for a base subtype is the minimum number of bits
+required to store all values of the type (including the sign bit
+only if negative values are possible).
+
+@item
+If a subtype statically matches the first subtype of a given type, then it has
+by default the same @code{Value_Size} as the first subtype. This is a
+consequence of RM 13.1(14) (``if two subtypes statically match,
+then their subtype-specific aspects are the same''.)
+
+@item
+All other subtypes have a @code{Value_Size} corresponding to the minimum
+number of bits required to store all values of the subtype. For
+dynamic bounds, it is assumed that the value can range down or up
+to the corresponding bound of the ancestor
+@end itemize
+
+@noindent
+The RM defined attribute @code{Size} corresponds to the
+@code{Value_Size} attribute.
+
+The @code{Size} attribute may be defined for a first-named subtype. This sets
+the @code{Value_Size} of
+the first-named subtype to the given value, and the
+@code{Object_Size} of this first-named subtype to the given value padded up
+to an appropriate boundary. It is a consequence of the default rules
+above that this @code{Object_Size} will apply to all further subtypes. On the
+other hand, @code{Value_Size} is affected only for the first subtype, any
+dynamic subtypes obtained from it directly, and any statically matching
+subtypes. The @code{Value_Size} of any other static subtypes is not affected.
+
+@code{Value_Size} and
+@code{Object_Size} may be explicitly set for any subtype using
+an attribute definition clause. Note that the use of these attributes
+can cause the RM 13.1(14) rule to be violated. If two access types
+reference aliased objects whose subtypes have differing @code{Object_Size}
+values as a result of explicit attribute definition clauses, then it
+is illegal to convert from one access subtype to the other. For a more
+complete description of this additional legality rule, see the
+description of the @code{Object_Size} attribute.
+
+At the implementation level, Esize stores the Object_Size and the
+RM_Size field stores the @code{Value_Size} (and hence the value of the
+@code{Size} attribute,
+which, as noted above, is equivalent to @code{Value_Size}).
+
+To get a feel for the difference, consider the following examples (note
+that in each case the base is @code{Short_Short_Integer} with a size of 8):
+
+@smallexample
+ Object_Size Value_Size
+
+type x1 is range 0 .. 5; 8 3
+
+type x2 is range 0 .. 5;
+for x2'size use 12; 16 12
+
+subtype x3 is x2 range 0 .. 3; 16 2
+
+subtype x4 is x2'base range 0 .. 10; 8 4
+
+subtype x5 is x2 range 0 .. dynamic; 16 3*
+
+subtype x6 is x2'base range 0 .. dynamic; 8 3*
+
+@end smallexample
+
+@noindent
+Note: the entries marked ``3*'' are not actually specified by the Ada
+Reference Manual, but it seems in the spirit of the RM rules to allocate
+the minimum number of bits (here 3, given the range for @code{x2})
+known to be large enough to hold the given range of values.
+
+So far, so good, but GNAT has to obey the RM rules, so the question is
+under what conditions must the RM @code{Size} be used.
+The following is a list
+of the occasions on which the RM @code{Size} must be used:
+
+@itemize @bullet
+@item
+Component size for packed arrays or records
+
+@item
+Value of the attribute @code{Size} for a type
+
+@item
+Warning about sizes not matching for unchecked conversion
+@end itemize
+
+@noindent
+For record types, the @code{Object_Size} is always a multiple of the
+alignment of the type (this is true for all types). In some cases the
+@code{Value_Size} can be smaller. Consider:
+
+@smallexample
+ type R is record
+ X : Integer;
+ Y : Character;
+ end record;
+@end smallexample
+
+@noindent
+On a typical 32-bit architecture, the X component will be four bytes, and
+require four-byte alignment, and the Y component will be one byte. In this
+case @code{R'Value_Size} will be 40 (bits) since this is the minimum size
+required to store a value of this type, and for example, it is permissible
+to have a component of type R in an outer array whose component size is
+specified to be 48 bits. However, @code{R'Object_Size} will be 64 (bits),
+since it must be rounded up so that this value is a multiple of the
+alignment (4 bytes = 32 bits).
+
+@noindent
+For all other types, the @code{Object_Size}
+and Value_Size are the same (and equivalent to the RM attribute @code{Size}).
+Only @code{Size} may be specified for such types.
+
+Note that @code{Value_Size} can be used to force biased representation
+for a particular subtype. Consider this example:
+
+@smallexample
+ type R is (A, B, C, D, E, F);
+ subtype RAB is R range A .. B;
+ subtype REF is R range E .. F;
+@end smallexample
+
+@noindent
+By default, @code{RAB}
+has a size of 1 (sufficient to accommodate the representation
+of @code{A} and @code{B}, 0 and 1), and @code{REF}
+has a size of 3 (sufficient to accommodate the representation
+of @code{E} and @code{F}, 4 and 5). But if we add the
+following @code{Value_Size} attribute definition clause:
+
+@smallexample
+ for REF'Value_Size use 1;
+@end smallexample
+
+@noindent
+then biased representation is forced for @code{REF},
+and 0 will represent @code{E} and 1 will represent @code{F}.
+A warning is issued when a @code{Value_Size} attribute
+definition clause forces biased representation. This
+warning can be turned off using @code{-gnatw.B}.
+
+@node Component_Size Clauses
+@section Component_Size Clauses
+@cindex Component_Size Clause
+
+@noindent
+Normally, the value specified in a component size clause must be consistent
+with the subtype of the array component with regard to size and alignment.
+In other words, the value specified must be at least equal to the size
+of this subtype, and must be a multiple of the alignment value.
+
+In addition, component size clauses are allowed which cause the array
+to be packed, by specifying a smaller value. A first case is for
+component size values in the range 1 through 63. The value specified
+must not be smaller than the Size of the subtype. GNAT will accurately
+honor all packing requests in this range. For example, if we have:
+
+@smallexample @c ada
+type r is array (1 .. 8) of Natural;
+for r'Component_Size use 31;
+@end smallexample
+
+@noindent
+then the resulting array has a length of 31 bytes (248 bits = 8 * 31).
+Of course access to the components of such an array is considerably
+less efficient than if the natural component size of 32 is used.
+A second case is when the subtype of the component is a record type
+padded because of its default alignment. For example, if we have:
+
+@smallexample @c ada
+type r is record
+ i : Integer;
+ j : Integer;
+ b : Boolean;
+end record;
+
+type a is array (1 .. 8) of r;
+for a'Component_Size use 72;
+@end smallexample
+
+@noindent
+then the resulting array has a length of 72 bytes, instead of 96 bytes
+if the alignment of the record (4) was obeyed.
+
+Note that there is no point in giving both a component size clause
+and a pragma Pack for the same array type. if such duplicate
+clauses are given, the pragma Pack will be ignored.
+
+@node Bit_Order Clauses
+@section Bit_Order Clauses
+@cindex Bit_Order Clause
+@cindex bit ordering
+@cindex ordering, of bits
+
+@noindent
+For record subtypes, GNAT permits the specification of the @code{Bit_Order}
+attribute. The specification may either correspond to the default bit
+order for the target, in which case the specification has no effect and
+places no additional restrictions, or it may be for the non-standard
+setting (that is the opposite of the default).
+
+In the case where the non-standard value is specified, the effect is
+to renumber bits within each byte, but the ordering of bytes is not
+affected. There are certain
+restrictions placed on component clauses as follows:
+
+@itemize @bullet
+
+@item Components fitting within a single storage unit.
+@noindent
+These are unrestricted, and the effect is merely to renumber bits. For
+example if we are on a little-endian machine with @code{Low_Order_First}
+being the default, then the following two declarations have exactly
+the same effect:
+
+@smallexample @c ada
+ type R1 is record
+ A : Boolean;
+ B : Integer range 1 .. 120;
+ end record;
+
+ for R1 use record
+ A at 0 range 0 .. 0;
+ B at 0 range 1 .. 7;
+ end record;
+
+ type R2 is record
+ A : Boolean;
+ B : Integer range 1 .. 120;
+ end record;
+
+ for R2'Bit_Order use High_Order_First;
+
+ for R2 use record
+ A at 0 range 7 .. 7;
+ B at 0 range 0 .. 6;
+ end record;
+@end smallexample
+
+@noindent
+The useful application here is to write the second declaration with the
+@code{Bit_Order} attribute definition clause, and know that it will be treated
+the same, regardless of whether the target is little-endian or big-endian.
+
+@item Components occupying an integral number of bytes.
+@noindent
+These are components that exactly fit in two or more bytes. Such component
+declarations are allowed, but have no effect, since it is important to realize
+that the @code{Bit_Order} specification does not affect the ordering of bytes.
+In particular, the following attempt at getting an endian-independent integer
+does not work:
+
+@smallexample @c ada
+ type R2 is record
+ A : Integer;
+ end record;
+
+ for R2'Bit_Order use High_Order_First;
+
+ for R2 use record
+ A at 0 range 0 .. 31;
+ end record;
+@end smallexample
+
+@noindent
+This declaration will result in a little-endian integer on a
+little-endian machine, and a big-endian integer on a big-endian machine.
+If byte flipping is required for interoperability between big- and
+little-endian machines, this must be explicitly programmed. This capability
+is not provided by @code{Bit_Order}.
+
+@item Components that are positioned across byte boundaries
+@noindent
+but do not occupy an integral number of bytes. Given that bytes are not
+reordered, such fields would occupy a non-contiguous sequence of bits
+in memory, requiring non-trivial code to reassemble. They are for this
+reason not permitted, and any component clause specifying such a layout
+will be flagged as illegal by GNAT@.
+
+@end itemize
+
+@noindent
+Since the misconception that Bit_Order automatically deals with all
+endian-related incompatibilities is a common one, the specification of
+a component field that is an integral number of bytes will always
+generate a warning. This warning may be suppressed using @code{pragma
+Warnings (Off)} if desired. The following section contains additional
+details regarding the issue of byte ordering.
+
+@node Effect of Bit_Order on Byte Ordering
+@section Effect of Bit_Order on Byte Ordering
+@cindex byte ordering
+@cindex ordering, of bytes
+
+@noindent
+In this section we will review the effect of the @code{Bit_Order} attribute
+definition clause on byte ordering. Briefly, it has no effect at all, but
+a detailed example will be helpful. Before giving this
+example, let us review the precise
+definition of the effect of defining @code{Bit_Order}. The effect of a
+non-standard bit order is described in section 15.5.3 of the Ada
+Reference Manual:
+
+@quotation
+2 A bit ordering is a method of interpreting the meaning of
+the storage place attributes.
+@end quotation
+
+@noindent
+To understand the precise definition of storage place attributes in
+this context, we visit section 13.5.1 of the manual:
+
+@quotation
+13 A record_representation_clause (without the mod_clause)
+specifies the layout. The storage place attributes (see 13.5.2)
+are taken from the values of the position, first_bit, and last_bit
+expressions after normalizing those values so that first_bit is
+less than Storage_Unit.
+@end quotation
+
+@noindent
+The critical point here is that storage places are taken from
+the values after normalization, not before. So the @code{Bit_Order}
+interpretation applies to normalized values. The interpretation
+is described in the later part of the 15.5.3 paragraph:
+
+@quotation
+2 A bit ordering is a method of interpreting the meaning of
+the storage place attributes. High_Order_First (known in the
+vernacular as ``big endian'') means that the first bit of a
+storage element (bit 0) is the most significant bit (interpreting
+the sequence of bits that represent a component as an unsigned
+integer value). Low_Order_First (known in the vernacular as
+``little endian'') means the opposite: the first bit is the
+least significant.
+@end quotation
+
+@noindent
+Note that the numbering is with respect to the bits of a storage
+unit. In other words, the specification affects only the numbering
+of bits within a single storage unit.
+
+We can make the effect clearer by giving an example.
+
+Suppose that we have an external device which presents two bytes, the first
+byte presented, which is the first (low addressed byte) of the two byte
+record is called Master, and the second byte is called Slave.
+
+The left most (most significant bit is called Control for each byte, and
+the remaining 7 bits are called V1, V2, @dots{} V7, where V7 is the rightmost
+(least significant) bit.
+
+On a big-endian machine, we can write the following representation clause
+
+@smallexample @c ada
+ type Data is record
+ Master_Control : Bit;
+ Master_V1 : Bit;
+ Master_V2 : Bit;
+ Master_V3 : Bit;
+ Master_V4 : Bit;
+ Master_V5 : Bit;
+ Master_V6 : Bit;
+ Master_V7 : Bit;
+ Slave_Control : Bit;
+ Slave_V1 : Bit;
+ Slave_V2 : Bit;
+ Slave_V3 : Bit;
+ Slave_V4 : Bit;
+ Slave_V5 : Bit;
+ Slave_V6 : Bit;
+ Slave_V7 : Bit;
+ end record;
+
+ for Data use record
+ Master_Control at 0 range 0 .. 0;
+ Master_V1 at 0 range 1 .. 1;
+ Master_V2 at 0 range 2 .. 2;
+ Master_V3 at 0 range 3 .. 3;
+ Master_V4 at 0 range 4 .. 4;
+ Master_V5 at 0 range 5 .. 5;
+ Master_V6 at 0 range 6 .. 6;
+ Master_V7 at 0 range 7 .. 7;
+ Slave_Control at 1 range 0 .. 0;
+ Slave_V1 at 1 range 1 .. 1;
+ Slave_V2 at 1 range 2 .. 2;
+ Slave_V3 at 1 range 3 .. 3;
+ Slave_V4 at 1 range 4 .. 4;
+ Slave_V5 at 1 range 5 .. 5;
+ Slave_V6 at 1 range 6 .. 6;
+ Slave_V7 at 1 range 7 .. 7;
+ end record;
+@end smallexample
+
+@noindent
+Now if we move this to a little endian machine, then the bit ordering within
+the byte is backwards, so we have to rewrite the record rep clause as:
+
+@smallexample @c ada
+ for Data use record
+ Master_Control at 0 range 7 .. 7;
+ Master_V1 at 0 range 6 .. 6;
+ Master_V2 at 0 range 5 .. 5;
+ Master_V3 at 0 range 4 .. 4;
+ Master_V4 at 0 range 3 .. 3;
+ Master_V5 at 0 range 2 .. 2;
+ Master_V6 at 0 range 1 .. 1;
+ Master_V7 at 0 range 0 .. 0;
+ Slave_Control at 1 range 7 .. 7;
+ Slave_V1 at 1 range 6 .. 6;
+ Slave_V2 at 1 range 5 .. 5;
+ Slave_V3 at 1 range 4 .. 4;
+ Slave_V4 at 1 range 3 .. 3;
+ Slave_V5 at 1 range 2 .. 2;
+ Slave_V6 at 1 range 1 .. 1;
+ Slave_V7 at 1 range 0 .. 0;
+ end record;
+@end smallexample
+
+@noindent
+It is a nuisance to have to rewrite the clause, especially if
+the code has to be maintained on both machines. However,
+this is a case that we can handle with the
+@code{Bit_Order} attribute if it is implemented.
+Note that the implementation is not required on byte addressed
+machines, but it is indeed implemented in GNAT.
+This means that we can simply use the
+first record clause, together with the declaration
+
+@smallexample @c ada
+ for Data'Bit_Order use High_Order_First;
+@end smallexample
+
+@noindent
+and the effect is what is desired, namely the layout is exactly the same,
+independent of whether the code is compiled on a big-endian or little-endian
+machine.
+
+The important point to understand is that byte ordering is not affected.
+A @code{Bit_Order} attribute definition never affects which byte a field
+ends up in, only where it ends up in that byte.
+To make this clear, let us rewrite the record rep clause of the previous
+example as:
+
+@smallexample @c ada
+ for Data'Bit_Order use High_Order_First;
+ for Data use record
+ Master_Control at 0 range 0 .. 0;
+ Master_V1 at 0 range 1 .. 1;
+ Master_V2 at 0 range 2 .. 2;
+ Master_V3 at 0 range 3 .. 3;
+ Master_V4 at 0 range 4 .. 4;
+ Master_V5 at 0 range 5 .. 5;
+ Master_V6 at 0 range 6 .. 6;
+ Master_V7 at 0 range 7 .. 7;
+ Slave_Control at 0 range 8 .. 8;
+ Slave_V1 at 0 range 9 .. 9;
+ Slave_V2 at 0 range 10 .. 10;
+ Slave_V3 at 0 range 11 .. 11;
+ Slave_V4 at 0 range 12 .. 12;
+ Slave_V5 at 0 range 13 .. 13;
+ Slave_V6 at 0 range 14 .. 14;
+ Slave_V7 at 0 range 15 .. 15;
+ end record;
+@end smallexample
+
+@noindent
+This is exactly equivalent to saying (a repeat of the first example):
+
+@smallexample @c ada
+ for Data'Bit_Order use High_Order_First;
+ for Data use record
+ Master_Control at 0 range 0 .. 0;
+ Master_V1 at 0 range 1 .. 1;
+ Master_V2 at 0 range 2 .. 2;
+ Master_V3 at 0 range 3 .. 3;
+ Master_V4 at 0 range 4 .. 4;
+ Master_V5 at 0 range 5 .. 5;
+ Master_V6 at 0 range 6 .. 6;
+ Master_V7 at 0 range 7 .. 7;
+ Slave_Control at 1 range 0 .. 0;
+ Slave_V1 at 1 range 1 .. 1;
+ Slave_V2 at 1 range 2 .. 2;
+ Slave_V3 at 1 range 3 .. 3;
+ Slave_V4 at 1 range 4 .. 4;
+ Slave_V5 at 1 range 5 .. 5;
+ Slave_V6 at 1 range 6 .. 6;
+ Slave_V7 at 1 range 7 .. 7;
+ end record;
+@end smallexample
+
+@noindent
+Why are they equivalent? Well take a specific field, the @code{Slave_V2}
+field. The storage place attributes are obtained by normalizing the
+values given so that the @code{First_Bit} value is less than 8. After
+normalizing the values (0,10,10) we get (1,2,2) which is exactly what
+we specified in the other case.
+
+Now one might expect that the @code{Bit_Order} attribute might affect
+bit numbering within the entire record component (two bytes in this
+case, thus affecting which byte fields end up in), but that is not
+the way this feature is defined, it only affects numbering of bits,
+not which byte they end up in.
+
+Consequently it never makes sense to specify a starting bit number
+greater than 7 (for a byte addressable field) if an attribute
+definition for @code{Bit_Order} has been given, and indeed it
+may be actively confusing to specify such a value, so the compiler
+generates a warning for such usage.
+
+If you do need to control byte ordering then appropriate conditional
+values must be used. If in our example, the slave byte came first on
+some machines we might write:
+
+@smallexample @c ada
+ Master_Byte_First constant Boolean := @dots{};
+
+ Master_Byte : constant Natural :=
+ 1 - Boolean'Pos (Master_Byte_First);
+ Slave_Byte : constant Natural :=
+ Boolean'Pos (Master_Byte_First);
+
+ for Data'Bit_Order use High_Order_First;
+ for Data use record
+ Master_Control at Master_Byte range 0 .. 0;
+ Master_V1 at Master_Byte range 1 .. 1;
+ Master_V2 at Master_Byte range 2 .. 2;
+ Master_V3 at Master_Byte range 3 .. 3;
+ Master_V4 at Master_Byte range 4 .. 4;
+ Master_V5 at Master_Byte range 5 .. 5;
+ Master_V6 at Master_Byte range 6 .. 6;
+ Master_V7 at Master_Byte range 7 .. 7;
+ Slave_Control at Slave_Byte range 0 .. 0;
+ Slave_V1 at Slave_Byte range 1 .. 1;
+ Slave_V2 at Slave_Byte range 2 .. 2;
+ Slave_V3 at Slave_Byte range 3 .. 3;
+ Slave_V4 at Slave_Byte range 4 .. 4;
+ Slave_V5 at Slave_Byte range 5 .. 5;
+ Slave_V6 at Slave_Byte range 6 .. 6;
+ Slave_V7 at Slave_Byte range 7 .. 7;
+ end record;
+@end smallexample
+
+@noindent
+Now to switch between machines, all that is necessary is
+to set the boolean constant @code{Master_Byte_First} in
+an appropriate manner.
+
+@node Pragma Pack for Arrays
+@section Pragma Pack for Arrays
+@cindex Pragma Pack (for arrays)
+
+@noindent
+Pragma @code{Pack} applied to an array has no effect unless the component type
+is packable. For a component type to be packable, it must be one of the
+following cases:
+
+@itemize @bullet
+@item
+Any scalar type
+@item
+Any type whose size is specified with a size clause
+@item
+Any packed array type with a static size
+@item
+Any record type padded because of its default alignment
+@end itemize
+
+@noindent
+For all these cases, if the component subtype size is in the range
+1 through 63, then the effect of the pragma @code{Pack} is exactly as though a
+component size were specified giving the component subtype size.
+For example if we have:
+
+@smallexample @c ada
+ type r is range 0 .. 17;
+
+ type ar is array (1 .. 8) of r;
+ pragma Pack (ar);
+@end smallexample
+
+@noindent
+Then the component size of @code{ar} will be set to 5 (i.e.@: to @code{r'size},
+and the size of the array @code{ar} will be exactly 40 bits.
+
+Note that in some cases this rather fierce approach to packing can produce
+unexpected effects. For example, in Ada 95 and Ada 2005,
+subtype @code{Natural} typically has a size of 31, meaning that if you
+pack an array of @code{Natural}, you get 31-bit
+close packing, which saves a few bits, but results in far less efficient
+access. Since many other Ada compilers will ignore such a packing request,
+GNAT will generate a warning on some uses of pragma @code{Pack} that it guesses
+might not be what is intended. You can easily remove this warning by
+using an explicit @code{Component_Size} setting instead, which never generates
+a warning, since the intention of the programmer is clear in this case.
+
+GNAT treats packed arrays in one of two ways. If the size of the array is
+known at compile time and is less than 64 bits, then internally the array
+is represented as a single modular type, of exactly the appropriate number
+of bits. If the length is greater than 63 bits, or is not known at compile
+time, then the packed array is represented as an array of bytes, and the
+length is always a multiple of 8 bits.
+
+Note that to represent a packed array as a modular type, the alignment must
+be suitable for the modular type involved. For example, on typical machines
+a 32-bit packed array will be represented by a 32-bit modular integer with
+an alignment of four bytes. If you explicitly override the default alignment
+with an alignment clause that is too small, the modular representation
+cannot be used. For example, consider the following set of declarations:
+
+@smallexample @c ada
+ type R is range 1 .. 3;
+ type S is array (1 .. 31) of R;
+ for S'Component_Size use 2;
+ for S'Size use 62;
+ for S'Alignment use 1;
+@end smallexample
+
+@noindent
+If the alignment clause were not present, then a 62-bit modular
+representation would be chosen (typically with an alignment of 4 or 8
+bytes depending on the target). But the default alignment is overridden
+with the explicit alignment clause. This means that the modular
+representation cannot be used, and instead the array of bytes
+representation must be used, meaning that the length must be a multiple
+of 8. Thus the above set of declarations will result in a diagnostic
+rejecting the size clause and noting that the minimum size allowed is 64.
+
+@cindex Pragma Pack (for type Natural)
+@cindex Pragma Pack warning
+
+One special case that is worth noting occurs when the base type of the
+component size is 8/16/32 and the subtype is one bit less. Notably this
+occurs with subtype @code{Natural}. Consider:
+
+@smallexample @c ada
+ type Arr is array (1 .. 32) of Natural;
+ pragma Pack (Arr);
+@end smallexample
+
+@noindent
+In all commonly used Ada 83 compilers, this pragma Pack would be ignored,
+since typically @code{Natural'Size} is 32 in Ada 83, and in any case most
+Ada 83 compilers did not attempt 31 bit packing.
+
+In Ada 95 and Ada 2005, @code{Natural'Size} is required to be 31. Furthermore,
+GNAT really does pack 31-bit subtype to 31 bits. This may result in a
+substantial unintended performance penalty when porting legacy Ada 83 code.
+To help prevent this, GNAT generates a warning in such cases. If you really
+want 31 bit packing in a case like this, you can set the component size
+explicitly:
+
+@smallexample @c ada
+ type Arr is array (1 .. 32) of Natural;
+ for Arr'Component_Size use 31;
+@end smallexample
+
+@noindent
+Here 31-bit packing is achieved as required, and no warning is generated,
+since in this case the programmer intention is clear.
+
+@node Pragma Pack for Records
+@section Pragma Pack for Records
+@cindex Pragma Pack (for records)
+
+@noindent
+Pragma @code{Pack} applied to a record will pack the components to reduce
+wasted space from alignment gaps and by reducing the amount of space
+taken by components. We distinguish between @emph{packable} components and
+@emph{non-packable} components.
+Components of the following types are considered packable:
+@itemize @bullet
+@item
+All primitive types are packable.
+
+@item
+Small packed arrays, whose size does not exceed 64 bits, and where the
+size is statically known at compile time, are represented internally
+as modular integers, and so they are also packable.
+
+@end itemize
+
+@noindent
+All packable components occupy the exact number of bits corresponding to
+their @code{Size} value, and are packed with no padding bits, i.e.@: they
+can start on an arbitrary bit boundary.
+
+All other types are non-packable, they occupy an integral number of
+storage units, and
+are placed at a boundary corresponding to their alignment requirements.
+
+For example, consider the record
+
+@smallexample @c ada
+ type Rb1 is array (1 .. 13) of Boolean;
+ pragma Pack (rb1);
+
+ type Rb2 is array (1 .. 65) of Boolean;
+ pragma Pack (rb2);
+
+ type x2 is record
+ l1 : Boolean;
+ l2 : Duration;
+ l3 : Float;
+ l4 : Boolean;
+ l5 : Rb1;
+ l6 : Rb2;
+ end record;
+ pragma Pack (x2);
+@end smallexample
+
+@noindent
+The representation for the record x2 is as follows:
+
+@smallexample @c ada
+for x2'Size use 224;
+for x2 use record
+ l1 at 0 range 0 .. 0;
+ l2 at 0 range 1 .. 64;
+ l3 at 12 range 0 .. 31;
+ l4 at 16 range 0 .. 0;
+ l5 at 16 range 1 .. 13;
+ l6 at 18 range 0 .. 71;
+end record;
+@end smallexample
+
+@noindent
+Studying this example, we see that the packable fields @code{l1}
+and @code{l2} are
+of length equal to their sizes, and placed at specific bit boundaries (and
+not byte boundaries) to
+eliminate padding. But @code{l3} is of a non-packable float type, so
+it is on the next appropriate alignment boundary.
+
+The next two fields are fully packable, so @code{l4} and @code{l5} are
+minimally packed with no gaps. However, type @code{Rb2} is a packed
+array that is longer than 64 bits, so it is itself non-packable. Thus
+the @code{l6} field is aligned to the next byte boundary, and takes an
+integral number of bytes, i.e.@: 72 bits.
+
+@node Record Representation Clauses
+@section Record Representation Clauses
+@cindex Record Representation Clause
+
+@noindent
+Record representation clauses may be given for all record types, including
+types obtained by record extension. Component clauses are allowed for any
+static component. The restrictions on component clauses depend on the type
+of the component.
+
+@cindex Component Clause
+For all components of an elementary type, the only restriction on component
+clauses is that the size must be at least the 'Size value of the type
+(actually the Value_Size). There are no restrictions due to alignment,
+and such components may freely cross storage boundaries.
+
+Packed arrays with a size up to and including 64 bits are represented
+internally using a modular type with the appropriate number of bits, and
+thus the same lack of restriction applies. For example, if you declare:
+
+@smallexample @c ada
+ type R is array (1 .. 49) of Boolean;
+ pragma Pack (R);
+ for R'Size use 49;
+@end smallexample
+
+@noindent
+then a component clause for a component of type R may start on any
+specified bit boundary, and may specify a value of 49 bits or greater.
+
+For packed bit arrays that are longer than 64 bits, there are two
+cases. If the component size is a power of 2 (1,2,4,8,16,32 bits),
+including the important case of single bits or boolean values, then
+there are no limitations on placement of such components, and they
+may start and end at arbitrary bit boundaries.
+
+If the component size is not a power of 2 (e.g.@: 3 or 5), then
+an array of this type longer than 64 bits must always be placed on
+on a storage unit (byte) boundary and occupy an integral number
+of storage units (bytes). Any component clause that does not
+meet this requirement will be rejected.
+
+Any aliased component, or component of an aliased type, must
+have its normal alignment and size. A component clause that
+does not meet this requirement will be rejected.
+
+The tag field of a tagged type always occupies an address sized field at
+the start of the record. No component clause may attempt to overlay this
+tag. When a tagged type appears as a component, the tag field must have
+proper alignment
+
+In the case of a record extension T1, of a type T, no component clause applied
+to the type T1 can specify a storage location that would overlap the first
+T'Size bytes of the record.
+
+For all other component types, including non-bit-packed arrays,
+the component can be placed at an arbitrary bit boundary,
+so for example, the following is permitted:
+
+@smallexample @c ada
+ type R is array (1 .. 10) of Boolean;
+ for R'Size use 80;
+
+ type Q is record
+ G, H : Boolean;
+ L, M : R;
+ end record;
+
+ for Q use record
+ G at 0 range 0 .. 0;
+ H at 0 range 1 .. 1;
+ L at 0 range 2 .. 81;
+ R at 0 range 82 .. 161;
+ end record;
+@end smallexample
+
+@noindent
+Note: the above rules apply to recent releases of GNAT 5.
+In GNAT 3, there are more severe restrictions on larger components.
+For non-primitive types, including packed arrays with a size greater than
+64 bits, component clauses must respect the alignment requirement of the
+type, in particular, always starting on a byte boundary, and the length
+must be a multiple of the storage unit.
+
+@node Handling of Records with Holes
+@section Handling of Records with Holes
+@cindex Handling of Records with Holes
+
+As a result of alignment considerations, records may contain "holes"
+or gaps
+which do not correspond to the data bits of any of the components.
+Record representation clauses can also result in holes in records.
+
+GNAT does not attempt to clear these holes, so in record objects,
+they should be considered to hold undefined rubbish. The generated
+equality routine just tests components so does not access these
+undefined bits, and assignment and copy operations may or may not
+preserve the contents of these holes (for assignments, the holes
+in the target will in practice contain either the bits that are
+present in the holes in the source, or the bits that were present
+in the target before the assignment).
+
+If it is necessary to ensure that holes in records have all zero
+bits, then record objects for which this initialization is desired
+should be explicitly set to all zero values using Unchecked_Conversion
+or address overlays. For example
+
+@smallexample @c ada
+type HRec is record
+ C : Character;
+ I : Integer;
+end record;
+@end smallexample
+
+@noindent
+On typical machines, integers need to be aligned on a four-byte
+boundary, resulting in three bytes of undefined rubbish following
+the 8-bit field for C. To ensure that the hole in a variable of
+type HRec is set to all zero bits,
+you could for example do:
+
+@smallexample @c ada
+type Base is record
+ Dummy1, Dummy2 : Integer := 0;
+end record;
+
+BaseVar : Base;
+RealVar : Hrec;
+for RealVar'Address use BaseVar'Address;
+@end smallexample
+
+@noindent
+Now the 8-bytes of the value of RealVar start out containing all zero
+bits. A safer approach is to just define dummy fields, avoiding the
+holes, as in:
+
+@smallexample @c ada
+type HRec is record
+ C : Character;
+ Dummy1 : Short_Short_Integer := 0;
+ Dummy2 : Short_Short_Integer := 0;
+ Dummy3 : Short_Short_Integer := 0;
+ I : Integer;
+end record;
+@end smallexample
+
+@noindent
+And to make absolutely sure that the intent of this is followed, you
+can use representation clauses:
+
+@smallexample @c ada
+for Hrec use record
+ C at 0 range 0 .. 7;
+ Dummy1 at 1 range 0 .. 7;
+ Dummy2 at 2 range 0 .. 7;
+ Dummy3 at 3 range 0 .. 7;
+ I at 4 range 0 .. 31;
+end record;
+for Hrec'Size use 64;
+@end smallexample
+
+@node Enumeration Clauses
+@section Enumeration Clauses
+
+The only restriction on enumeration clauses is that the range of values
+must be representable. For the signed case, if one or more of the
+representation values are negative, all values must be in the range:
+
+@smallexample @c ada
+ System.Min_Int .. System.Max_Int
+@end smallexample
+
+@noindent
+For the unsigned case, where all values are nonnegative, the values must
+be in the range:
+
+@smallexample @c ada
+ 0 .. System.Max_Binary_Modulus;
+@end smallexample
+
+@noindent
+A @emph{confirming} representation clause is one in which the values range
+from 0 in sequence, i.e.@: a clause that confirms the default representation
+for an enumeration type.
+Such a confirming representation
+is permitted by these rules, and is specially recognized by the compiler so
+that no extra overhead results from the use of such a clause.
+
+If an array has an index type which is an enumeration type to which an
+enumeration clause has been applied, then the array is stored in a compact
+manner. Consider the declarations:
+
+@smallexample @c ada
+ type r is (A, B, C);
+ for r use (A => 1, B => 5, C => 10);
+ type t is array (r) of Character;
+@end smallexample
+
+@noindent
+The array type t corresponds to a vector with exactly three elements and
+has a default size equal to @code{3*Character'Size}. This ensures efficient
+use of space, but means that accesses to elements of the array will incur
+the overhead of converting representation values to the corresponding
+positional values, (i.e.@: the value delivered by the @code{Pos} attribute).
+
+@node Address Clauses
+@section Address Clauses
+@cindex Address Clause
+
+The reference manual allows a general restriction on representation clauses,
+as found in RM 13.1(22):
+
+@quotation
+An implementation need not support representation
+items containing nonstatic expressions, except that
+an implementation should support a representation item
+for a given entity if each nonstatic expression in the
+representation item is a name that statically denotes
+a constant declared before the entity.
+@end quotation
+
+@noindent
+In practice this is applicable only to address clauses, since this is the
+only case in which a non-static expression is permitted by the syntax. As
+the AARM notes in sections 13.1 (22.a-22.h):
+
+@display
+ 22.a Reason: This is to avoid the following sort of thing:
+
+ 22.b X : Integer := F(@dots{});
+ Y : Address := G(@dots{});
+ for X'Address use Y;
+
+ 22.c In the above, we have to evaluate the
+ initialization expression for X before we
+ know where to put the result. This seems
+ like an unreasonable implementation burden.
+
+ 22.d The above code should instead be written
+ like this:
+
+ 22.e Y : constant Address := G(@dots{});
+ X : Integer := F(@dots{});
+ for X'Address use Y;
+
+ 22.f This allows the expression ``Y'' to be safely
+ evaluated before X is created.
+
+ 22.g The constant could be a formal parameter of mode in.
+
+ 22.h An implementation can support other nonstatic
+ expressions if it wants to. Expressions of type
+ Address are hardly ever static, but their value
+ might be known at compile time anyway in many
+ cases.
+@end display
+
+@noindent
+GNAT does indeed permit many additional cases of non-static expressions. In
+particular, if the type involved is elementary there are no restrictions
+(since in this case, holding a temporary copy of the initialization value,
+if one is present, is inexpensive). In addition, if there is no implicit or
+explicit initialization, then there are no restrictions. GNAT will reject
+only the case where all three of these conditions hold:
+
+@itemize @bullet
+
+@item
+The type of the item is non-elementary (e.g.@: a record or array).
+
+@item
+There is explicit or implicit initialization required for the object.
+Note that access values are always implicitly initialized.
+
+@item
+The address value is non-static. Here GNAT is more permissive than the
+RM, and allows the address value to be the address of a previously declared
+stand-alone variable, as long as it does not itself have an address clause.
+
+@smallexample @c ada
+ Anchor : Some_Initialized_Type;
+ Overlay : Some_Initialized_Type;
+ for Overlay'Address use Anchor'Address;
+@end smallexample
+
+@noindent
+However, the prefix of the address clause cannot be an array component, or
+a component of a discriminated record.
+
+@end itemize
+
+@noindent
+As noted above in section 22.h, address values are typically non-static. In
+particular the To_Address function, even if applied to a literal value, is
+a non-static function call. To avoid this minor annoyance, GNAT provides
+the implementation defined attribute 'To_Address. The following two
+expressions have identical values:
+
+@findex Attribute
+@findex To_Address
+@smallexample @c ada
+ To_Address (16#1234_0000#)
+ System'To_Address (16#1234_0000#);
+@end smallexample
+
+@noindent
+except that the second form is considered to be a static expression, and
+thus when used as an address clause value is always permitted.
+
+@noindent
+Additionally, GNAT treats as static an address clause that is an
+unchecked_conversion of a static integer value. This simplifies the porting
+of legacy code, and provides a portable equivalent to the GNAT attribute
+@code{To_Address}.
+
+Another issue with address clauses is the interaction with alignment
+requirements. When an address clause is given for an object, the address
+value must be consistent with the alignment of the object (which is usually
+the same as the alignment of the type of the object). If an address clause
+is given that specifies an inappropriately aligned address value, then the
+program execution is erroneous.
+
+Since this source of erroneous behavior can have unfortunate effects, GNAT
+checks (at compile time if possible, generating a warning, or at execution
+time with a run-time check) that the alignment is appropriate. If the
+run-time check fails, then @code{Program_Error} is raised. This run-time
+check is suppressed if range checks are suppressed, or if the special GNAT
+check Alignment_Check is suppressed, or if
+@code{pragma Restrictions (No_Elaboration_Code)} is in effect.
+
+Finally, GNAT does not permit overlaying of objects of controlled types or
+composite types containing a controlled component. In most cases, the compiler
+can detect an attempt at such overlays and will generate a warning at compile
+time and a Program_Error exception at run time.
+
+@findex Export
+An address clause cannot be given for an exported object. More
+understandably the real restriction is that objects with an address
+clause cannot be exported. This is because such variables are not
+defined by the Ada program, so there is no external object to export.
+
+@findex Import
+It is permissible to give an address clause and a pragma Import for the
+same object. In this case, the variable is not really defined by the
+Ada program, so there is no external symbol to be linked. The link name
+and the external name are ignored in this case. The reason that we allow this
+combination is that it provides a useful idiom to avoid unwanted
+initializations on objects with address clauses.
+
+When an address clause is given for an object that has implicit or
+explicit initialization, then by default initialization takes place. This
+means that the effect of the object declaration is to overwrite the
+memory at the specified address. This is almost always not what the
+programmer wants, so GNAT will output a warning:
+
+@smallexample
+ with System;
+ package G is
+ type R is record
+ M : Integer := 0;
+ end record;
+
+ Ext : R;
+ for Ext'Address use System'To_Address (16#1234_1234#);
+ |
+ >>> warning: implicit initialization of "Ext" may
+ modify overlaid storage
+ >>> warning: use pragma Import for "Ext" to suppress
+ initialization (RM B(24))
+
+ end G;
+@end smallexample
+
+@noindent
+As indicated by the warning message, the solution is to use a (dummy) pragma
+Import to suppress this initialization. The pragma tell the compiler that the
+object is declared and initialized elsewhere. The following package compiles
+without warnings (and the initialization is suppressed):
+
+@smallexample @c ada
+ with System;
+ package G is
+ type R is record
+ M : Integer := 0;
+ end record;
+
+ Ext : R;
+ for Ext'Address use System'To_Address (16#1234_1234#);
+ pragma Import (Ada, Ext);
+ end G;
+@end smallexample
+
+@noindent
+A final issue with address clauses involves their use for overlaying
+variables, as in the following example:
+@cindex Overlaying of objects
+
+@smallexample @c ada
+ A : Integer;
+ B : Integer;
+ for B'Address use A'Address;
+@end smallexample
+
+@noindent
+or alternatively, using the form recommended by the RM:
+
+@smallexample @c ada
+ A : Integer;
+ Addr : constant Address := A'Address;
+ B : Integer;
+ for B'Address use Addr;
+@end smallexample
+
+@noindent
+In both of these cases, @code{A}
+and @code{B} become aliased to one another via the
+address clause. This use of address clauses to overlay
+variables, achieving an effect similar to unchecked
+conversion was erroneous in Ada 83, but in Ada 95 and Ada 2005
+the effect is implementation defined. Furthermore, the
+Ada RM specifically recommends that in a situation
+like this, @code{B} should be subject to the following
+implementation advice (RM 13.3(19)):
+
+@quotation
+19 If the Address of an object is specified, or it is imported
+ or exported, then the implementation should not perform
+ optimizations based on assumptions of no aliases.
+@end quotation
+
+@noindent
+GNAT follows this recommendation, and goes further by also applying
+this recommendation to the overlaid variable (@code{A}
+in the above example) in this case. This means that the overlay
+works "as expected", in that a modification to one of the variables
+will affect the value of the other.
+
+Note that when address clause overlays are used in this way, there is an
+issue of unintentional initialization, as shown by this example:
+
+@smallexample @c ada
+package Overwrite_Record is
+ type R is record
+ A : Character := 'C';
+ B : Character := 'A';
+ end record;
+ X : Short_Integer := 3;
+ Y : R;
+ for Y'Address use X'Address;
+ |
+>>> warning: default initialization of "Y" may
+ modify "X", use pragma Import for "Y" to
+ suppress initialization (RM B.1(24))
+
+end Overwrite_Record;
+@end smallexample
+
+@noindent
+Here the default initialization of @code{Y} will clobber the value
+of @code{X}, which justifies the warning. The warning notes that
+this effect can be eliminated by adding a @code{pragma Import}
+which suppresses the initialization:
+
+@smallexample @c ada
+package Overwrite_Record is
+ type R is record
+ A : Character := 'C';
+ B : Character := 'A';
+ end record;
+ X : Short_Integer := 3;
+ Y : R;
+ for Y'Address use X'Address;
+ pragma Import (Ada, Y);
+end Overwrite_Record;
+@end smallexample
+
+@noindent
+Note that the use of @code{pragma Initialize_Scalars} may cause variables to
+be initialized when they would not otherwise have been in the absence
+of the use of this pragma. This may cause an overlay to have this
+unintended clobbering effect. The compiler avoids this for scalar
+types, but not for composite objects (where in general the effect
+of @code{Initialize_Scalars} is part of the initialization routine
+for the composite object:
+
+@smallexample @c ada
+pragma Initialize_Scalars;
+with Ada.Text_IO; use Ada.Text_IO;
+procedure Overwrite_Array is
+ type Arr is array (1 .. 5) of Integer;
+ X : Arr := (others => 1);
+ A : Arr;
+ for A'Address use X'Address;
+ |
+>>> warning: default initialization of "A" may
+ modify "X", use pragma Import for "A" to
+ suppress initialization (RM B.1(24))
+
+begin
+ if X /= Arr'(others => 1) then
+ Put_Line ("X was clobbered");
+ else
+ Put_Line ("X was not clobbered");
+ end if;
+end Overwrite_Array;
+@end smallexample
+
+@noindent
+The above program generates the warning as shown, and at execution
+time, prints @code{X was clobbered}. If the @code{pragma Import} is
+added as suggested:
+
+@smallexample @c ada
+pragma Initialize_Scalars;
+with Ada.Text_IO; use Ada.Text_IO;
+procedure Overwrite_Array is
+ type Arr is array (1 .. 5) of Integer;
+ X : Arr := (others => 1);
+ A : Arr;
+ for A'Address use X'Address;
+ pragma Import (Ada, A);
+begin
+ if X /= Arr'(others => 1) then
+ Put_Line ("X was clobbered");
+ else
+ Put_Line ("X was not clobbered");
+ end if;
+end Overwrite_Array;
+@end smallexample
+
+@noindent
+then the program compiles without the waraning and when run will generate
+the output @code{X was not clobbered}.
+
+@node Effect of Convention on Representation
+@section Effect of Convention on Representation
+@cindex Convention, effect on representation
+
+@noindent
+Normally the specification of a foreign language convention for a type or
+an object has no effect on the chosen representation. In particular, the
+representation chosen for data in GNAT generally meets the standard system
+conventions, and for example records are laid out in a manner that is
+consistent with C@. This means that specifying convention C (for example)
+has no effect.
+
+There are four exceptions to this general rule:
+
+@itemize @bullet
+
+@item Convention Fortran and array subtypes
+If pragma Convention Fortran is specified for an array subtype, then in
+accordance with the implementation advice in section 3.6.2(11) of the
+Ada Reference Manual, the array will be stored in a Fortran-compatible
+column-major manner, instead of the normal default row-major order.
+
+@item Convention C and enumeration types
+GNAT normally stores enumeration types in 8, 16, or 32 bits as required
+to accommodate all values of the type. For example, for the enumeration
+type declared by:
+
+@smallexample @c ada
+ type Color is (Red, Green, Blue);
+@end smallexample
+
+@noindent
+8 bits is sufficient to store all values of the type, so by default, objects
+of type @code{Color} will be represented using 8 bits. However, normal C
+convention is to use 32 bits for all enum values in C, since enum values
+are essentially of type int. If pragma @code{Convention C} is specified for an
+Ada enumeration type, then the size is modified as necessary (usually to
+32 bits) to be consistent with the C convention for enum values.
+
+Note that this treatment applies only to types. If Convention C is given for
+an enumeration object, where the enumeration type is not Convention C, then
+Object_Size bits are allocated. For example, for a normal enumeration type,
+with less than 256 elements, only 8 bits will be allocated for the object.
+Since this may be a surprise in terms of what C expects, GNAT will issue a
+warning in this situation. The warning can be suppressed by giving an explicit
+size clause specifying the desired size.
+
+@item Convention C/Fortran and Boolean types
+In C, the usual convention for boolean values, that is values used for
+conditions, is that zero represents false, and nonzero values represent
+true. In Ada, the normal convention is that two specific values, typically
+0/1, are used to represent false/true respectively.
+
+Fortran has a similar convention for @code{LOGICAL} values (any nonzero
+value represents true).
+
+To accommodate the Fortran and C conventions, if a pragma Convention specifies
+C or Fortran convention for a derived Boolean, as in the following example:
+
+@smallexample @c ada
+ type C_Switch is new Boolean;
+ pragma Convention (C, C_Switch);
+@end smallexample
+
+@noindent
+then the GNAT generated code will treat any nonzero value as true. For truth
+values generated by GNAT, the conventional value 1 will be used for True, but
+when one of these values is read, any nonzero value is treated as True.
+
+@item Access types on OpenVMS
+For 64-bit OpenVMS systems, access types (other than those for unconstrained
+arrays) are 64-bits long. An exception to this rule is for the case of
+C-convention access types where there is no explicit size clause present (or
+inherited for derived types). In this case, GNAT chooses to make these
+pointers 32-bits, which provides an easier path for migration of 32-bit legacy
+code. size clause specifying 64-bits must be used to obtain a 64-bit pointer.
+
+@end itemize
+
+@node Conventions and Anonymous Access Types
+@section Conventions and Anonymous Access Types
+@cindex Anonymous access types
+@cindex Convention for anonymous access types
+
+The RM is not entirely clear on convention handling in a number of cases,
+and in particular, it is not clear on the convention to be given to
+anonymous access types in general, and in particular what is to be
+done for the case of anonymous access-to-subprogram.
+
+In GNAT, we decide that if an explicit Convention is applied
+to an object or component, and its type is such an anonymous type,
+then the convention will apply to this anonymous type as well. This
+seems to make sense since it is anomolous in any case to have a
+different convention for an object and its type, and there is clearly
+no way to explicitly specify a convention for an anonymous type, since
+it doesn't have a name to specify!
+
+Furthermore, we decide that if a convention is applied to a record type,
+then this convention is inherited by any of its components that are of an
+anonymous access type which do not have an explicitly specified convention.
+
+The following program shows these conventions in action:
+
+@smallexample @c ada
+package ConvComp is
+ type Foo is range 1 .. 10;
+ type T1 is record
+ A : access function (X : Foo) return Integer;
+ B : Integer;
+ end record;
+ pragma Convention (C, T1);
+
+ type T2 is record
+ A : access function (X : Foo) return Integer;
+ pragma Convention (C, A);
+ B : Integer;
+ end record;
+ pragma Convention (COBOL, T2);
+
+ type T3 is record
+ A : access function (X : Foo) return Integer;
+ pragma Convention (COBOL, A);
+ B : Integer;
+ end record;
+ pragma Convention (C, T3);
+
+ type T4 is record
+ A : access function (X : Foo) return Integer;
+ B : Integer;
+ end record;
+ pragma Convention (COBOL, T4);
+
+ function F (X : Foo) return Integer;
+ pragma Convention (C, F);
+
+ function F (X : Foo) return Integer is (13);
+
+ TV1 : T1 := (F'Access, 12); -- OK
+ TV2 : T2 := (F'Access, 13); -- OK
+
+ TV3 : T3 := (F'Access, 13); -- ERROR
+ |
+>>> subprogram "F" has wrong convention
+>>> does not match access to subprogram declared at line 17
+ 38. TV4 : T4 := (F'Access, 13); -- ERROR
+ |
+>>> subprogram "F" has wrong convention
+>>> does not match access to subprogram declared at line 24
+ 39. end ConvComp;
+@end smallexample
+
+@node Determining the Representations chosen by GNAT
+@section Determining the Representations chosen by GNAT
+@cindex Representation, determination of
+@cindex @option{-gnatR} switch
+
+@noindent
+Although the descriptions in this section are intended to be complete, it is
+often easier to simply experiment to see what GNAT accepts and what the
+effect is on the layout of types and objects.
+
+As required by the Ada RM, if a representation clause is not accepted, then
+it must be rejected as illegal by the compiler. However, when a
+representation clause or pragma is accepted, there can still be questions
+of what the compiler actually does. For example, if a partial record
+representation clause specifies the location of some components and not
+others, then where are the non-specified components placed? Or if pragma
+@code{Pack} is used on a record, then exactly where are the resulting
+fields placed? The section on pragma @code{Pack} in this chapter can be
+used to answer the second question, but it is often easier to just see
+what the compiler does.
+
+For this purpose, GNAT provides the option @option{-gnatR}. If you compile
+with this option, then the compiler will output information on the actual
+representations chosen, in a format similar to source representation
+clauses. For example, if we compile the package:
+
+@smallexample @c ada
+package q is
+ type r (x : boolean) is tagged record
+ case x is
+ when True => S : String (1 .. 100);
+ when False => null;
+ end case;
+ end record;
+
+ type r2 is new r (false) with record
+ y2 : integer;
+ end record;
+
+ for r2 use record
+ y2 at 16 range 0 .. 31;
+ end record;
+
+ type x is record
+ y : character;
+ end record;
+
+ type x1 is array (1 .. 10) of x;
+ for x1'component_size use 11;
+
+ type ia is access integer;
+
+ type Rb1 is array (1 .. 13) of Boolean;
+ pragma Pack (rb1);
+
+ type Rb2 is array (1 .. 65) of Boolean;
+ pragma Pack (rb2);
+
+ type x2 is record
+ l1 : Boolean;
+ l2 : Duration;
+ l3 : Float;
+ l4 : Boolean;
+ l5 : Rb1;
+ l6 : Rb2;
+ end record;
+ pragma Pack (x2);
+end q;
+@end smallexample
+
+@noindent
+using the switch @option{-gnatR} we obtain the following output:
+
+@smallexample
+Representation information for unit q
+-------------------------------------
+
+for r'Size use ??;
+for r'Alignment use 4;
+for r use record
+ x at 4 range 0 .. 7;
+ _tag at 0 range 0 .. 31;
+ s at 5 range 0 .. 799;
+end record;
+
+for r2'Size use 160;
+for r2'Alignment use 4;
+for r2 use record
+ x at 4 range 0 .. 7;
+ _tag at 0 range 0 .. 31;
+ _parent at 0 range 0 .. 63;
+ y2 at 16 range 0 .. 31;
+end record;
+
+for x'Size use 8;
+for x'Alignment use 1;
+for x use record
+ y at 0 range 0 .. 7;
+end record;
+
+for x1'Size use 112;
+for x1'Alignment use 1;
+for x1'Component_Size use 11;
+
+for rb1'Size use 13;
+for rb1'Alignment use 2;
+for rb1'Component_Size use 1;
+
+for rb2'Size use 72;
+for rb2'Alignment use 1;
+for rb2'Component_Size use 1;
+
+for x2'Size use 224;
+for x2'Alignment use 4;
+for x2 use record
+ l1 at 0 range 0 .. 0;
+ l2 at 0 range 1 .. 64;
+ l3 at 12 range 0 .. 31;
+ l4 at 16 range 0 .. 0;
+ l5 at 16 range 1 .. 13;
+ l6 at 18 range 0 .. 71;
+end record;
+@end smallexample
+
+@noindent
+The Size values are actually the Object_Size, i.e.@: the default size that
+will be allocated for objects of the type.
+The ?? size for type r indicates that we have a variant record, and the
+actual size of objects will depend on the discriminant value.
+
+The Alignment values show the actual alignment chosen by the compiler
+for each record or array type.
+
+The record representation clause for type r shows where all fields
+are placed, including the compiler generated tag field (whose location
+cannot be controlled by the programmer).
+
+The record representation clause for the type extension r2 shows all the
+fields present, including the parent field, which is a copy of the fields
+of the parent type of r2, i.e.@: r1.
+
+The component size and size clauses for types rb1 and rb2 show
+the exact effect of pragma @code{Pack} on these arrays, and the record
+representation clause for type x2 shows how pragma @code{Pack} affects
+this record type.
+
+In some cases, it may be useful to cut and paste the representation clauses
+generated by the compiler into the original source to fix and guarantee
+the actual representation to be used.
+
+@node Standard Library Routines
+@chapter Standard Library Routines
+
+@noindent
+The Ada Reference Manual contains in Annex A a full description of an
+extensive set of standard library routines that can be used in any Ada
+program, and which must be provided by all Ada compilers. They are
+analogous to the standard C library used by C programs.
+
+GNAT implements all of the facilities described in annex A, and for most
+purposes the description in the Ada Reference Manual, or appropriate Ada
+text book, will be sufficient for making use of these facilities.
+
+In the case of the input-output facilities,
+@xref{The Implementation of Standard I/O},
+gives details on exactly how GNAT interfaces to the
+file system. For the remaining packages, the Ada Reference Manual
+should be sufficient. The following is a list of the packages included,
+together with a brief description of the functionality that is provided.
+
+For completeness, references are included to other predefined library
+routines defined in other sections of the Ada Reference Manual (these are
+cross-indexed from Annex A). For further details see the relevant
+package declarations in the run-time library. In particular, a few units
+are not implemented, as marked by the presence of pragma Unimplemented_Unit,
+and in this case the package declaration contains comments explaining why
+the unit is not implemented.
+
+@table @code
+@item Ada (A.2)
+This is a parent package for all the standard library packages. It is
+usually included implicitly in your program, and itself contains no
+useful data or routines.
+
+@item Ada.Assertions (11.4.2)
+@code{Assertions} provides the @code{Assert} subprograms, and also
+the declaration of the @code{Assertion_Error} exception.
+
+@item Ada.Asynchronous_Task_Control (D.11)
+@code{Asynchronous_Task_Control} provides low level facilities for task
+synchronization. It is typically not implemented. See package spec for details.
+
+@item Ada.Calendar (9.6)
+@code{Calendar} provides time of day access, and routines for
+manipulating times and durations.
+
+@item Ada.Calendar.Arithmetic (9.6.1)
+This package provides additional arithmetic
+operations for @code{Calendar}.
+
+@item Ada.Calendar.Formatting (9.6.1)
+This package provides formatting operations for @code{Calendar}.
+
+@item Ada.Calendar.Time_Zones (9.6.1)
+This package provides additional @code{Calendar} facilities
+for handling time zones.
+
+@item Ada.Characters (A.3.1)
+This is a dummy parent package that contains no useful entities
+
+@item Ada.Characters.Conversions (A.3.2)
+This package provides character conversion functions.
+
+@item Ada.Characters.Handling (A.3.2)
+This package provides some basic character handling capabilities,
+including classification functions for classes of characters (e.g.@: test
+for letters, or digits).
+
+@item Ada.Characters.Latin_1 (A.3.3)
+This package includes a complete set of definitions of the characters
+that appear in type CHARACTER@. It is useful for writing programs that
+will run in international environments. For example, if you want an
+upper case E with an acute accent in a string, it is often better to use
+the definition of @code{UC_E_Acute} in this package. Then your program
+will print in an understandable manner even if your environment does not
+support these extended characters.
+
+@item Ada.Command_Line (A.15)
+This package provides access to the command line parameters and the name
+of the current program (analogous to the use of @code{argc} and @code{argv}
+in C), and also allows the exit status for the program to be set in a
+system-independent manner.
+
+@item Ada.Complex_Text_IO (G.1.3)
+This package provides text input and output of complex numbers.
+
+@item Ada.Containers (A.18.1)
+A top level package providing a few basic definitions used by all the
+following specific child packages that provide specific kinds of
+containers.
+
+@item Ada.Containers.Bounded_Priority_Queues (A.18.31)
+
+@item Ada.Containers.Bounded_Synchronized_Queues (A.18.29)
+
+@item Ada.Containers.Doubly_Linked_Lists (A.18.3)
+
+@item Ada.Containers.Generic_Array_Sort (A.18.26)
+
+@item Ada.Containers.Generic_Constrained_Array_Sort (A.18.26)
+
+@item Ada.Containers.Generic_Sort (A.18.26)
+
+@item Ada.Containers.Hashed_Maps (A.18.5)
+
+@item Ada.Containers.Hashed_Sets (A.18.8)
+
+@item Ada.Containers.Indefinite_Doubly_Linked_Lists (A.18.12)
+
+@item Ada.Containers.Indefinite_Hashed_Maps (A.18.13)
+
+@item Ada.Containers.Indefinite_Hashed_Sets (A.18.15)
+
+@item Ada.Containers.Indefinite_Holders (A.18.18)
+
+@item Ada.Containers.Indefinite_Multiway_Trees (A.18.17)
+
+@item Ada.Containers.Indefinite_Ordered_Maps (A.18.14)
+
+@item Ada.Containers.Indefinite_Ordered_Sets (A.18.16)
+
+@item Ada.Containers.Indefinite_Vectors (A.18.11)
+
+@item Ada.Containers.Multiway_Trees (A.18.10)
+
+@item Ada.Containers.Ordered_Maps (A.18.6)
+
+@item Ada.Containers.Ordered_Sets (A.18.9)
+
+@item Ada.Containers.Synchronized_Queue_Interfaces (A.18.27)
+
+@item Ada.Containers.Unbounded_Priority_Queues (A.18.30)
+
+@item Ada.Containers.Unbounded_Synchronized_Queues (A.18.28)
+
+@item Ada.Containers.Vectors (A.18.2)
+
+@item Ada.Directories (A.16)
+This package provides operations on directories.
+
+@item Ada.Directories.Hierarchical_File_Names (A.16.1)
+This package provides additional directory operations handling
+hiearchical file names.
+
+@item Ada.Directories.Information (A.16)
+This is an implementation defined package for additional directory
+operations, which is not implemented in GNAT.
+
+@item Ada.Decimal (F.2)
+This package provides constants describing the range of decimal numbers
+implemented, and also a decimal divide routine (analogous to the COBOL
+verb DIVIDE @dots{} GIVING @dots{} REMAINDER @dots{})
+
+@item Ada.Direct_IO (A.8.4)
+This package provides input-output using a model of a set of records of
+fixed-length, containing an arbitrary definite Ada type, indexed by an
+integer record number.
+
+@item Ada.Dispatching (D.2.1)
+A parent package containing definitions for task dispatching operations.
+
+@item Ada.Dispatching.EDF (D.2.6)
+Not implemented in GNAT.
+
+@item Ada.Dispatching.Non_Preemptive (D.2.4)
+Not implemented in GNAT.
+
+@item Ada.Dispatching.Round_Robin (D.2.5)
+Not implemented in GNAT.
+
+@item Ada.Dynamic_Priorities (D.5)
+This package allows the priorities of a task to be adjusted dynamically
+as the task is running.
+
+@item Ada.Environment_Variables (A.17)
+This package provides facilities for accessing environment variables.
+
+@item Ada.Exceptions (11.4.1)
+This package provides additional information on exceptions, and also
+contains facilities for treating exceptions as data objects, and raising
+exceptions with associated messages.
+
+@item Ada.Execution_Time (D.14)
+Not implemented in GNAT.
+
+@item Ada.Execution_Time.Group_Budgets (D.14.2)
+Not implemented in GNAT.
+
+@item Ada.Execution_Time.Timers (D.14.1)'
+Not implemented in GNAT.
+
+@item Ada.Finalization (7.6)
+This package contains the declarations and subprograms to support the
+use of controlled types, providing for automatic initialization and
+finalization (analogous to the constructors and destructors of C++).
+
+@item Ada.Float_Text_IO (A.10.9)
+A library level instantiation of Text_IO.Float_IO for type Float.
+
+@item Ada.Float_Wide_Text_IO (A.10.9)
+A library level instantiation of Wide_Text_IO.Float_IO for type Float.
+
+@item Ada.Float_Wide_Wide_Text_IO (A.10.9)
+A library level instantiation of Wide_Wide_Text_IO.Float_IO for type Float.
+
+@item Ada.Integer_Text_IO (A.10.9)
+A library level instantiation of Text_IO.Integer_IO for type Integer.
+
+@item Ada.Integer_Wide_Text_IO (A.10.9)
+A library level instantiation of Wide_Text_IO.Integer_IO for type Integer.
+
+@item Ada.Integer_Wide_Wide_Text_IO (A.10.9)
+A library level instantiation of Wide_Wide_Text_IO.Integer_IO for type Integer.
+
+@item Ada.Interrupts (C.3.2)
+This package provides facilities for interfacing to interrupts, which
+includes the set of signals or conditions that can be raised and
+recognized as interrupts.
+
+@item Ada.Interrupts.Names (C.3.2)
+This package provides the set of interrupt names (actually signal
+or condition names) that can be handled by GNAT@.
+
+@item Ada.IO_Exceptions (A.13)
+This package defines the set of exceptions that can be raised by use of
+the standard IO packages.
+
+@item Ada.Iterator_Interfaces (5.5.1)
+This package provides a generic interface to generalized iterators.
+
+@item Ada.Locales (A.19)
+This package provides declarations providing information (Language
+and Country) about the current locale.
+
+@item Ada.Numerics
+This package contains some standard constants and exceptions used
+throughout the numerics packages. Note that the constants pi and e are
+defined here, and it is better to use these definitions than rolling
+your own.
+
+@item Ada.Numerics.Complex_Arrays (G.3.2)
+Provides operations on arrays of complex numbers.
+
+@item Ada.Numerics.Complex_Elementary_Functions
+Provides the implementation of standard elementary functions (such as
+log and trigonometric functions) operating on complex numbers using the
+standard @code{Float} and the @code{Complex} and @code{Imaginary} types
+created by the package @code{Numerics.Complex_Types}.
+
+@item Ada.Numerics.Complex_Types
+This is a predefined instantiation of
+@code{Numerics.Generic_Complex_Types} using @code{Standard.Float} to
+build the type @code{Complex} and @code{Imaginary}.
+
+@item Ada.Numerics.Discrete_Random
+This generic package provides a random number generator suitable for generating
+uniformly distributed values of a specified discrete subtype.
+
+@item Ada.Numerics.Float_Random
+This package provides a random number generator suitable for generating
+uniformly distributed floating point values in the unit interval.
+
+@item Ada.Numerics.Generic_Complex_Elementary_Functions
+This is a generic version of the package that provides the
+implementation of standard elementary functions (such as log and
+trigonometric functions) for an arbitrary complex type.
+
+The following predefined instantiations of this package are provided:
+
+@table @code
+@item Short_Float
+@code{Ada.Numerics.Short_Complex_Elementary_Functions}
+@item Float
+@code{Ada.Numerics.Complex_Elementary_Functions}
+@item Long_Float
+@code{Ada.Numerics.Long_Complex_Elementary_Functions}
+@end table
+
+@item Ada.Numerics.Generic_Complex_Types
+This is a generic package that allows the creation of complex types,
+with associated complex arithmetic operations.
+
+The following predefined instantiations of this package exist
+@table @code
+@item Short_Float
+@code{Ada.Numerics.Short_Complex_Complex_Types}
+@item Float
+@code{Ada.Numerics.Complex_Complex_Types}
+@item Long_Float
+@code{Ada.Numerics.Long_Complex_Complex_Types}
+@end table
+
+@item Ada.Numerics.Generic_Elementary_Functions
+This is a generic package that provides the implementation of standard
+elementary functions (such as log an trigonometric functions) for an
+arbitrary float type.
+
+The following predefined instantiations of this package exist
+
+@table @code
+@item Short_Float
+@code{Ada.Numerics.Short_Elementary_Functions}
+@item Float
+@code{Ada.Numerics.Elementary_Functions}
+@item Long_Float
+@code{Ada.Numerics.Long_Elementary_Functions}
+@end table
+
+@item Ada.Numerics.Generic_Real_Arrays (G.3.1)
+Generic operations on arrays of reals
+
+@item Ada.Numerics.Real_Arrays (G.3.1)
+Preinstantiation of Ada.Numerics.Generic_Real_Arrays (Float).
+
+@item Ada.Real_Time (D.8)
+This package provides facilities similar to those of @code{Calendar}, but
+operating with a finer clock suitable for real time control. Note that
+annex D requires that there be no backward clock jumps, and GNAT generally
+guarantees this behavior, but of course if the external clock on which
+the GNAT runtime depends is deliberately reset by some external event,
+then such a backward jump may occur.
+
+@item Ada.Real_Time.Timing_Events (D.15)
+Not implemented in GNAT.
+
+@item Ada.Sequential_IO (A.8.1)
+This package provides input-output facilities for sequential files,
+which can contain a sequence of values of a single type, which can be
+any Ada type, including indefinite (unconstrained) types.
+
+@item Ada.Storage_IO (A.9)
+This package provides a facility for mapping arbitrary Ada types to and
+from a storage buffer. It is primarily intended for the creation of new
+IO packages.
+
+@item Ada.Streams (13.13.1)
+This is a generic package that provides the basic support for the
+concept of streams as used by the stream attributes (@code{Input},
+@code{Output}, @code{Read} and @code{Write}).
+
+@item Ada.Streams.Stream_IO (A.12.1)
+This package is a specialization of the type @code{Streams} defined in
+package @code{Streams} together with a set of operations providing
+Stream_IO capability. The Stream_IO model permits both random and
+sequential access to a file which can contain an arbitrary set of values
+of one or more Ada types.
+
+@item Ada.Strings (A.4.1)
+This package provides some basic constants used by the string handling
+packages.
+
+@item Ada.Strings.Bounded (A.4.4)
+This package provides facilities for handling variable length
+strings. The bounded model requires a maximum length. It is thus
+somewhat more limited than the unbounded model, but avoids the use of
+dynamic allocation or finalization.
+
+@item Ada.Strings.Bounded.Equal_Case_Insensitive (A.4.10)
+Provides case-insensitive comparisons of bounded strings
+
+@item Ada.Strings.Bounded.Hash (A.4.9)
+This package provides a generic hash function for bounded strings
+
+@item Ada.Strings.Bounded.Hash_Case_Insensitive (A.4.9)
+This package provides a generic hash function for bounded strings that
+converts the string to be hashed to lower case.
+
+@item Ada.Strings.Bounded.Less_Case_Insensitive (A.4.10)
+This package provides a comparison function for bounded strings that works
+in a case insensitive manner by converting to lower case before the comparison.
+
+@item Ada.Strings.Fixed (A.4.3)
+This package provides facilities for handling fixed length strings.
+
+@item Ada.Strings.Fixed.Equal_Case_Insensitive (A.4.10)
+This package provides an equality function for fixed strings that compares
+the strings after converting both to lower case.
+
+@item Ada.Strings.Fixed.Hash_Case_Insensitive (A.4.9)
+This package provides a case insensitive hash function for fixed strings that
+converts the string to lower case before computing the hash.
+
+@item Ada.Strings.Fixed.Less_Case_Insensitive (A.4.10)
+This package provides a comparison function for fixed strings that works
+in a case insensitive manner by converting to lower case before the comparison.
+
+Ada.Strings.Hash (A.4.9)
+This package provides a hash function for strings.
+
+Ada.Strings.Hash_Case_Insensitive (A.4.9)
+This package provides a hash function for strings that is case insensitive.
+The string is converted to lower case before computing the hash.
+
+@item Ada.Strings.Less_Case_Insensitive (A.4.10)
+This package provides a comparison function for\strings that works
+in a case insensitive manner by converting to lower case before the comparison.
+
+@item Ada.Strings.Maps (A.4.2)
+This package provides facilities for handling character mappings and
+arbitrarily defined subsets of characters. For instance it is useful in
+defining specialized translation tables.
+
+@item Ada.Strings.Maps.Constants (A.4.6)
+This package provides a standard set of predefined mappings and
+predefined character sets. For example, the standard upper to lower case
+conversion table is found in this package. Note that upper to lower case
+conversion is non-trivial if you want to take the entire set of
+characters, including extended characters like E with an acute accent,
+into account. You should use the mappings in this package (rather than
+adding 32 yourself) to do case mappings.
+
+@item Ada.Strings.Unbounded (A.4.5)
+This package provides facilities for handling variable length
+strings. The unbounded model allows arbitrary length strings, but
+requires the use of dynamic allocation and finalization.
+
+@item Ada.Strings.Unbounded.Equal_Case_Insensitive (A.4.10)
+Provides case-insensitive comparisons of unbounded strings
+
+@item Ada.Strings.Unbounded.Hash (A.4.9)
+This package provides a generic hash function for unbounded strings
+
+@item Ada.Strings.Unbounded.Hash_Case_Insensitive (A.4.9)
+This package provides a generic hash function for unbounded strings that
+converts the string to be hashed to lower case.
+
+@item Ada.Strings.Unbounded.Less_Case_Insensitive (A.4.10)
+This package provides a comparison function for unbounded strings that works
+in a case insensitive manner by converting to lower case before the comparison.
+
+@item Ada.Strings.UTF_Encoding (A.4.11)
+This package provides basic definitions for dealing with UTF-encoded strings.
+
+@item Ada.Strings.UTF_Encoding.Conversions (A.4.11)
+This package provides conversion functions for UTF-encoded strings.
+
+@item Ada.Strings.UTF_Encoding.Strings (A.4.11)
+@itemx Ada.Strings.UTF_Encoding.Wide_Strings (A.4.11)
+@itemx Ada.Strings.UTF_Encoding.Wide_Wide_Strings (A.4.11)
+These packages provide facilities for handling UTF encodings for
+Strings, Wide_Strings and Wide_Wide_Strings.
+
+@item Ada.Strings.Wide_Bounded (A.4.7)
+@itemx Ada.Strings.Wide_Fixed (A.4.7)
+@itemx Ada.Strings.Wide_Maps (A.4.7)
+@itemx Ada.Strings.Wide_Unbounded (A.4.7)
+These packages provide analogous capabilities to the corresponding
+packages without @samp{Wide_} in the name, but operate with the types
+@code{Wide_String} and @code{Wide_Character} instead of @code{String}
+and @code{Character}. Versions of all the child packages are available.
+
+@item Ada.Strings.Wide_Wide_Bounded (A.4.7)
+@itemx Ada.Strings.Wide_Wide_Fixed (A.4.7)
+@itemx Ada.Strings.Wide_Wide_Maps (A.4.7)
+@itemx Ada.Strings.Wide_Wide_Unbounded (A.4.7)
+These packages provide analogous capabilities to the corresponding
+packages without @samp{Wide_} in the name, but operate with the types
+@code{Wide_Wide_String} and @code{Wide_Wide_Character} instead
+of @code{String} and @code{Character}.
+
+@item Ada.Synchronous_Barriers (D.10.1)
+This package provides facilities for synchronizing tasks at a low level
+with barriers.
+
+@item Ada.Synchronous_Task_Control (D.10)
+This package provides some standard facilities for controlling task
+communication in a synchronous manner.
+
+@item Ada.Synchronous_Task_Control.EDF (D.10)
+Not implemented in GNAT.
+
+@item Ada.Tags
+This package contains definitions for manipulation of the tags of tagged
+values.
+
+@item Ada.Tags.Generic_Dispatching_Constructor (3.9)
+This package provides a way of constructing tagged class-wide values given
+only the tag value.
+
+@item Ada.Task_Attributes (C.7.2)
+This package provides the capability of associating arbitrary
+task-specific data with separate tasks.
+
+@item Ada.Task_Identifification (C.7.1)
+This package provides capabilities for task identification.
+
+@item Ada.Task_Termination (C.7.3)
+This package provides control over task termination.
+
+@item Ada.Text_IO
+This package provides basic text input-output capabilities for
+character, string and numeric data. The subpackages of this
+package are listed next. Note that although these are defined
+as subpackages in the RM, they are actually transparently
+implemented as child packages in GNAT, meaning that they
+are only loaded if needed.
+
+@item Ada.Text_IO.Decimal_IO
+Provides input-output facilities for decimal fixed-point types
+
+@item Ada.Text_IO.Enumeration_IO
+Provides input-output facilities for enumeration types.
+
+@item Ada.Text_IO.Fixed_IO
+Provides input-output facilities for ordinary fixed-point types.
+
+@item Ada.Text_IO.Float_IO
+Provides input-output facilities for float types. The following
+predefined instantiations of this generic package are available:
+
+@table @code
+@item Short_Float
+@code{Short_Float_Text_IO}
+@item Float
+@code{Float_Text_IO}
+@item Long_Float
+@code{Long_Float_Text_IO}
+@end table
+
+@item Ada.Text_IO.Integer_IO
+Provides input-output facilities for integer types. The following
+predefined instantiations of this generic package are available:
+
+@table @code
+@item Short_Short_Integer
+@code{Ada.Short_Short_Integer_Text_IO}
+@item Short_Integer
+@code{Ada.Short_Integer_Text_IO}
+@item Integer
+@code{Ada.Integer_Text_IO}
+@item Long_Integer
+@code{Ada.Long_Integer_Text_IO}
+@item Long_Long_Integer
+@code{Ada.Long_Long_Integer_Text_IO}
+@end table
+
+@item Ada.Text_IO.Modular_IO
+Provides input-output facilities for modular (unsigned) types.
+
+@item Ada.Text_IO.Bounded_IO (A.10.11)
+Provides input-output facilities for bounded strings.
+
+@item Ada.Text_IO.Complex_IO (G.1.3)
+This package provides basic text input-output capabilities for complex
+data.
+
+@item Ada.Text_IO.Editing (F.3.3)
+This package contains routines for edited output, analogous to the use
+of pictures in COBOL@. The picture formats used by this package are a
+close copy of the facility in COBOL@.
+
+@item Ada.Text_IO.Text_Streams (A.12.2)
+This package provides a facility that allows Text_IO files to be treated
+as streams, so that the stream attributes can be used for writing
+arbitrary data, including binary data, to Text_IO files.
+
+@item Ada.Text_IO.Unbounded_IO (A.10.12)
+This package provides input-output facilities for unbounded strings.
+
+@item Ada.Unchecked_Conversion (13.9)
+This generic package allows arbitrary conversion from one type to
+another of the same size, providing for breaking the type safety in
+special circumstances.
+
+If the types have the same Size (more accurately the same Value_Size),
+then the effect is simply to transfer the bits from the source to the
+target type without any modification. This usage is well defined, and
+for simple types whose representation is typically the same across
+all implementations, gives a portable method of performing such
+conversions.
+
+If the types do not have the same size, then the result is implementation
+defined, and thus may be non-portable. The following describes how GNAT
+handles such unchecked conversion cases.
+
+If the types are of different sizes, and are both discrete types, then
+the effect is of a normal type conversion without any constraint checking.
+In particular if the result type has a larger size, the result will be
+zero or sign extended. If the result type has a smaller size, the result
+will be truncated by ignoring high order bits.
+
+If the types are of different sizes, and are not both discrete types,
+then the conversion works as though pointers were created to the source
+and target, and the pointer value is converted. The effect is that bits
+are copied from successive low order storage units and bits of the source
+up to the length of the target type.
+
+A warning is issued if the lengths differ, since the effect in this
+case is implementation dependent, and the above behavior may not match
+that of some other compiler.
+
+A pointer to one type may be converted to a pointer to another type using
+unchecked conversion. The only case in which the effect is undefined is
+when one or both pointers are pointers to unconstrained array types. In
+this case, the bounds information may get incorrectly transferred, and in
+particular, GNAT uses double size pointers for such types, and it is
+meaningless to convert between such pointer types. GNAT will issue a
+warning if the alignment of the target designated type is more strict
+than the alignment of the source designated type (since the result may
+be unaligned in this case).
+
+A pointer other than a pointer to an unconstrained array type may be
+converted to and from System.Address. Such usage is common in Ada 83
+programs, but note that Ada.Address_To_Access_Conversions is the
+preferred method of performing such conversions in Ada 95 and Ada 2005.
+Neither
+unchecked conversion nor Ada.Address_To_Access_Conversions should be
+used in conjunction with pointers to unconstrained objects, since
+the bounds information cannot be handled correctly in this case.
+
+@item Ada.Unchecked_Deallocation (13.11.2)
+This generic package allows explicit freeing of storage previously
+allocated by use of an allocator.
+
+@item Ada.Wide_Text_IO (A.11)
+This package is similar to @code{Ada.Text_IO}, except that the external
+file supports wide character representations, and the internal types are
+@code{Wide_Character} and @code{Wide_String} instead of @code{Character}
+and @code{String}. The corresponding set of nested packages and child
+packages are defined.
+
+@item Ada.Wide_Wide_Text_IO (A.11)
+This package is similar to @code{Ada.Text_IO}, except that the external
+file supports wide character representations, and the internal types are
+@code{Wide_Character} and @code{Wide_String} instead of @code{Character}
+and @code{String}. The corresponding set of nested packages and child
+packages are defined.
+
+@end table
+
+For packages in Interfaces and System, all the RM defined packages are
+available in GNAT, see the Ada 2012 RM for full details.
+
+@node The Implementation of Standard I/O
+@chapter The Implementation of Standard I/O
+
+@noindent
+GNAT implements all the required input-output facilities described in
+A.6 through A.14. These sections of the Ada Reference Manual describe the
+required behavior of these packages from the Ada point of view, and if
+you are writing a portable Ada program that does not need to know the
+exact manner in which Ada maps to the outside world when it comes to
+reading or writing external files, then you do not need to read this
+chapter. As long as your files are all regular files (not pipes or
+devices), and as long as you write and read the files only from Ada, the
+description in the Ada Reference Manual is sufficient.
+
+However, if you want to do input-output to pipes or other devices, such
+as the keyboard or screen, or if the files you are dealing with are
+either generated by some other language, or to be read by some other
+language, then you need to know more about the details of how the GNAT
+implementation of these input-output facilities behaves.
+
+In this chapter we give a detailed description of exactly how GNAT
+interfaces to the file system. As always, the sources of the system are
+available to you for answering questions at an even more detailed level,
+but for most purposes the information in this chapter will suffice.
+
+Another reason that you may need to know more about how input-output is
+implemented arises when you have a program written in mixed languages
+where, for example, files are shared between the C and Ada sections of
+the same program. GNAT provides some additional facilities, in the form
+of additional child library packages, that facilitate this sharing, and
+these additional facilities are also described in this chapter.
+
+@menu
+* Standard I/O Packages::
+* FORM Strings::
+* Direct_IO::
+* Sequential_IO::
+* Text_IO::
+* Wide_Text_IO::
+* Wide_Wide_Text_IO::
+* Stream_IO::
+* Text Translation::
+* Shared Files::
+* Filenames encoding::
+* Open Modes::
+* Operations on C Streams::
+* Interfacing to C Streams::
+@end menu
+
+@node Standard I/O Packages
+@section Standard I/O Packages
+
+@noindent
+The Standard I/O packages described in Annex A for
+
+@itemize @bullet
+@item
+Ada.Text_IO
+@item
+Ada.Text_IO.Complex_IO
+@item
+Ada.Text_IO.Text_Streams
+@item
+Ada.Wide_Text_IO
+@item
+Ada.Wide_Text_IO.Complex_IO
+@item
+Ada.Wide_Text_IO.Text_Streams
+@item
+Ada.Wide_Wide_Text_IO
+@item
+Ada.Wide_Wide_Text_IO.Complex_IO
+@item
+Ada.Wide_Wide_Text_IO.Text_Streams
+@item
+Ada.Stream_IO
+@item
+Ada.Sequential_IO
+@item
+Ada.Direct_IO
+@end itemize
+
+@noindent
+are implemented using the C
+library streams facility; where
+
+@itemize @bullet
+@item
+All files are opened using @code{fopen}.
+@item
+All input/output operations use @code{fread}/@code{fwrite}.
+@end itemize
+
+@noindent
+There is no internal buffering of any kind at the Ada library level. The only
+buffering is that provided at the system level in the implementation of the
+library routines that support streams. This facilitates shared use of these
+streams by mixed language programs. Note though that system level buffering is
+explicitly enabled at elaboration of the standard I/O packages and that can
+have an impact on mixed language programs, in particular those using I/O before
+calling the Ada elaboration routine (e.g.@: adainit). It is recommended to call
+the Ada elaboration routine before performing any I/O or when impractical,
+flush the common I/O streams and in particular Standard_Output before
+elaborating the Ada code.
+
+@node FORM Strings
+@section FORM Strings
+
+@noindent
+The format of a FORM string in GNAT is:
+
+@smallexample
+"keyword=value,keyword=value,@dots{},keyword=value"
+@end smallexample
+
+@noindent
+where letters may be in upper or lower case, and there are no spaces
+between values. The order of the entries is not important. Currently
+the following keywords defined.
+
+@smallexample
+TEXT_TRANSLATION=[YES|NO]
+SHARED=[YES|NO]
+WCEM=[n|h|u|s|e|8|b]
+ENCODING=[UTF8|8BITS]
+@end smallexample
+
+@noindent
+The use of these parameters is described later in this section. If an
+unrecognized keyword appears in a form string, it is silently ignored
+and not considered invalid.
+
+@noindent
+For OpenVMS additional FORM string keywords are available for use with
+RMS services. The syntax is:
+
+@smallexample
+VMS_RMS_Keys=(keyword=value,@dots{},keyword=value)
+@end smallexample
+
+@noindent
+The following RMS keywords and values are currently defined:
+
+@smallexample
+Context=Force_Stream_Mode|Force_Record_Mode
+@end smallexample
+
+@noindent
+VMS RMS keys are silently ignored on non-VMS systems. On OpenVMS
+unimplented RMS keywords, values, or invalid syntax will raise Use_Error.
+
+@node Direct_IO
+@section Direct_IO
+
+@noindent
+Direct_IO can only be instantiated for definite types. This is a
+restriction of the Ada language, which means that the records are fixed
+length (the length being determined by @code{@var{type}'Size}, rounded
+up to the next storage unit boundary if necessary).
+
+The records of a Direct_IO file are simply written to the file in index
+sequence, with the first record starting at offset zero, and subsequent
+records following. There is no control information of any kind. For
+example, if 32-bit integers are being written, each record takes
+4-bytes, so the record at index @var{K} starts at offset
+(@var{K}@minus{}1)*4.
+
+There is no limit on the size of Direct_IO files, they are expanded as
+necessary to accommodate whatever records are written to the file.
+
+@node Sequential_IO
+@section Sequential_IO
+
+@noindent
+Sequential_IO may be instantiated with either a definite (constrained)
+or indefinite (unconstrained) type.
+
+For the definite type case, the elements written to the file are simply
+the memory images of the data values with no control information of any
+kind. The resulting file should be read using the same type, no validity
+checking is performed on input.
+
+For the indefinite type case, the elements written consist of two
+parts. First is the size of the data item, written as the memory image
+of a @code{Interfaces.C.size_t} value, followed by the memory image of
+the data value. The resulting file can only be read using the same
+(unconstrained) type. Normal assignment checks are performed on these
+read operations, and if these checks fail, @code{Data_Error} is
+raised. In particular, in the array case, the lengths must match, and in
+the variant record case, if the variable for a particular read operation
+is constrained, the discriminants must match.
+
+Note that it is not possible to use Sequential_IO to write variable
+length array items, and then read the data back into different length
+arrays. For example, the following will raise @code{Data_Error}:
+
+@smallexample @c ada
+ package IO is new Sequential_IO (String);
+ F : IO.File_Type;
+ S : String (1..4);
+ @dots{}
+ IO.Create (F)
+ IO.Write (F, "hello!")
+ IO.Reset (F, Mode=>In_File);
+ IO.Read (F, S);
+ Put_Line (S);
+
+@end smallexample
+
+@noindent
+On some Ada implementations, this will print @code{hell}, but the program is
+clearly incorrect, since there is only one element in the file, and that
+element is the string @code{hello!}.
+
+In Ada 95 and Ada 2005, this kind of behavior can be legitimately achieved
+using Stream_IO, and this is the preferred mechanism. In particular, the
+above program fragment rewritten to use Stream_IO will work correctly.
+
+@node Text_IO
+@section Text_IO
+
+@noindent
+Text_IO files consist of a stream of characters containing the following
+special control characters:
+
+@smallexample
+LF (line feed, 16#0A#) Line Mark
+FF (form feed, 16#0C#) Page Mark
+@end smallexample
+
+@noindent
+A canonical Text_IO file is defined as one in which the following
+conditions are met:
+
+@itemize @bullet
+@item
+The character @code{LF} is used only as a line mark, i.e.@: to mark the end
+of the line.
+
+@item
+The character @code{FF} is used only as a page mark, i.e.@: to mark the
+end of a page and consequently can appear only immediately following a
+@code{LF} (line mark) character.
+
+@item
+The file ends with either @code{LF} (line mark) or @code{LF}-@code{FF}
+(line mark, page mark). In the former case, the page mark is implicitly
+assumed to be present.
+@end itemize
+
+@noindent
+A file written using Text_IO will be in canonical form provided that no
+explicit @code{LF} or @code{FF} characters are written using @code{Put}
+or @code{Put_Line}. There will be no @code{FF} character at the end of
+the file unless an explicit @code{New_Page} operation was performed
+before closing the file.
+
+A canonical Text_IO file that is a regular file (i.e., not a device or a
+pipe) can be read using any of the routines in Text_IO@. The
+semantics in this case will be exactly as defined in the Ada Reference
+Manual, and all the routines in Text_IO are fully implemented.
+
+A text file that does not meet the requirements for a canonical Text_IO
+file has one of the following:
+
+@itemize @bullet
+@item
+The file contains @code{FF} characters not immediately following a
+@code{LF} character.
+
+@item
+The file contains @code{LF} or @code{FF} characters written by
+@code{Put} or @code{Put_Line}, which are not logically considered to be
+line marks or page marks.
+
+@item
+The file ends in a character other than @code{LF} or @code{FF},
+i.e.@: there is no explicit line mark or page mark at the end of the file.
+@end itemize
+
+@noindent
+Text_IO can be used to read such non-standard text files but subprograms
+to do with line or page numbers do not have defined meanings. In
+particular, a @code{FF} character that does not follow a @code{LF}
+character may or may not be treated as a page mark from the point of
+view of page and line numbering. Every @code{LF} character is considered
+to end a line, and there is an implied @code{LF} character at the end of
+the file.
+
+@menu
+* Text_IO Stream Pointer Positioning::
+* Text_IO Reading and Writing Non-Regular Files::
+* Get_Immediate::
+* Treating Text_IO Files as Streams::
+* Text_IO Extensions::
+* Text_IO Facilities for Unbounded Strings::
+@end menu
+
+@node Text_IO Stream Pointer Positioning
+@subsection Stream Pointer Positioning
+
+@noindent
+@code{Ada.Text_IO} has a definition of current position for a file that
+is being read. No internal buffering occurs in Text_IO, and usually the
+physical position in the stream used to implement the file corresponds
+to this logical position defined by Text_IO@. There are two exceptions:
+
+@itemize @bullet
+@item
+After a call to @code{End_Of_Page} that returns @code{True}, the stream
+is positioned past the @code{LF} (line mark) that precedes the page
+mark. Text_IO maintains an internal flag so that subsequent read
+operations properly handle the logical position which is unchanged by
+the @code{End_Of_Page} call.
+
+@item
+After a call to @code{End_Of_File} that returns @code{True}, if the
+Text_IO file was positioned before the line mark at the end of file
+before the call, then the logical position is unchanged, but the stream
+is physically positioned right at the end of file (past the line mark,
+and past a possible page mark following the line mark. Again Text_IO
+maintains internal flags so that subsequent read operations properly
+handle the logical position.
+@end itemize
+
+@noindent
+These discrepancies have no effect on the observable behavior of
+Text_IO, but if a single Ada stream is shared between a C program and
+Ada program, or shared (using @samp{shared=yes} in the form string)
+between two Ada files, then the difference may be observable in some
+situations.
+
+@node Text_IO Reading and Writing Non-Regular Files
+@subsection Reading and Writing Non-Regular Files
+
+@noindent
+A non-regular file is a device (such as a keyboard), or a pipe. Text_IO
+can be used for reading and writing. Writing is not affected and the
+sequence of characters output is identical to the normal file case, but
+for reading, the behavior of Text_IO is modified to avoid undesirable
+look-ahead as follows:
+
+An input file that is not a regular file is considered to have no page
+marks. Any @code{Ascii.FF} characters (the character normally used for a
+page mark) appearing in the file are considered to be data
+characters. In particular:
+
+@itemize @bullet
+@item
+@code{Get_Line} and @code{Skip_Line} do not test for a page mark
+following a line mark. If a page mark appears, it will be treated as a
+data character.
+
+@item
+This avoids the need to wait for an extra character to be typed or
+entered from the pipe to complete one of these operations.
+
+@item
+@code{End_Of_Page} always returns @code{False}
+
+@item
+@code{End_Of_File} will return @code{False} if there is a page mark at
+the end of the file.
+@end itemize
+
+@noindent
+Output to non-regular files is the same as for regular files. Page marks
+may be written to non-regular files using @code{New_Page}, but as noted
+above they will not be treated as page marks on input if the output is
+piped to another Ada program.
+
+Another important discrepancy when reading non-regular files is that the end
+of file indication is not ``sticky''. If an end of file is entered, e.g.@: by
+pressing the @key{EOT} key,
+then end of file
+is signaled once (i.e.@: the test @code{End_Of_File}
+will yield @code{True}, or a read will
+raise @code{End_Error}), but then reading can resume
+to read data past that end of
+file indication, until another end of file indication is entered.
+
+@node Get_Immediate
+@subsection Get_Immediate
+@cindex Get_Immediate
+
+@noindent
+Get_Immediate returns the next character (including control characters)
+from the input file. In particular, Get_Immediate will return LF or FF
+characters used as line marks or page marks. Such operations leave the
+file positioned past the control character, and it is thus not treated
+as having its normal function. This means that page, line and column
+counts after this kind of Get_Immediate call are set as though the mark
+did not occur. In the case where a Get_Immediate leaves the file
+positioned between the line mark and page mark (which is not normally
+possible), it is undefined whether the FF character will be treated as a
+page mark.
+
+@node Treating Text_IO Files as Streams
+@subsection Treating Text_IO Files as Streams
+@cindex Stream files
+
+@noindent
+The package @code{Text_IO.Streams} allows a Text_IO file to be treated
+as a stream. Data written to a Text_IO file in this stream mode is
+binary data. If this binary data contains bytes 16#0A# (@code{LF}) or
+16#0C# (@code{FF}), the resulting file may have non-standard
+format. Similarly if read operations are used to read from a Text_IO
+file treated as a stream, then @code{LF} and @code{FF} characters may be
+skipped and the effect is similar to that described above for
+@code{Get_Immediate}.
+
+@node Text_IO Extensions
+@subsection Text_IO Extensions
+@cindex Text_IO extensions
+
+@noindent
+A package GNAT.IO_Aux in the GNAT library provides some useful extensions
+to the standard @code{Text_IO} package:
+
+@itemize @bullet
+@item function File_Exists (Name : String) return Boolean;
+Determines if a file of the given name exists.
+
+@item function Get_Line return String;
+Reads a string from the standard input file. The value returned is exactly
+the length of the line that was read.
+
+@item function Get_Line (File : Ada.Text_IO.File_Type) return String;
+Similar, except that the parameter File specifies the file from which
+the string is to be read.
+
+@end itemize
+
+@node Text_IO Facilities for Unbounded Strings
+@subsection Text_IO Facilities for Unbounded Strings
+@cindex Text_IO for unbounded strings
+@cindex Unbounded_String, Text_IO operations
+
+@noindent
+The package @code{Ada.Strings.Unbounded.Text_IO}
+in library files @code{a-suteio.ads/adb} contains some GNAT-specific
+subprograms useful for Text_IO operations on unbounded strings:
+
+@itemize @bullet
+
+@item function Get_Line (File : File_Type) return Unbounded_String;
+Reads a line from the specified file
+and returns the result as an unbounded string.
+
+@item procedure Put (File : File_Type; U : Unbounded_String);
+Writes the value of the given unbounded string to the specified file
+Similar to the effect of
+@code{Put (To_String (U))} except that an extra copy is avoided.
+
+@item procedure Put_Line (File : File_Type; U : Unbounded_String);
+Writes the value of the given unbounded string to the specified file,
+followed by a @code{New_Line}.
+Similar to the effect of @code{Put_Line (To_String (U))} except
+that an extra copy is avoided.
+@end itemize
+
+@noindent
+In the above procedures, @code{File} is of type @code{Ada.Text_IO.File_Type}
+and is optional. If the parameter is omitted, then the standard input or
+output file is referenced as appropriate.
+
+The package @code{Ada.Strings.Wide_Unbounded.Wide_Text_IO} in library
+files @file{a-swuwti.ads} and @file{a-swuwti.adb} provides similar extended
+@code{Wide_Text_IO} functionality for unbounded wide strings.
+
+The package @code{Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO} in library
+files @file{a-szuzti.ads} and @file{a-szuzti.adb} provides similar extended
+@code{Wide_Wide_Text_IO} functionality for unbounded wide wide strings.
+
+@node Wide_Text_IO
+@section Wide_Text_IO
+
+@noindent
+@code{Wide_Text_IO} is similar in most respects to Text_IO, except that
+both input and output files may contain special sequences that represent
+wide character values. The encoding scheme for a given file may be
+specified using a FORM parameter:
+
+@smallexample
+WCEM=@var{x}
+@end smallexample
+
+@noindent
+as part of the FORM string (WCEM = wide character encoding method),
+where @var{x} is one of the following characters
+
+@table @samp
+@item h
+Hex ESC encoding
+@item u
+Upper half encoding
+@item s
+Shift-JIS encoding
+@item e
+EUC Encoding
+@item 8
+UTF-8 encoding
+@item b
+Brackets encoding
+@end table
+
+@noindent
+The encoding methods match those that
+can be used in a source
+program, but there is no requirement that the encoding method used for
+the source program be the same as the encoding method used for files,
+and different files may use different encoding methods.
+
+The default encoding method for the standard files, and for opened files
+for which no WCEM parameter is given in the FORM string matches the
+wide character encoding specified for the main program (the default
+being brackets encoding if no coding method was specified with -gnatW).
+
+@table @asis
+@item Hex Coding
+In this encoding, a wide character is represented by a five character
+sequence:
+
+@smallexample
+ESC a b c d
+@end smallexample
+
+@noindent
+where @var{a}, @var{b}, @var{c}, @var{d} are the four hexadecimal
+characters (using upper case letters) of the wide character code. For
+example, ESC A345 is used to represent the wide character with code
+16#A345#. This scheme is compatible with use of the full
+@code{Wide_Character} set.
+
+@item Upper Half Coding
+The wide character with encoding 16#abcd#, where the upper bit is on
+(i.e.@: a is in the range 8-F) is represented as two bytes 16#ab# and
+16#cd#. The second byte may never be a format control character, but is
+not required to be in the upper half. This method can be also used for
+shift-JIS or EUC where the internal coding matches the external coding.
+
+@item Shift JIS Coding
+A wide character is represented by a two character sequence 16#ab# and
+16#cd#, with the restrictions described for upper half encoding as
+described above. The internal character code is the corresponding JIS
+character according to the standard algorithm for Shift-JIS
+conversion. Only characters defined in the JIS code set table can be
+used with this encoding method.
+
+@item EUC Coding
+A wide character is represented by a two character sequence 16#ab# and
+16#cd#, with both characters being in the upper half. The internal
+character code is the corresponding JIS character according to the EUC
+encoding algorithm. Only characters defined in the JIS code set table
+can be used with this encoding method.
+
+@item UTF-8 Coding
+A wide character is represented using
+UCS Transformation Format 8 (UTF-8) as defined in Annex R of ISO
+10646-1/Am.2. Depending on the character value, the representation
+is a one, two, or three byte sequence:
+
+@smallexample
+16#0000#-16#007f#: 2#0xxxxxxx#
+16#0080#-16#07ff#: 2#110xxxxx# 2#10xxxxxx#
+16#0800#-16#ffff#: 2#1110xxxx# 2#10xxxxxx# 2#10xxxxxx#
+@end smallexample
+
+@noindent
+where the @var{xxx} bits correspond to the left-padded bits of the
+16-bit character value. Note that all lower half ASCII characters
+are represented as ASCII bytes and all upper half characters and
+other wide characters are represented as sequences of upper-half
+(The full UTF-8 scheme allows for encoding 31-bit characters as
+6-byte sequences, but in this implementation, all UTF-8 sequences
+of four or more bytes length will raise a Constraint_Error, as
+will all invalid UTF-8 sequences.)
+
+@item Brackets Coding
+In this encoding, a wide character is represented by the following eight
+character sequence:
+
+@smallexample
+[ " a b c d " ]
+@end smallexample
+
+@noindent
+where @code{a}, @code{b}, @code{c}, @code{d} are the four hexadecimal
+characters (using uppercase letters) of the wide character code. For
+example, @code{["A345"]} is used to represent the wide character with code
+@code{16#A345#}.
+This scheme is compatible with use of the full Wide_Character set.
+On input, brackets coding can also be used for upper half characters,
+e.g.@: @code{["C1"]} for lower case a. However, on output, brackets notation
+is only used for wide characters with a code greater than @code{16#FF#}.
+
+Note that brackets coding is not normally used in the context of
+Wide_Text_IO or Wide_Wide_Text_IO, since it is really just designed as
+a portable way of encoding source files. In the context of Wide_Text_IO
+or Wide_Wide_Text_IO, it can only be used if the file does not contain
+any instance of the left bracket character other than to encode wide
+character values using the brackets encoding method. In practice it is
+expected that some standard wide character encoding method such
+as UTF-8 will be used for text input output.
+
+If brackets notation is used, then any occurrence of a left bracket
+in the input file which is not the start of a valid wide character
+sequence will cause Constraint_Error to be raised. It is possible to
+encode a left bracket as ["5B"] and Wide_Text_IO and Wide_Wide_Text_IO
+input will interpret this as a left bracket.
+
+However, when a left bracket is output, it will be output as a left bracket
+and not as ["5B"]. We make this decision because for normal use of
+Wide_Text_IO for outputting messages, it is unpleasant to clobber left
+brackets. For example, if we write:
+
+@smallexample
+ Put_Line ("Start of output [first run]");
+@end smallexample
+
+@noindent
+we really do not want to have the left bracket in this message clobbered so
+that the output reads:
+
+@smallexample
+ Start of output ["5B"]first run]
+@end smallexample
+
+@noindent
+In practice brackets encoding is reasonably useful for normal Put_Line use
+since we won't get confused between left brackets and wide character
+sequences in the output. But for input, or when files are written out
+and read back in, it really makes better sense to use one of the standard
+encoding methods such as UTF-8.
+
+@end table
+
+@noindent
+For the coding schemes other than UTF-8, Hex, or Brackets encoding,
+not all wide character
+values can be represented. An attempt to output a character that cannot
+be represented using the encoding scheme for the file causes
+Constraint_Error to be raised. An invalid wide character sequence on
+input also causes Constraint_Error to be raised.
+
+@menu
+* Wide_Text_IO Stream Pointer Positioning::
+* Wide_Text_IO Reading and Writing Non-Regular Files::
+@end menu
+
+@node Wide_Text_IO Stream Pointer Positioning
+@subsection Stream Pointer Positioning
+
+@noindent
+@code{Ada.Wide_Text_IO} is similar to @code{Ada.Text_IO} in its handling
+of stream pointer positioning (@pxref{Text_IO}). There is one additional
+case:
+
+If @code{Ada.Wide_Text_IO.Look_Ahead} reads a character outside the
+normal lower ASCII set (i.e.@: a character in the range:
+
+@smallexample @c ada
+Wide_Character'Val (16#0080#) .. Wide_Character'Val (16#FFFF#)
+@end smallexample
+
+@noindent
+then although the logical position of the file pointer is unchanged by
+the @code{Look_Ahead} call, the stream is physically positioned past the
+wide character sequence. Again this is to avoid the need for buffering
+or backup, and all @code{Wide_Text_IO} routines check the internal
+indication that this situation has occurred so that this is not visible
+to a normal program using @code{Wide_Text_IO}. However, this discrepancy
+can be observed if the wide text file shares a stream with another file.
+
+@node Wide_Text_IO Reading and Writing Non-Regular Files
+@subsection Reading and Writing Non-Regular Files
+
+@noindent
+As in the case of Text_IO, when a non-regular file is read, it is
+assumed that the file contains no page marks (any form characters are
+treated as data characters), and @code{End_Of_Page} always returns
+@code{False}. Similarly, the end of file indication is not sticky, so
+it is possible to read beyond an end of file.
+
+@node Wide_Wide_Text_IO
+@section Wide_Wide_Text_IO
+
+@noindent
+@code{Wide_Wide_Text_IO} is similar in most respects to Text_IO, except that
+both input and output files may contain special sequences that represent
+wide wide character values. The encoding scheme for a given file may be
+specified using a FORM parameter:
+
+@smallexample
+WCEM=@var{x}
+@end smallexample
+
+@noindent
+as part of the FORM string (WCEM = wide character encoding method),
+where @var{x} is one of the following characters
+
+@table @samp
+@item h
+Hex ESC encoding
+@item u
+Upper half encoding
+@item s
+Shift-JIS encoding
+@item e
+EUC Encoding
+@item 8
+UTF-8 encoding
+@item b
+Brackets encoding
+@end table
+
+@noindent
+The encoding methods match those that
+can be used in a source
+program, but there is no requirement that the encoding method used for
+the source program be the same as the encoding method used for files,
+and different files may use different encoding methods.
+
+The default encoding method for the standard files, and for opened files
+for which no WCEM parameter is given in the FORM string matches the
+wide character encoding specified for the main program (the default
+being brackets encoding if no coding method was specified with -gnatW).
+
+@table @asis
+
+@item UTF-8 Coding
+A wide character is represented using
+UCS Transformation Format 8 (UTF-8) as defined in Annex R of ISO
+10646-1/Am.2. Depending on the character value, the representation
+is a one, two, three, or four byte sequence:
+
+@smallexample
+16#000000#-16#00007f#: 2#0xxxxxxx#
+16#000080#-16#0007ff#: 2#110xxxxx# 2#10xxxxxx#
+16#000800#-16#00ffff#: 2#1110xxxx# 2#10xxxxxx# 2#10xxxxxx#
+16#010000#-16#10ffff#: 2#11110xxx# 2#10xxxxxx# 2#10xxxxxx# 2#10xxxxxx#
+@end smallexample
+
+@noindent
+where the @var{xxx} bits correspond to the left-padded bits of the
+21-bit character value. Note that all lower half ASCII characters
+are represented as ASCII bytes and all upper half characters and
+other wide characters are represented as sequences of upper-half
+characters.
+
+@item Brackets Coding
+In this encoding, a wide wide character is represented by the following eight
+character sequence if is in wide character range
+
+@smallexample
+[ " a b c d " ]
+@end smallexample
+
+and by the following ten character sequence if not
+
+@smallexample
+[ " a b c d e f " ]
+@end smallexample
+
+@noindent
+where @code{a}, @code{b}, @code{c}, @code{d}, @code{e}, and @code{f}
+are the four or six hexadecimal
+characters (using uppercase letters) of the wide wide character code. For
+example, @code{["01A345"]} is used to represent the wide wide character
+with code @code{16#01A345#}.
+
+This scheme is compatible with use of the full Wide_Wide_Character set.
+On input, brackets coding can also be used for upper half characters,
+e.g.@: @code{["C1"]} for lower case a. However, on output, brackets notation
+is only used for wide characters with a code greater than @code{16#FF#}.
+
+@end table
+
+@noindent
+If is also possible to use the other Wide_Character encoding methods,
+such as Shift-JIS, but the other schemes cannot support the full range
+of wide wide characters.
+An attempt to output a character that cannot
+be represented using the encoding scheme for the file causes
+Constraint_Error to be raised. An invalid wide character sequence on
+input also causes Constraint_Error to be raised.
+
+@menu
+* Wide_Wide_Text_IO Stream Pointer Positioning::
+* Wide_Wide_Text_IO Reading and Writing Non-Regular Files::
+@end menu
+
+@node Wide_Wide_Text_IO Stream Pointer Positioning
+@subsection Stream Pointer Positioning
+
+@noindent
+@code{Ada.Wide_Wide_Text_IO} is similar to @code{Ada.Text_IO} in its handling
+of stream pointer positioning (@pxref{Text_IO}). There is one additional
+case:
+
+If @code{Ada.Wide_Wide_Text_IO.Look_Ahead} reads a character outside the
+normal lower ASCII set (i.e.@: a character in the range:
+
+@smallexample @c ada
+Wide_Wide_Character'Val (16#0080#) .. Wide_Wide_Character'Val (16#10FFFF#)
+@end smallexample
+
+@noindent
+then although the logical position of the file pointer is unchanged by
+the @code{Look_Ahead} call, the stream is physically positioned past the
+wide character sequence. Again this is to avoid the need for buffering
+or backup, and all @code{Wide_Wide_Text_IO} routines check the internal
+indication that this situation has occurred so that this is not visible
+to a normal program using @code{Wide_Wide_Text_IO}. However, this discrepancy
+can be observed if the wide text file shares a stream with another file.
+
+@node Wide_Wide_Text_IO Reading and Writing Non-Regular Files
+@subsection Reading and Writing Non-Regular Files
+
+@noindent
+As in the case of Text_IO, when a non-regular file is read, it is
+assumed that the file contains no page marks (any form characters are
+treated as data characters), and @code{End_Of_Page} always returns
+@code{False}. Similarly, the end of file indication is not sticky, so
+it is possible to read beyond an end of file.
+
+@node Stream_IO
+@section Stream_IO
+
+@noindent
+A stream file is a sequence of bytes, where individual elements are
+written to the file as described in the Ada Reference Manual. The type
+@code{Stream_Element} is simply a byte. There are two ways to read or
+write a stream file.
+
+@itemize @bullet
+@item
+The operations @code{Read} and @code{Write} directly read or write a
+sequence of stream elements with no control information.
+
+@item
+The stream attributes applied to a stream file transfer data in the
+manner described for stream attributes.
+@end itemize
+
+@node Text Translation
+@section Text Translation
+
+@noindent
+@samp{Text_Translation=@var{xxx}} may be used as the Form parameter
+passed to Text_IO.Create and Text_IO.Open:
+@samp{Text_Translation=@var{Yes}} is the default, which means to
+translate LF to/from CR/LF on Windows systems.
+@samp{Text_Translation=@var{No}} disables this translation; i.e. it
+uses binary mode. For output files, @samp{Text_Translation=@var{No}}
+may be used to create Unix-style files on
+Windows. @samp{Text_Translation=@var{xxx}} has no effect on Unix
+systems.
+
+@node Shared Files
+@section Shared Files
+
+@noindent
+Section A.14 of the Ada Reference Manual allows implementations to
+provide a wide variety of behavior if an attempt is made to access the
+same external file with two or more internal files.
+
+To provide a full range of functionality, while at the same time
+minimizing the problems of portability caused by this implementation
+dependence, GNAT handles file sharing as follows:
+
+@itemize @bullet
+@item
+In the absence of a @samp{shared=@var{xxx}} form parameter, an attempt
+to open two or more files with the same full name is considered an error
+and is not supported. The exception @code{Use_Error} will be
+raised. Note that a file that is not explicitly closed by the program
+remains open until the program terminates.
+
+@item
+If the form parameter @samp{shared=no} appears in the form string, the
+file can be opened or created with its own separate stream identifier,
+regardless of whether other files sharing the same external file are
+opened. The exact effect depends on how the C stream routines handle
+multiple accesses to the same external files using separate streams.
+
+@item
+If the form parameter @samp{shared=yes} appears in the form string for
+each of two or more files opened using the same full name, the same
+stream is shared between these files, and the semantics are as described
+in Ada Reference Manual, Section A.14.
+@end itemize
+
+@noindent
+When a program that opens multiple files with the same name is ported
+from another Ada compiler to GNAT, the effect will be that
+@code{Use_Error} is raised.
+
+The documentation of the original compiler and the documentation of the
+program should then be examined to determine if file sharing was
+expected, and @samp{shared=@var{xxx}} parameters added to @code{Open}
+and @code{Create} calls as required.
+
+When a program is ported from GNAT to some other Ada compiler, no
+special attention is required unless the @samp{shared=@var{xxx}} form
+parameter is used in the program. In this case, you must examine the
+documentation of the new compiler to see if it supports the required
+file sharing semantics, and form strings modified appropriately. Of
+course it may be the case that the program cannot be ported if the
+target compiler does not support the required functionality. The best
+approach in writing portable code is to avoid file sharing (and hence
+the use of the @samp{shared=@var{xxx}} parameter in the form string)
+completely.
+
+One common use of file sharing in Ada 83 is the use of instantiations of
+Sequential_IO on the same file with different types, to achieve
+heterogeneous input-output. Although this approach will work in GNAT if
+@samp{shared=yes} is specified, it is preferable in Ada to use Stream_IO
+for this purpose (using the stream attributes)
+
+@node Filenames encoding
+@section Filenames encoding
+
+@noindent
+An encoding form parameter can be used to specify the filename
+encoding @samp{encoding=@var{xxx}}.
+
+@itemize @bullet
+@item
+If the form parameter @samp{encoding=utf8} appears in the form string, the
+filename must be encoded in UTF-8.
+
+@item
+If the form parameter @samp{encoding=8bits} appears in the form
+string, the filename must be a standard 8bits string.
+@end itemize
+
+In the absence of a @samp{encoding=@var{xxx}} form parameter, the
+encoding is controlled by the @samp{GNAT_CODE_PAGE} environment
+variable. And if not set @samp{utf8} is assumed.
+
+@table @samp
+@item CP_ACP
+The current system Windows ANSI code page.
+@item CP_UTF8
+UTF-8 encoding
+@end table
+
+This encoding form parameter is only supported on the Windows
+platform. On the other Operating Systems the run-time is supporting
+UTF-8 natively.
+
+@node Open Modes
+@section Open Modes
+
+@noindent
+@code{Open} and @code{Create} calls result in a call to @code{fopen}
+using the mode shown in the following table:
+
+@sp 2
+@center @code{Open} and @code{Create} Call Modes
+@smallexample
+ @b{OPEN } @b{CREATE}
+Append_File "r+" "w+"
+In_File "r" "w+"
+Out_File (Direct_IO) "r+" "w"
+Out_File (all other cases) "w" "w"
+Inout_File "r+" "w+"
+@end smallexample
+
+@noindent
+If text file translation is required, then either @samp{b} or @samp{t}
+is added to the mode, depending on the setting of Text. Text file
+translation refers to the mapping of CR/LF sequences in an external file
+to LF characters internally. This mapping only occurs in DOS and
+DOS-like systems, and is not relevant to other systems.
+
+A special case occurs with Stream_IO@. As shown in the above table, the
+file is initially opened in @samp{r} or @samp{w} mode for the
+@code{In_File} and @code{Out_File} cases. If a @code{Set_Mode} operation
+subsequently requires switching from reading to writing or vice-versa,
+then the file is reopened in @samp{r+} mode to permit the required operation.
+
+@node Operations on C Streams
+@section Operations on C Streams
+The package @code{Interfaces.C_Streams} provides an Ada program with direct
+access to the C library functions for operations on C streams:
+
+@smallexample @c adanocomment
+package Interfaces.C_Streams is
+ -- Note: the reason we do not use the types that are in
+ -- Interfaces.C is that we want to avoid dragging in the
+ -- code in this unit if possible.
+ subtype chars is System.Address;
+ -- Pointer to null-terminated array of characters
+ subtype FILEs is System.Address;
+ -- Corresponds to the C type FILE*
+ subtype voids is System.Address;
+ -- Corresponds to the C type void*
+ subtype int is Integer;
+ subtype long is Long_Integer;
+ -- Note: the above types are subtypes deliberately, and it
+ -- is part of this spec that the above correspondences are
+ -- guaranteed. This means that it is legitimate to, for
+ -- example, use Integer instead of int. We provide these
+ -- synonyms for clarity, but in some cases it may be
+ -- convenient to use the underlying types (for example to
+ -- avoid an unnecessary dependency of a spec on the spec
+ -- of this unit).
+ type size_t is mod 2 ** Standard'Address_Size;
+ NULL_Stream : constant FILEs;
+ -- Value returned (NULL in C) to indicate an
+ -- fdopen/fopen/tmpfile error
+ ----------------------------------
+ -- Constants Defined in stdio.h --
+ ----------------------------------
+ EOF : constant int;
+ -- Used by a number of routines to indicate error or
+ -- end of file
+ IOFBF : constant int;
+ IOLBF : constant int;
+ IONBF : constant int;
+ -- Used to indicate buffering mode for setvbuf call
+ SEEK_CUR : constant int;
+ SEEK_END : constant int;
+ SEEK_SET : constant int;
+ -- Used to indicate origin for fseek call
+ function stdin return FILEs;
+ function stdout return FILEs;
+ function stderr return FILEs;
+ -- Streams associated with standard files
+ --------------------------
+ -- Standard C functions --
+ --------------------------
+ -- The functions selected below are ones that are
+ -- available in UNIX (but not necessarily in ANSI C).
+ -- These are very thin interfaces
+ -- which copy exactly the C headers. For more
+ -- documentation on these functions, see the Microsoft C
+ -- "Run-Time Library Reference" (Microsoft Press, 1990,
+ -- ISBN 1-55615-225-6), which includes useful information
+ -- on system compatibility.
+ procedure clearerr (stream : FILEs);
+ function fclose (stream : FILEs) return int;
+ function fdopen (handle : int; mode : chars) return FILEs;
+ function feof (stream : FILEs) return int;
+ function ferror (stream : FILEs) return int;
+ function fflush (stream : FILEs) return int;
+ function fgetc (stream : FILEs) return int;
+ function fgets (strng : chars; n : int; stream : FILEs)
+ return chars;
+ function fileno (stream : FILEs) return int;
+ function fopen (filename : chars; Mode : chars)
+ return FILEs;
+ -- Note: to maintain target independence, use
+ -- text_translation_required, a boolean variable defined in
+ -- a-sysdep.c to deal with the target dependent text
+ -- translation requirement. If this variable is set,
+ -- then b/t should be appended to the standard mode
+ -- argument to set the text translation mode off or on
+ -- as required.
+ function fputc (C : int; stream : FILEs) return int;
+ function fputs (Strng : chars; Stream : FILEs) return int;
+ function fread
+ (buffer : voids;
+ size : size_t;
+ count : size_t;
+ stream : FILEs)
+ return size_t;
+ function freopen
+ (filename : chars;
+ mode : chars;
+ stream : FILEs)
+ return FILEs;
+ function fseek
+ (stream : FILEs;
+ offset : long;
+ origin : int)
+ return int;
+ function ftell (stream : FILEs) return long;
+ function fwrite
+ (buffer : voids;
+ size : size_t;
+ count : size_t;
+ stream : FILEs)
+ return size_t;
+ function isatty (handle : int) return int;
+ procedure mktemp (template : chars);
+ -- The return value (which is just a pointer to template)
+ -- is discarded
+ procedure rewind (stream : FILEs);
+ function rmtmp return int;
+ function setvbuf
+ (stream : FILEs;
+ buffer : chars;
+ mode : int;
+ size : size_t)
+ return int;
+
+ function tmpfile return FILEs;
+ function ungetc (c : int; stream : FILEs) return int;
+ function unlink (filename : chars) return int;
+ ---------------------
+ -- Extra functions --
+ ---------------------
+ -- These functions supply slightly thicker bindings than
+ -- those above. They are derived from functions in the
+ -- C Run-Time Library, but may do a bit more work than
+ -- just directly calling one of the Library functions.
+ function is_regular_file (handle : int) return int;
+ -- Tests if given handle is for a regular file (result 1)
+ -- or for a non-regular file (pipe or device, result 0).
+ ---------------------------------
+ -- Control of Text/Binary Mode --
+ ---------------------------------
+ -- If text_translation_required is true, then the following
+ -- functions may be used to dynamically switch a file from
+ -- binary to text mode or vice versa. These functions have
+ -- no effect if text_translation_required is false (i.e.@: in
+ -- normal UNIX mode). Use fileno to get a stream handle.
+ procedure set_binary_mode (handle : int);
+ procedure set_text_mode (handle : int);
+ ----------------------------
+ -- Full Path Name support --
+ ----------------------------
+ procedure full_name (nam : chars; buffer : chars);
+ -- Given a NUL terminated string representing a file
+ -- name, returns in buffer a NUL terminated string
+ -- representing the full path name for the file name.
+ -- On systems where it is relevant the drive is also
+ -- part of the full path name. It is the responsibility
+ -- of the caller to pass an actual parameter for buffer
+ -- that is big enough for any full path name. Use
+ -- max_path_len given below as the size of buffer.
+ max_path_len : integer;
+ -- Maximum length of an allowable full path name on the
+ -- system, including a terminating NUL character.
+end Interfaces.C_Streams;
+@end smallexample
+
+@node Interfacing to C Streams
+@section Interfacing to C Streams
+
+@noindent
+The packages in this section permit interfacing Ada files to C Stream
+operations.
+
+@smallexample @c ada
+ with Interfaces.C_Streams;
+ package Ada.Sequential_IO.C_Streams is
+ function C_Stream (F : File_Type)
+ return Interfaces.C_Streams.FILEs;
+ procedure Open
+ (File : in out File_Type;
+ Mode : in File_Mode;
+ C_Stream : in Interfaces.C_Streams.FILEs;
+ Form : in String := "");
+ end Ada.Sequential_IO.C_Streams;
+
+ with Interfaces.C_Streams;
+ package Ada.Direct_IO.C_Streams is
+ function C_Stream (F : File_Type)
+ return Interfaces.C_Streams.FILEs;
+ procedure Open
+ (File : in out File_Type;
+ Mode : in File_Mode;
+ C_Stream : in Interfaces.C_Streams.FILEs;
+ Form : in String := "");
+ end Ada.Direct_IO.C_Streams;
+
+ with Interfaces.C_Streams;
+ package Ada.Text_IO.C_Streams is
+ function C_Stream (F : File_Type)
+ return Interfaces.C_Streams.FILEs;
+ procedure Open
+ (File : in out File_Type;
+ Mode : in File_Mode;
+ C_Stream : in Interfaces.C_Streams.FILEs;
+ Form : in String := "");
+ end Ada.Text_IO.C_Streams;
+
+ with Interfaces.C_Streams;
+ package Ada.Wide_Text_IO.C_Streams is
+ function C_Stream (F : File_Type)
+ return Interfaces.C_Streams.FILEs;
+ procedure Open
+ (File : in out File_Type;
+ Mode : in File_Mode;
+ C_Stream : in Interfaces.C_Streams.FILEs;
+ Form : in String := "");
+ end Ada.Wide_Text_IO.C_Streams;
+
+ with Interfaces.C_Streams;
+ package Ada.Wide_Wide_Text_IO.C_Streams is
+ function C_Stream (F : File_Type)
+ return Interfaces.C_Streams.FILEs;
+ procedure Open
+ (File : in out File_Type;
+ Mode : in File_Mode;
+ C_Stream : in Interfaces.C_Streams.FILEs;
+ Form : in String := "");
+ end Ada.Wide_Wide_Text_IO.C_Streams;
+
+ with Interfaces.C_Streams;
+ package Ada.Stream_IO.C_Streams is
+ function C_Stream (F : File_Type)
+ return Interfaces.C_Streams.FILEs;
+ procedure Open
+ (File : in out File_Type;
+ Mode : in File_Mode;
+ C_Stream : in Interfaces.C_Streams.FILEs;
+ Form : in String := "");
+ end Ada.Stream_IO.C_Streams;
+@end smallexample
+
+@noindent
+In each of these six packages, the @code{C_Stream} function obtains the
+@code{FILE} pointer from a currently opened Ada file. It is then
+possible to use the @code{Interfaces.C_Streams} package to operate on
+this stream, or the stream can be passed to a C program which can
+operate on it directly. Of course the program is responsible for
+ensuring that only appropriate sequences of operations are executed.
+
+One particular use of relevance to an Ada program is that the
+@code{setvbuf} function can be used to control the buffering of the
+stream used by an Ada file. In the absence of such a call the standard
+default buffering is used.
+
+The @code{Open} procedures in these packages open a file giving an
+existing C Stream instead of a file name. Typically this stream is
+imported from a C program, allowing an Ada file to operate on an
+existing C file.
+
+@node The GNAT Library
+@chapter The GNAT Library
+
+@noindent
+The GNAT library contains a number of general and special purpose packages.
+It represents functionality that the GNAT developers have found useful, and
+which is made available to GNAT users. The packages described here are fully
+supported, and upwards compatibility will be maintained in future releases,
+so you can use these facilities with the confidence that the same functionality
+will be available in future releases.
+
+The chapter here simply gives a brief summary of the facilities available.
+The full documentation is found in the spec file for the package. The full
+sources of these library packages, including both spec and body, are provided
+with all GNAT releases. For example, to find out the full specifications of
+the SPITBOL pattern matching capability, including a full tutorial and
+extensive examples, look in the @file{g-spipat.ads} file in the library.
+
+For each entry here, the package name (as it would appear in a @code{with}
+clause) is given, followed by the name of the corresponding spec file in
+parentheses. The packages are children in four hierarchies, @code{Ada},
+@code{Interfaces}, @code{System}, and @code{GNAT}, the latter being a
+GNAT-specific hierarchy.
+
+Note that an application program should only use packages in one of these
+four hierarchies if the package is defined in the Ada Reference Manual,
+or is listed in this section of the GNAT Programmers Reference Manual.
+All other units should be considered internal implementation units and
+should not be directly @code{with}'ed by application code. The use of
+a @code{with} statement that references one of these internal implementation
+units makes an application potentially dependent on changes in versions
+of GNAT, and will generate a warning message.
+
+@menu
+* Ada.Characters.Latin_9 (a-chlat9.ads)::
+* Ada.Characters.Wide_Latin_1 (a-cwila1.ads)::
+* Ada.Characters.Wide_Latin_9 (a-cwila9.ads)::
+* Ada.Characters.Wide_Wide_Latin_1 (a-chzla1.ads)::
+* Ada.Characters.Wide_Wide_Latin_9 (a-chzla9.ads)::
+* Ada.Containers.Formal_Doubly_Linked_Lists (a-cfdlli.ads)::
+* Ada.Containers.Formal_Hashed_Maps (a-cfhama.ads)::
+* Ada.Containers.Formal_Hashed_Sets (a-cfhase.ads)::
+* Ada.Containers.Formal_Ordered_Maps (a-cforma.ads)::
+* Ada.Containers.Formal_Ordered_Sets (a-cforse.ads)::
+* Ada.Containers.Formal_Vectors (a-cofove.ads)::
+* Ada.Command_Line.Environment (a-colien.ads)::
+* Ada.Command_Line.Remove (a-colire.ads)::
+* Ada.Command_Line.Response_File (a-clrefi.ads)::
+* Ada.Direct_IO.C_Streams (a-diocst.ads)::
+* Ada.Exceptions.Is_Null_Occurrence (a-einuoc.ads)::
+* Ada.Exceptions.Last_Chance_Handler (a-elchha.ads)::
+* Ada.Exceptions.Traceback (a-exctra.ads)::
+* Ada.Sequential_IO.C_Streams (a-siocst.ads)::
+* Ada.Streams.Stream_IO.C_Streams (a-ssicst.ads)::
+* Ada.Strings.Unbounded.Text_IO (a-suteio.ads)::
+* Ada.Strings.Wide_Unbounded.Wide_Text_IO (a-swuwti.ads)::
+* Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO (a-szuzti.ads)::
+* Ada.Text_IO.C_Streams (a-tiocst.ads)::
+* Ada.Text_IO.Reset_Standard_Files (a-tirsfi.ads)::
+* Ada.Wide_Characters.Unicode (a-wichun.ads)::
+* Ada.Wide_Text_IO.C_Streams (a-wtcstr.ads)::
+* Ada.Wide_Text_IO.Reset_Standard_Files (a-wrstfi.ads)::
+* Ada.Wide_Wide_Characters.Unicode (a-zchuni.ads)::
+* Ada.Wide_Wide_Text_IO.C_Streams (a-ztcstr.ads)::
+* Ada.Wide_Wide_Text_IO.Reset_Standard_Files (a-zrstfi.ads)::
+* GNAT.Altivec (g-altive.ads)::
+* GNAT.Altivec.Conversions (g-altcon.ads)::
+* GNAT.Altivec.Vector_Operations (g-alveop.ads)::
+* GNAT.Altivec.Vector_Types (g-alvety.ads)::
+* GNAT.Altivec.Vector_Views (g-alvevi.ads)::
+* GNAT.Array_Split (g-arrspl.ads)::
+* GNAT.AWK (g-awk.ads)::
+* GNAT.Bounded_Buffers (g-boubuf.ads)::
+* GNAT.Bounded_Mailboxes (g-boumai.ads)::
+* GNAT.Bubble_Sort (g-bubsor.ads)::
+* GNAT.Bubble_Sort_A (g-busora.ads)::
+* GNAT.Bubble_Sort_G (g-busorg.ads)::
+* GNAT.Byte_Order_Mark (g-byorma.ads)::
+* GNAT.Byte_Swapping (g-bytswa.ads)::
+* GNAT.Calendar (g-calend.ads)::
+* GNAT.Calendar.Time_IO (g-catiio.ads)::
+* GNAT.Case_Util (g-casuti.ads)::
+* GNAT.CGI (g-cgi.ads)::
+* GNAT.CGI.Cookie (g-cgicoo.ads)::
+* GNAT.CGI.Debug (g-cgideb.ads)::
+* GNAT.Command_Line (g-comlin.ads)::
+* GNAT.Compiler_Version (g-comver.ads)::
+* GNAT.Ctrl_C (g-ctrl_c.ads)::
+* GNAT.CRC32 (g-crc32.ads)::
+* GNAT.Current_Exception (g-curexc.ads)::
+* GNAT.Debug_Pools (g-debpoo.ads)::
+* GNAT.Debug_Utilities (g-debuti.ads)::
+* GNAT.Decode_String (g-decstr.ads)::
+* GNAT.Decode_UTF8_String (g-deutst.ads)::
+* GNAT.Directory_Operations (g-dirope.ads)::
+* GNAT.Directory_Operations.Iteration (g-diopit.ads)::
+* GNAT.Dynamic_HTables (g-dynhta.ads)::
+* GNAT.Dynamic_Tables (g-dyntab.ads)::
+* GNAT.Encode_String (g-encstr.ads)::
+* GNAT.Encode_UTF8_String (g-enutst.ads)::
+* GNAT.Exception_Actions (g-excact.ads)::
+* GNAT.Exception_Traces (g-exctra.ads)::
+* GNAT.Exceptions (g-except.ads)::
+* GNAT.Expect (g-expect.ads)::
+* GNAT.Expect.TTY (g-exptty.ads)::
+* GNAT.Float_Control (g-flocon.ads)::
+* GNAT.Heap_Sort (g-heasor.ads)::
+* GNAT.Heap_Sort_A (g-hesora.ads)::
+* GNAT.Heap_Sort_G (g-hesorg.ads)::
+* GNAT.HTable (g-htable.ads)::
+* GNAT.IO (g-io.ads)::
+* GNAT.IO_Aux (g-io_aux.ads)::
+* GNAT.Lock_Files (g-locfil.ads)::
+* GNAT.MBBS_Discrete_Random (g-mbdira.ads)::
+* GNAT.MBBS_Float_Random (g-mbflra.ads)::
+* GNAT.MD5 (g-md5.ads)::
+* GNAT.Memory_Dump (g-memdum.ads)::
+* GNAT.Most_Recent_Exception (g-moreex.ads)::
+* GNAT.OS_Lib (g-os_lib.ads)::
+* GNAT.Perfect_Hash_Generators (g-pehage.ads)::
+* GNAT.Random_Numbers (g-rannum.ads)::
+* GNAT.Regexp (g-regexp.ads)::
+* GNAT.Registry (g-regist.ads)::
+* GNAT.Regpat (g-regpat.ads)::
+* GNAT.Secondary_Stack_Info (g-sestin.ads)::
+* GNAT.Semaphores (g-semaph.ads)::
+* GNAT.Serial_Communications (g-sercom.ads)::
+* GNAT.SHA1 (g-sha1.ads)::
+* GNAT.SHA224 (g-sha224.ads)::
+* GNAT.SHA256 (g-sha256.ads)::
+* GNAT.SHA384 (g-sha384.ads)::
+* GNAT.SHA512 (g-sha512.ads)::
+* GNAT.Signals (g-signal.ads)::
+* GNAT.Sockets (g-socket.ads)::
+* GNAT.Source_Info (g-souinf.ads)::
+* GNAT.Spelling_Checker (g-speche.ads)::
+* GNAT.Spelling_Checker_Generic (g-spchge.ads)::
+* GNAT.Spitbol.Patterns (g-spipat.ads)::
+* GNAT.Spitbol (g-spitbo.ads)::
+* GNAT.Spitbol.Table_Boolean (g-sptabo.ads)::
+* GNAT.Spitbol.Table_Integer (g-sptain.ads)::
+* GNAT.Spitbol.Table_VString (g-sptavs.ads)::
+* GNAT.SSE (g-sse.ads)::
+* GNAT.SSE.Vector_Types (g-ssvety.ads)::
+* GNAT.Strings (g-string.ads)::
+* GNAT.String_Split (g-strspl.ads)::
+* GNAT.Table (g-table.ads)::
+* GNAT.Task_Lock (g-tasloc.ads)::
+* GNAT.Threads (g-thread.ads)::
+* GNAT.Time_Stamp (g-timsta.ads)::
+* GNAT.Traceback (g-traceb.ads)::
+* GNAT.Traceback.Symbolic (g-trasym.ads)::
+* GNAT.UTF_32 (g-utf_32.ads)::
+* GNAT.UTF_32_Spelling_Checker (g-u3spch.ads)::
+* GNAT.Wide_Spelling_Checker (g-wispch.ads)::
+* GNAT.Wide_String_Split (g-wistsp.ads)::
+* GNAT.Wide_Wide_Spelling_Checker (g-zspche.ads)::
+* GNAT.Wide_Wide_String_Split (g-zistsp.ads)::
+* Interfaces.C.Extensions (i-cexten.ads)::
+* Interfaces.C.Streams (i-cstrea.ads)::
+* Interfaces.CPP (i-cpp.ads)::
+* Interfaces.Packed_Decimal (i-pacdec.ads)::
+* Interfaces.VxWorks (i-vxwork.ads)::
+* Interfaces.VxWorks.IO (i-vxwoio.ads)::
+* System.Address_Image (s-addima.ads)::
+* System.Assertions (s-assert.ads)::
+* System.Memory (s-memory.ads)::
+* System.Multiprocessors (s-multip.ads)::
+* System.Multiprocessors.Dispatching_Domains (s-mudido.ads)::
+* System.Partition_Interface (s-parint.ads)::
+* System.Pool_Global (s-pooglo.ads)::
+* System.Pool_Local (s-pooloc.ads)::
+* System.Restrictions (s-restri.ads)::
+* System.Rident (s-rident.ads)::
+* System.Strings.Stream_Ops (s-ststop.ads)::
+* System.Task_Info (s-tasinf.ads)::
+* System.Wch_Cnv (s-wchcnv.ads)::
+* System.Wch_Con (s-wchcon.ads)::
+@end menu
+
+@node Ada.Characters.Latin_9 (a-chlat9.ads)
+@section @code{Ada.Characters.Latin_9} (@file{a-chlat9.ads})
+@cindex @code{Ada.Characters.Latin_9} (@file{a-chlat9.ads})
+@cindex Latin_9 constants for Character
+
+@noindent
+This child of @code{Ada.Characters}
+provides a set of definitions corresponding to those in the
+RM-defined package @code{Ada.Characters.Latin_1} but with the
+few modifications required for @code{Latin-9}
+The provision of such a package
+is specifically authorized by the Ada Reference Manual
+(RM A.3.3(27)).
+
+@node Ada.Characters.Wide_Latin_1 (a-cwila1.ads)
+@section @code{Ada.Characters.Wide_Latin_1} (@file{a-cwila1.ads})
+@cindex @code{Ada.Characters.Wide_Latin_1} (@file{a-cwila1.ads})
+@cindex Latin_1 constants for Wide_Character
+
+@noindent
+This child of @code{Ada.Characters}
+provides a set of definitions corresponding to those in the
+RM-defined package @code{Ada.Characters.Latin_1} but with the
+types of the constants being @code{Wide_Character}
+instead of @code{Character}. The provision of such a package
+is specifically authorized by the Ada Reference Manual
+(RM A.3.3(27)).
+
+@node Ada.Characters.Wide_Latin_9 (a-cwila9.ads)
+@section @code{Ada.Characters.Wide_Latin_9} (@file{a-cwila1.ads})
+@cindex @code{Ada.Characters.Wide_Latin_9} (@file{a-cwila1.ads})
+@cindex Latin_9 constants for Wide_Character
+
+@noindent
+This child of @code{Ada.Characters}
+provides a set of definitions corresponding to those in the
+GNAT defined package @code{Ada.Characters.Latin_9} but with the
+types of the constants being @code{Wide_Character}
+instead of @code{Character}. The provision of such a package
+is specifically authorized by the Ada Reference Manual
+(RM A.3.3(27)).
+
+@node Ada.Characters.Wide_Wide_Latin_1 (a-chzla1.ads)
+@section @code{Ada.Characters.Wide_Wide_Latin_1} (@file{a-chzla1.ads})
+@cindex @code{Ada.Characters.Wide_Wide_Latin_1} (@file{a-chzla1.ads})
+@cindex Latin_1 constants for Wide_Wide_Character
+
+@noindent
+This child of @code{Ada.Characters}
+provides a set of definitions corresponding to those in the
+RM-defined package @code{Ada.Characters.Latin_1} but with the
+types of the constants being @code{Wide_Wide_Character}
+instead of @code{Character}. The provision of such a package
+is specifically authorized by the Ada Reference Manual
+(RM A.3.3(27)).
+
+@node Ada.Characters.Wide_Wide_Latin_9 (a-chzla9.ads)
+@section @code{Ada.Characters.Wide_Wide_Latin_9} (@file{a-chzla9.ads})
+@cindex @code{Ada.Characters.Wide_Wide_Latin_9} (@file{a-chzla9.ads})
+@cindex Latin_9 constants for Wide_Wide_Character
+
+@noindent
+This child of @code{Ada.Characters}
+provides a set of definitions corresponding to those in the
+GNAT defined package @code{Ada.Characters.Latin_9} but with the
+types of the constants being @code{Wide_Wide_Character}
+instead of @code{Character}. The provision of such a package
+is specifically authorized by the Ada Reference Manual
+(RM A.3.3(27)).
+
+@node Ada.Containers.Formal_Doubly_Linked_Lists (a-cfdlli.ads)
+@section @code{Ada.Containers.Formal_Doubly_Linked_Lists} (@file{a-cfdlli.ads})
+@cindex @code{Ada.Containers.Formal_Doubly_Linked_Lists} (@file{a-cfdlli.ads})
+@cindex Formal container for doubly linked lists
+
+@noindent
+This child of @code{Ada.Containers} defines a modified version of the
+Ada 2005 container for doubly linked lists, meant to facilitate formal
+verification of code using such containers. The specification of this
+unit is compatible with SPARK 2014.
+
+Note that although this container was designed with formal verification
+in mind, it may well be generally useful in that it is a simplified more
+efficient version than the one defined in the standard. In particular it
+does not have the complex overhead required to detect cursor tampering.
+
+@node Ada.Containers.Formal_Hashed_Maps (a-cfhama.ads)
+@section @code{Ada.Containers.Formal_Hashed_Maps} (@file{a-cfhama.ads})
+@cindex @code{Ada.Containers.Formal_Hashed_Maps} (@file{a-cfhama.ads})
+@cindex Formal container for hashed maps
+
+@noindent
+This child of @code{Ada.Containers} defines a modified version of the
+Ada 2005 container for hashed maps, meant to facilitate formal
+verification of code using such containers. The specification of this
+unit is compatible with SPARK 2014.
+
+Note that although this container was designed with formal verification
+in mind, it may well be generally useful in that it is a simplified more
+efficient version than the one defined in the standard. In particular it
+does not have the complex overhead required to detect cursor tampering.
+
+@node Ada.Containers.Formal_Hashed_Sets (a-cfhase.ads)
+@section @code{Ada.Containers.Formal_Hashed_Sets} (@file{a-cfhase.ads})
+@cindex @code{Ada.Containers.Formal_Hashed_Sets} (@file{a-cfhase.ads})
+@cindex Formal container for hashed sets
+
+@noindent
+This child of @code{Ada.Containers} defines a modified version of the
+Ada 2005 container for hashed sets, meant to facilitate formal
+verification of code using such containers. The specification of this
+unit is compatible with SPARK 2014.
+
+Note that although this container was designed with formal verification
+in mind, it may well be generally useful in that it is a simplified more
+efficient version than the one defined in the standard. In particular it
+does not have the complex overhead required to detect cursor tampering.
+
+@node Ada.Containers.Formal_Ordered_Maps (a-cforma.ads)
+@section @code{Ada.Containers.Formal_Ordered_Maps} (@file{a-cforma.ads})
+@cindex @code{Ada.Containers.Formal_Ordered_Maps} (@file{a-cforma.ads})
+@cindex Formal container for ordered maps
+
+@noindent
+This child of @code{Ada.Containers} defines a modified version of the
+Ada 2005 container for ordered maps, meant to facilitate formal
+verification of code using such containers. The specification of this
+unit is compatible with SPARK 2014.
+
+Note that although this container was designed with formal verification
+in mind, it may well be generally useful in that it is a simplified more
+efficient version than the one defined in the standard. In particular it
+does not have the complex overhead required to detect cursor tampering.
+
+@node Ada.Containers.Formal_Ordered_Sets (a-cforse.ads)
+@section @code{Ada.Containers.Formal_Ordered_Sets} (@file{a-cforse.ads})
+@cindex @code{Ada.Containers.Formal_Ordered_Sets} (@file{a-cforse.ads})
+@cindex Formal container for ordered sets
+
+@noindent
+This child of @code{Ada.Containers} defines a modified version of the
+Ada 2005 container for ordered sets, meant to facilitate formal
+verification of code using such containers. The specification of this
+unit is compatible with SPARK 2014.
+
+Note that although this container was designed with formal verification
+in mind, it may well be generally useful in that it is a simplified more
+efficient version than the one defined in the standard. In particular it
+does not have the complex overhead required to detect cursor tampering.
+
+@node Ada.Containers.Formal_Vectors (a-cofove.ads)
+@section @code{Ada.Containers.Formal_Vectors} (@file{a-cofove.ads})
+@cindex @code{Ada.Containers.Formal_Vectors} (@file{a-cofove.ads})
+@cindex Formal container for vectors
+
+@noindent
+This child of @code{Ada.Containers} defines a modified version of the
+Ada 2005 container for vectors, meant to facilitate formal
+verification of code using such containers. The specification of this
+unit is compatible with SPARK 2014.
+
+Note that although this container was designed with formal verification
+in mind, it may well be generally useful in that it is a simplified more
+efficient version than the one defined in the standard. In particular it
+does not have the complex overhead required to detect cursor tampering.
+
+@node Ada.Command_Line.Environment (a-colien.ads)
+@section @code{Ada.Command_Line.Environment} (@file{a-colien.ads})
+@cindex @code{Ada.Command_Line.Environment} (@file{a-colien.ads})
+@cindex Environment entries
+
+@noindent
+This child of @code{Ada.Command_Line}
+provides a mechanism for obtaining environment values on systems
+where this concept makes sense.
+
+@node Ada.Command_Line.Remove (a-colire.ads)
+@section @code{Ada.Command_Line.Remove} (@file{a-colire.ads})
+@cindex @code{Ada.Command_Line.Remove} (@file{a-colire.ads})
+@cindex Removing command line arguments
+@cindex Command line, argument removal
+
+@noindent
+This child of @code{Ada.Command_Line}
+provides a mechanism for logically removing
+arguments from the argument list. Once removed, an argument is not visible
+to further calls on the subprograms in @code{Ada.Command_Line} will not
+see the removed argument.
+
+@node Ada.Command_Line.Response_File (a-clrefi.ads)
+@section @code{Ada.Command_Line.Response_File} (@file{a-clrefi.ads})
+@cindex @code{Ada.Command_Line.Response_File} (@file{a-clrefi.ads})
+@cindex Response file for command line
+@cindex Command line, response file
+@cindex Command line, handling long command lines
+
+@noindent
+This child of @code{Ada.Command_Line} provides a mechanism facilities for
+getting command line arguments from a text file, called a "response file".
+Using a response file allow passing a set of arguments to an executable longer
+than the maximum allowed by the system on the command line.
+
+@node Ada.Direct_IO.C_Streams (a-diocst.ads)
+@section @code{Ada.Direct_IO.C_Streams} (@file{a-diocst.ads})
+@cindex @code{Ada.Direct_IO.C_Streams} (@file{a-diocst.ads})
+@cindex C Streams, Interfacing with Direct_IO
+
+@noindent
+This package provides subprograms that allow interfacing between
+C streams and @code{Direct_IO}. The stream identifier can be
+extracted from a file opened on the Ada side, and an Ada file
+can be constructed from a stream opened on the C side.
+
+@node Ada.Exceptions.Is_Null_Occurrence (a-einuoc.ads)
+@section @code{Ada.Exceptions.Is_Null_Occurrence} (@file{a-einuoc.ads})
+@cindex @code{Ada.Exceptions.Is_Null_Occurrence} (@file{a-einuoc.ads})
+@cindex Null_Occurrence, testing for
+
+@noindent
+This child subprogram provides a way of testing for the null
+exception occurrence (@code{Null_Occurrence}) without raising
+an exception.
+
+@node Ada.Exceptions.Last_Chance_Handler (a-elchha.ads)
+@section @code{Ada.Exceptions.Last_Chance_Handler} (@file{a-elchha.ads})
+@cindex @code{Ada.Exceptions.Last_Chance_Handler} (@file{a-elchha.ads})
+@cindex Null_Occurrence, testing for
+
+@noindent
+This child subprogram is used for handling otherwise unhandled
+exceptions (hence the name last chance), and perform clean ups before
+terminating the program. Note that this subprogram never returns.
+
+@node Ada.Exceptions.Traceback (a-exctra.ads)
+@section @code{Ada.Exceptions.Traceback} (@file{a-exctra.ads})
+@cindex @code{Ada.Exceptions.Traceback} (@file{a-exctra.ads})
+@cindex Traceback for Exception Occurrence
+
+@noindent
+This child package provides the subprogram (@code{Tracebacks}) to
+give a traceback array of addresses based on an exception
+occurrence.
+
+@node Ada.Sequential_IO.C_Streams (a-siocst.ads)
+@section @code{Ada.Sequential_IO.C_Streams} (@file{a-siocst.ads})
+@cindex @code{Ada.Sequential_IO.C_Streams} (@file{a-siocst.ads})
+@cindex C Streams, Interfacing with Sequential_IO
+
+@noindent
+This package provides subprograms that allow interfacing between
+C streams and @code{Sequential_IO}. The stream identifier can be
+extracted from a file opened on the Ada side, and an Ada file
+can be constructed from a stream opened on the C side.
+
+@node Ada.Streams.Stream_IO.C_Streams (a-ssicst.ads)
+@section @code{Ada.Streams.Stream_IO.C_Streams} (@file{a-ssicst.ads})
+@cindex @code{Ada.Streams.Stream_IO.C_Streams} (@file{a-ssicst.ads})
+@cindex C Streams, Interfacing with Stream_IO
+
+@noindent
+This package provides subprograms that allow interfacing between
+C streams and @code{Stream_IO}. The stream identifier can be
+extracted from a file opened on the Ada side, and an Ada file
+can be constructed from a stream opened on the C side.
+
+@node Ada.Strings.Unbounded.Text_IO (a-suteio.ads)
+@section @code{Ada.Strings.Unbounded.Text_IO} (@file{a-suteio.ads})
+@cindex @code{Ada.Strings.Unbounded.Text_IO} (@file{a-suteio.ads})
+@cindex @code{Unbounded_String}, IO support
+@cindex @code{Text_IO}, extensions for unbounded strings
+
+@noindent
+This package provides subprograms for Text_IO for unbounded
+strings, avoiding the necessity for an intermediate operation
+with ordinary strings.
+
+@node Ada.Strings.Wide_Unbounded.Wide_Text_IO (a-swuwti.ads)
+@section @code{Ada.Strings.Wide_Unbounded.Wide_Text_IO} (@file{a-swuwti.ads})
+@cindex @code{Ada.Strings.Wide_Unbounded.Wide_Text_IO} (@file{a-swuwti.ads})
+@cindex @code{Unbounded_Wide_String}, IO support
+@cindex @code{Text_IO}, extensions for unbounded wide strings
+
+@noindent
+This package provides subprograms for Text_IO for unbounded
+wide strings, avoiding the necessity for an intermediate operation
+with ordinary wide strings.
+
+@node Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO (a-szuzti.ads)
+@section @code{Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO} (@file{a-szuzti.ads})
+@cindex @code{Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO} (@file{a-szuzti.ads})
+@cindex @code{Unbounded_Wide_Wide_String}, IO support
+@cindex @code{Text_IO}, extensions for unbounded wide wide strings
+
+@noindent
+This package provides subprograms for Text_IO for unbounded
+wide wide strings, avoiding the necessity for an intermediate operation
+with ordinary wide wide strings.
+
+@node Ada.Text_IO.C_Streams (a-tiocst.ads)
+@section @code{Ada.Text_IO.C_Streams} (@file{a-tiocst.ads})
+@cindex @code{Ada.Text_IO.C_Streams} (@file{a-tiocst.ads})
+@cindex C Streams, Interfacing with @code{Text_IO}
+
+@noindent
+This package provides subprograms that allow interfacing between
+C streams and @code{Text_IO}. The stream identifier can be
+extracted from a file opened on the Ada side, and an Ada file
+can be constructed from a stream opened on the C side.
+
+@node Ada.Text_IO.Reset_Standard_Files (a-tirsfi.ads)
+@section @code{Ada.Text_IO.Reset_Standard_Files} (@file{a-tirsfi.ads})
+@cindex @code{Ada.Text_IO.Reset_Standard_Files} (@file{a-tirsfi.ads})
+@cindex @code{Text_IO} resetting standard files
+
+@noindent
+This procedure is used to reset the status of the standard files used
+by Ada.Text_IO. This is useful in a situation (such as a restart in an
+embedded application) where the status of the files may change during
+execution (for example a standard input file may be redefined to be
+interactive).
+
+@node Ada.Wide_Characters.Unicode (a-wichun.ads)
+@section @code{Ada.Wide_Characters.Unicode} (@file{a-wichun.ads})
+@cindex @code{Ada.Wide_Characters.Unicode} (@file{a-wichun.ads})
+@cindex Unicode categorization, Wide_Character
+
+@noindent
+This package provides subprograms that allow categorization of
+Wide_Character values according to Unicode categories.
+
+@node Ada.Wide_Text_IO.C_Streams (a-wtcstr.ads)
+@section @code{Ada.Wide_Text_IO.C_Streams} (@file{a-wtcstr.ads})
+@cindex @code{Ada.Wide_Text_IO.C_Streams} (@file{a-wtcstr.ads})
+@cindex C Streams, Interfacing with @code{Wide_Text_IO}
+
+@noindent
+This package provides subprograms that allow interfacing between
+C streams and @code{Wide_Text_IO}. The stream identifier can be
+extracted from a file opened on the Ada side, and an Ada file
+can be constructed from a stream opened on the C side.
+
+@node Ada.Wide_Text_IO.Reset_Standard_Files (a-wrstfi.ads)
+@section @code{Ada.Wide_Text_IO.Reset_Standard_Files} (@file{a-wrstfi.ads})
+@cindex @code{Ada.Wide_Text_IO.Reset_Standard_Files} (@file{a-wrstfi.ads})
+@cindex @code{Wide_Text_IO} resetting standard files
+
+@noindent
+This procedure is used to reset the status of the standard files used
+by Ada.Wide_Text_IO. This is useful in a situation (such as a restart in an
+embedded application) where the status of the files may change during
+execution (for example a standard input file may be redefined to be
+interactive).
+
+@node Ada.Wide_Wide_Characters.Unicode (a-zchuni.ads)
+@section @code{Ada.Wide_Wide_Characters.Unicode} (@file{a-zchuni.ads})
+@cindex @code{Ada.Wide_Wide_Characters.Unicode} (@file{a-zchuni.ads})
+@cindex Unicode categorization, Wide_Wide_Character
+
+@noindent
+This package provides subprograms that allow categorization of
+Wide_Wide_Character values according to Unicode categories.
+
+@node Ada.Wide_Wide_Text_IO.C_Streams (a-ztcstr.ads)
+@section @code{Ada.Wide_Wide_Text_IO.C_Streams} (@file{a-ztcstr.ads})
+@cindex @code{Ada.Wide_Wide_Text_IO.C_Streams} (@file{a-ztcstr.ads})
+@cindex C Streams, Interfacing with @code{Wide_Wide_Text_IO}
+
+@noindent
+This package provides subprograms that allow interfacing between
+C streams and @code{Wide_Wide_Text_IO}. The stream identifier can be
+extracted from a file opened on the Ada side, and an Ada file
+can be constructed from a stream opened on the C side.
+
+@node Ada.Wide_Wide_Text_IO.Reset_Standard_Files (a-zrstfi.ads)
+@section @code{Ada.Wide_Wide_Text_IO.Reset_Standard_Files} (@file{a-zrstfi.ads})
+@cindex @code{Ada.Wide_Wide_Text_IO.Reset_Standard_Files} (@file{a-zrstfi.ads})
+@cindex @code{Wide_Wide_Text_IO} resetting standard files
+
+@noindent
+This procedure is used to reset the status of the standard files used
+by Ada.Wide_Wide_Text_IO. This is useful in a situation (such as a
+restart in an embedded application) where the status of the files may
+change during execution (for example a standard input file may be
+redefined to be interactive).
+
+@node GNAT.Altivec (g-altive.ads)
+@section @code{GNAT.Altivec} (@file{g-altive.ads})
+@cindex @code{GNAT.Altivec} (@file{g-altive.ads})
+@cindex AltiVec
+
+@noindent
+This is the root package of the GNAT AltiVec binding. It provides
+definitions of constants and types common to all the versions of the
+binding.
+
+@node GNAT.Altivec.Conversions (g-altcon.ads)
+@section @code{GNAT.Altivec.Conversions} (@file{g-altcon.ads})
+@cindex @code{GNAT.Altivec.Conversions} (@file{g-altcon.ads})
+@cindex AltiVec
+
+@noindent
+This package provides the Vector/View conversion routines.
+
+@node GNAT.Altivec.Vector_Operations (g-alveop.ads)
+@section @code{GNAT.Altivec.Vector_Operations} (@file{g-alveop.ads})
+@cindex @code{GNAT.Altivec.Vector_Operations} (@file{g-alveop.ads})
+@cindex AltiVec
+
+@noindent
+This package exposes the Ada interface to the AltiVec operations on
+vector objects. A soft emulation is included by default in the GNAT
+library. The hard binding is provided as a separate package. This unit
+is common to both bindings.
+
+@node GNAT.Altivec.Vector_Types (g-alvety.ads)
+@section @code{GNAT.Altivec.Vector_Types} (@file{g-alvety.ads})
+@cindex @code{GNAT.Altivec.Vector_Types} (@file{g-alvety.ads})
+@cindex AltiVec
+
+@noindent
+This package exposes the various vector types part of the Ada binding
+to AltiVec facilities.
+
+@node GNAT.Altivec.Vector_Views (g-alvevi.ads)
+@section @code{GNAT.Altivec.Vector_Views} (@file{g-alvevi.ads})
+@cindex @code{GNAT.Altivec.Vector_Views} (@file{g-alvevi.ads})
+@cindex AltiVec
+
+@noindent
+This package provides public 'View' data types from/to which private
+vector representations can be converted via
+GNAT.Altivec.Conversions. This allows convenient access to individual
+vector elements and provides a simple way to initialize vector
+objects.
+
+@node GNAT.Array_Split (g-arrspl.ads)
+@section @code{GNAT.Array_Split} (@file{g-arrspl.ads})
+@cindex @code{GNAT.Array_Split} (@file{g-arrspl.ads})
+@cindex Array splitter
+
+@noindent
+Useful array-manipulation routines: given a set of separators, split
+an array wherever the separators appear, and provide direct access
+to the resulting slices.
+
+@node GNAT.AWK (g-awk.ads)
+@section @code{GNAT.AWK} (@file{g-awk.ads})
+@cindex @code{GNAT.AWK} (@file{g-awk.ads})
+@cindex Parsing
+@cindex AWK
+
+@noindent
+Provides AWK-like parsing functions, with an easy interface for parsing one
+or more files containing formatted data. The file is viewed as a database
+where each record is a line and a field is a data element in this line.
+
+@node GNAT.Bounded_Buffers (g-boubuf.ads)
+@section @code{GNAT.Bounded_Buffers} (@file{g-boubuf.ads})
+@cindex @code{GNAT.Bounded_Buffers} (@file{g-boubuf.ads})
+@cindex Parsing
+@cindex Bounded Buffers
+
+@noindent
+Provides a concurrent generic bounded buffer abstraction. Instances are
+useful directly or as parts of the implementations of other abstractions,
+such as mailboxes.
+
+@node GNAT.Bounded_Mailboxes (g-boumai.ads)
+@section @code{GNAT.Bounded_Mailboxes} (@file{g-boumai.ads})
+@cindex @code{GNAT.Bounded_Mailboxes} (@file{g-boumai.ads})
+@cindex Parsing
+@cindex Mailboxes
+
+@noindent
+Provides a thread-safe asynchronous intertask mailbox communication facility.
+
+@node GNAT.Bubble_Sort (g-bubsor.ads)
+@section @code{GNAT.Bubble_Sort} (@file{g-bubsor.ads})
+@cindex @code{GNAT.Bubble_Sort} (@file{g-bubsor.ads})
+@cindex Sorting
+@cindex Bubble sort
+
+@noindent
+Provides a general implementation of bubble sort usable for sorting arbitrary
+data items. Exchange and comparison procedures are provided by passing
+access-to-procedure values.
+
+@node GNAT.Bubble_Sort_A (g-busora.ads)
+@section @code{GNAT.Bubble_Sort_A} (@file{g-busora.ads})
+@cindex @code{GNAT.Bubble_Sort_A} (@file{g-busora.ads})
+@cindex Sorting
+@cindex Bubble sort
+
+@noindent
+Provides a general implementation of bubble sort usable for sorting arbitrary
+data items. Move and comparison procedures are provided by passing
+access-to-procedure values. This is an older version, retained for
+compatibility. Usually @code{GNAT.Bubble_Sort} will be preferable.
+
+@node GNAT.Bubble_Sort_G (g-busorg.ads)
+@section @code{GNAT.Bubble_Sort_G} (@file{g-busorg.ads})
+@cindex @code{GNAT.Bubble_Sort_G} (@file{g-busorg.ads})
+@cindex Sorting
+@cindex Bubble sort
+
+@noindent
+Similar to @code{Bubble_Sort_A} except that the move and sorting procedures
+are provided as generic parameters, this improves efficiency, especially
+if the procedures can be inlined, at the expense of duplicating code for
+multiple instantiations.
+
+@node GNAT.Byte_Order_Mark (g-byorma.ads)
+@section @code{GNAT.Byte_Order_Mark} (@file{g-byorma.ads})
+@cindex @code{GNAT.Byte_Order_Mark} (@file{g-byorma.ads})
+@cindex UTF-8 representation
+@cindex Wide characte representations
+
+@noindent
+Provides a routine which given a string, reads the start of the string to
+see whether it is one of the standard byte order marks (BOM's) which signal
+the encoding of the string. The routine includes detection of special XML
+sequences for various UCS input formats.
+
+@node GNAT.Byte_Swapping (g-bytswa.ads)
+@section @code{GNAT.Byte_Swapping} (@file{g-bytswa.ads})
+@cindex @code{GNAT.Byte_Swapping} (@file{g-bytswa.ads})
+@cindex Byte swapping
+@cindex Endianness
+
+@noindent
+General routines for swapping the bytes in 2-, 4-, and 8-byte quantities.
+Machine-specific implementations are available in some cases.
+
+@node GNAT.Calendar (g-calend.ads)
+@section @code{GNAT.Calendar} (@file{g-calend.ads})
+@cindex @code{GNAT.Calendar} (@file{g-calend.ads})
+@cindex @code{Calendar}
+
+@noindent
+Extends the facilities provided by @code{Ada.Calendar} to include handling
+of days of the week, an extended @code{Split} and @code{Time_Of} capability.
+Also provides conversion of @code{Ada.Calendar.Time} values to and from the
+C @code{timeval} format.
+
+@node GNAT.Calendar.Time_IO (g-catiio.ads)
+@section @code{GNAT.Calendar.Time_IO} (@file{g-catiio.ads})
+@cindex @code{Calendar}
+@cindex Time
+@cindex @code{GNAT.Calendar.Time_IO} (@file{g-catiio.ads})
+
+@node GNAT.CRC32 (g-crc32.ads)
+@section @code{GNAT.CRC32} (@file{g-crc32.ads})
+@cindex @code{GNAT.CRC32} (@file{g-crc32.ads})
+@cindex CRC32
+@cindex Cyclic Redundancy Check
+
+@noindent
+This package implements the CRC-32 algorithm. For a full description
+of this algorithm see
+``Computation of Cyclic Redundancy Checks via Table Look-Up'',
+@cite{Communications of the ACM}, Vol.@: 31 No.@: 8, pp.@: 1008-1013,
+Aug.@: 1988. Sarwate, D.V@.
+
+@node GNAT.Case_Util (g-casuti.ads)
+@section @code{GNAT.Case_Util} (@file{g-casuti.ads})
+@cindex @code{GNAT.Case_Util} (@file{g-casuti.ads})
+@cindex Casing utilities
+@cindex Character handling (@code{GNAT.Case_Util})
+
+@noindent
+A set of simple routines for handling upper and lower casing of strings
+without the overhead of the full casing tables
+in @code{Ada.Characters.Handling}.
+
+@node GNAT.CGI (g-cgi.ads)
+@section @code{GNAT.CGI} (@file{g-cgi.ads})
+@cindex @code{GNAT.CGI} (@file{g-cgi.ads})
+@cindex CGI (Common Gateway Interface)
+
+@noindent
+This is a package for interfacing a GNAT program with a Web server via the
+Common Gateway Interface (CGI)@. Basically this package parses the CGI
+parameters, which are a set of key/value pairs sent by the Web server. It
+builds a table whose index is the key and provides some services to deal
+with this table.
+
+@node GNAT.CGI.Cookie (g-cgicoo.ads)
+@section @code{GNAT.CGI.Cookie} (@file{g-cgicoo.ads})
+@cindex @code{GNAT.CGI.Cookie} (@file{g-cgicoo.ads})
+@cindex CGI (Common Gateway Interface) cookie support
+@cindex Cookie support in CGI
+
+@noindent
+This is a package to interface a GNAT program with a Web server via the
+Common Gateway Interface (CGI). It exports services to deal with Web
+cookies (piece of information kept in the Web client software).
+
+@node GNAT.CGI.Debug (g-cgideb.ads)
+@section @code{GNAT.CGI.Debug} (@file{g-cgideb.ads})
+@cindex @code{GNAT.CGI.Debug} (@file{g-cgideb.ads})
+@cindex CGI (Common Gateway Interface) debugging
+
+@noindent
+This is a package to help debugging CGI (Common Gateway Interface)
+programs written in Ada.
+
+@node GNAT.Command_Line (g-comlin.ads)
+@section @code{GNAT.Command_Line} (@file{g-comlin.ads})
+@cindex @code{GNAT.Command_Line} (@file{g-comlin.ads})
+@cindex Command line
+
+@noindent
+Provides a high level interface to @code{Ada.Command_Line} facilities,
+including the ability to scan for named switches with optional parameters
+and expand file names using wild card notations.
+
+@node GNAT.Compiler_Version (g-comver.ads)
+@section @code{GNAT.Compiler_Version} (@file{g-comver.ads})
+@cindex @code{GNAT.Compiler_Version} (@file{g-comver.ads})
+@cindex Compiler Version
+@cindex Version, of compiler
+
+@noindent
+Provides a routine for obtaining the version of the compiler used to
+compile the program. More accurately this is the version of the binder
+used to bind the program (this will normally be the same as the version
+of the compiler if a consistent tool set is used to compile all units
+of a partition).
+
+@node GNAT.Ctrl_C (g-ctrl_c.ads)
+@section @code{GNAT.Ctrl_C} (@file{g-ctrl_c.ads})
+@cindex @code{GNAT.Ctrl_C} (@file{g-ctrl_c.ads})
+@cindex Interrupt
+
+@noindent
+Provides a simple interface to handle Ctrl-C keyboard events.
+
+@node GNAT.Current_Exception (g-curexc.ads)
+@section @code{GNAT.Current_Exception} (@file{g-curexc.ads})
+@cindex @code{GNAT.Current_Exception} (@file{g-curexc.ads})
+@cindex Current exception
+@cindex Exception retrieval
+
+@noindent
+Provides access to information on the current exception that has been raised
+without the need for using the Ada 95 / Ada 2005 exception choice parameter
+specification syntax.
+This is particularly useful in simulating typical facilities for
+obtaining information about exceptions provided by Ada 83 compilers.
+
+@node GNAT.Debug_Pools (g-debpoo.ads)
+@section @code{GNAT.Debug_Pools} (@file{g-debpoo.ads})
+@cindex @code{GNAT.Debug_Pools} (@file{g-debpoo.ads})
+@cindex Debugging
+@cindex Debug pools
+@cindex Memory corruption debugging
+
+@noindent
+Provide a debugging storage pools that helps tracking memory corruption
+problems. @xref{The GNAT Debug Pool Facility,,, gnat_ugn,
+@value{EDITION} User's Guide}.
+
+@node GNAT.Debug_Utilities (g-debuti.ads)
+@section @code{GNAT.Debug_Utilities} (@file{g-debuti.ads})
+@cindex @code{GNAT.Debug_Utilities} (@file{g-debuti.ads})
+@cindex Debugging
+
+@noindent
+Provides a few useful utilities for debugging purposes, including conversion
+to and from string images of address values. Supports both C and Ada formats
+for hexadecimal literals.
+
+@node GNAT.Decode_String (g-decstr.ads)
+@section @code{GNAT.Decode_String} (@file{g-decstr.ads})
+@cindex @code{GNAT.Decode_String} (@file{g-decstr.ads})
+@cindex Decoding strings
+@cindex String decoding
+@cindex Wide character encoding
+@cindex UTF-8
+@cindex Unicode
+
+@noindent
+A generic package providing routines for decoding wide character and wide wide
+character strings encoded as sequences of 8-bit characters using a specified
+encoding method. Includes validation routines, and also routines for stepping
+to next or previous encoded character in an encoded string.
+Useful in conjunction with Unicode character coding. Note there is a
+preinstantiation for UTF-8. See next entry.
+
+@node GNAT.Decode_UTF8_String (g-deutst.ads)
+@section @code{GNAT.Decode_UTF8_String} (@file{g-deutst.ads})
+@cindex @code{GNAT.Decode_UTF8_String} (@file{g-deutst.ads})
+@cindex Decoding strings
+@cindex Decoding UTF-8 strings
+@cindex UTF-8 string decoding
+@cindex Wide character decoding
+@cindex UTF-8
+@cindex Unicode
+
+@noindent
+A preinstantiation of GNAT.Decode_Strings for UTF-8 encoding.
+
+@node GNAT.Directory_Operations (g-dirope.ads)
+@section @code{GNAT.Directory_Operations} (@file{g-dirope.ads})
+@cindex @code{GNAT.Directory_Operations} (@file{g-dirope.ads})
+@cindex Directory operations
+
+@noindent
+Provides a set of routines for manipulating directories, including changing
+the current directory, making new directories, and scanning the files in a
+directory.
+
+@node GNAT.Directory_Operations.Iteration (g-diopit.ads)
+@section @code{GNAT.Directory_Operations.Iteration} (@file{g-diopit.ads})
+@cindex @code{GNAT.Directory_Operations.Iteration} (@file{g-diopit.ads})
+@cindex Directory operations iteration
+
+@noindent
+A child unit of GNAT.Directory_Operations providing additional operations
+for iterating through directories.
+
+@node GNAT.Dynamic_HTables (g-dynhta.ads)
+@section @code{GNAT.Dynamic_HTables} (@file{g-dynhta.ads})
+@cindex @code{GNAT.Dynamic_HTables} (@file{g-dynhta.ads})
+@cindex Hash tables
+
+@noindent
+A generic implementation of hash tables that can be used to hash arbitrary
+data. Provided in two forms, a simple form with built in hash functions,
+and a more complex form in which the hash function is supplied.
+
+@noindent
+This package provides a facility similar to that of @code{GNAT.HTable},
+except that this package declares a type that can be used to define
+dynamic instances of the hash table, while an instantiation of
+@code{GNAT.HTable} creates a single instance of the hash table.
+
+@node GNAT.Dynamic_Tables (g-dyntab.ads)
+@section @code{GNAT.Dynamic_Tables} (@file{g-dyntab.ads})
+@cindex @code{GNAT.Dynamic_Tables} (@file{g-dyntab.ads})
+@cindex Table implementation
+@cindex Arrays, extendable
+
+@noindent
+A generic package providing a single dimension array abstraction where the
+length of the array can be dynamically modified.
+
+@noindent
+This package provides a facility similar to that of @code{GNAT.Table},
+except that this package declares a type that can be used to define
+dynamic instances of the table, while an instantiation of
+@code{GNAT.Table} creates a single instance of the table type.
+
+@node GNAT.Encode_String (g-encstr.ads)
+@section @code{GNAT.Encode_String} (@file{g-encstr.ads})
+@cindex @code{GNAT.Encode_String} (@file{g-encstr.ads})
+@cindex Encoding strings
+@cindex String encoding
+@cindex Wide character encoding
+@cindex UTF-8
+@cindex Unicode
+
+@noindent
+A generic package providing routines for encoding wide character and wide
+wide character strings as sequences of 8-bit characters using a specified
+encoding method. Useful in conjunction with Unicode character coding.
+Note there is a preinstantiation for UTF-8. See next entry.
+
+@node GNAT.Encode_UTF8_String (g-enutst.ads)
+@section @code{GNAT.Encode_UTF8_String} (@file{g-enutst.ads})
+@cindex @code{GNAT.Encode_UTF8_String} (@file{g-enutst.ads})
+@cindex Encoding strings
+@cindex Encoding UTF-8 strings
+@cindex UTF-8 string encoding
+@cindex Wide character encoding
+@cindex UTF-8
+@cindex Unicode
+
+@noindent
+A preinstantiation of GNAT.Encode_Strings for UTF-8 encoding.
+
+@node GNAT.Exception_Actions (g-excact.ads)
+@section @code{GNAT.Exception_Actions} (@file{g-excact.ads})
+@cindex @code{GNAT.Exception_Actions} (@file{g-excact.ads})
+@cindex Exception actions
+
+@noindent
+Provides callbacks when an exception is raised. Callbacks can be registered
+for specific exceptions, or when any exception is raised. This
+can be used for instance to force a core dump to ease debugging.
+
+@node GNAT.Exception_Traces (g-exctra.ads)
+@section @code{GNAT.Exception_Traces} (@file{g-exctra.ads})
+@cindex @code{GNAT.Exception_Traces} (@file{g-exctra.ads})
+@cindex Exception traces
+@cindex Debugging
+
+@noindent
+Provides an interface allowing to control automatic output upon exception
+occurrences.
+
+@node GNAT.Exceptions (g-except.ads)
+@section @code{GNAT.Exceptions} (@file{g-expect.ads})
+@cindex @code{GNAT.Exceptions} (@file{g-expect.ads})
+@cindex Exceptions, Pure
+@cindex Pure packages, exceptions
+
+@noindent
+Normally it is not possible to raise an exception with
+a message from a subprogram in a pure package, since the
+necessary types and subprograms are in @code{Ada.Exceptions}
+which is not a pure unit. @code{GNAT.Exceptions} provides a
+facility for getting around this limitation for a few
+predefined exceptions, and for example allow raising
+@code{Constraint_Error} with a message from a pure subprogram.
+
+@node GNAT.Expect (g-expect.ads)
+@section @code{GNAT.Expect} (@file{g-expect.ads})
+@cindex @code{GNAT.Expect} (@file{g-expect.ads})
+
+@noindent
+Provides a set of subprograms similar to what is available
+with the standard Tcl Expect tool.
+It allows you to easily spawn and communicate with an external process.
+You can send commands or inputs to the process, and compare the output
+with some expected regular expression. Currently @code{GNAT.Expect}
+is implemented on all native GNAT ports except for OpenVMS@.
+It is not implemented for cross ports, and in particular is not
+implemented for VxWorks or LynxOS@.
+
+@node GNAT.Expect.TTY (g-exptty.ads)
+@section @code{GNAT.Expect.TTY} (@file{g-exptty.ads})
+@cindex @code{GNAT.Expect.TTY} (@file{g-exptty.ads})
+
+@noindent
+As GNAT.Expect but using pseudo-terminal.
+Currently @code{GNAT.Expect.TTY} is implemented on all native GNAT
+ports except for OpenVMS@. It is not implemented for cross ports, and
+in particular is not implemented for VxWorks or LynxOS@.
+
+@node GNAT.Float_Control (g-flocon.ads)
+@section @code{GNAT.Float_Control} (@file{g-flocon.ads})
+@cindex @code{GNAT.Float_Control} (@file{g-flocon.ads})
+@cindex Floating-Point Processor
+
+@noindent
+Provides an interface for resetting the floating-point processor into the
+mode required for correct semantic operation in Ada. Some third party
+library calls may cause this mode to be modified, and the Reset procedure
+in this package can be used to reestablish the required mode.
+
+@node GNAT.Heap_Sort (g-heasor.ads)
+@section @code{GNAT.Heap_Sort} (@file{g-heasor.ads})
+@cindex @code{GNAT.Heap_Sort} (@file{g-heasor.ads})
+@cindex Sorting
+
+@noindent
+Provides a general implementation of heap sort usable for sorting arbitrary
+data items. Exchange and comparison procedures are provided by passing
+access-to-procedure values. The algorithm used is a modified heap sort
+that performs approximately N*log(N) comparisons in the worst case.
+
+@node GNAT.Heap_Sort_A (g-hesora.ads)
+@section @code{GNAT.Heap_Sort_A} (@file{g-hesora.ads})
+@cindex @code{GNAT.Heap_Sort_A} (@file{g-hesora.ads})
+@cindex Sorting
+
+@noindent
+Provides a general implementation of heap sort usable for sorting arbitrary
+data items. Move and comparison procedures are provided by passing
+access-to-procedure values. The algorithm used is a modified heap sort
+that performs approximately N*log(N) comparisons in the worst case.
+This differs from @code{GNAT.Heap_Sort} in having a less convenient
+interface, but may be slightly more efficient.
+
+@node GNAT.Heap_Sort_G (g-hesorg.ads)
+@section @code{GNAT.Heap_Sort_G} (@file{g-hesorg.ads})
+@cindex @code{GNAT.Heap_Sort_G} (@file{g-hesorg.ads})
+@cindex Sorting
+
+@noindent
+Similar to @code{Heap_Sort_A} except that the move and sorting procedures
+are provided as generic parameters, this improves efficiency, especially
+if the procedures can be inlined, at the expense of duplicating code for
+multiple instantiations.
+
+@node GNAT.HTable (g-htable.ads)
+@section @code{GNAT.HTable} (@file{g-htable.ads})
+@cindex @code{GNAT.HTable} (@file{g-htable.ads})
+@cindex Hash tables
+
+@noindent
+A generic implementation of hash tables that can be used to hash arbitrary
+data. Provides two approaches, one a simple static approach, and the other
+allowing arbitrary dynamic hash tables.
+
+@node GNAT.IO (g-io.ads)
+@section @code{GNAT.IO} (@file{g-io.ads})
+@cindex @code{GNAT.IO} (@file{g-io.ads})
+@cindex Simple I/O
+@cindex Input/Output facilities
+
+@noindent
+A simple preelaborable input-output package that provides a subset of
+simple Text_IO functions for reading characters and strings from
+Standard_Input, and writing characters, strings and integers to either
+Standard_Output or Standard_Error.
+
+@node GNAT.IO_Aux (g-io_aux.ads)
+@section @code{GNAT.IO_Aux} (@file{g-io_aux.ads})
+@cindex @code{GNAT.IO_Aux} (@file{g-io_aux.ads})
+@cindex Text_IO
+@cindex Input/Output facilities
+
+Provides some auxiliary functions for use with Text_IO, including a test
+for whether a file exists, and functions for reading a line of text.
+
+@node GNAT.Lock_Files (g-locfil.ads)
+@section @code{GNAT.Lock_Files} (@file{g-locfil.ads})
+@cindex @code{GNAT.Lock_Files} (@file{g-locfil.ads})
+@cindex File locking
+@cindex Locking using files
+
+@noindent
+Provides a general interface for using files as locks. Can be used for
+providing program level synchronization.
+
+@node GNAT.MBBS_Discrete_Random (g-mbdira.ads)
+@section @code{GNAT.MBBS_Discrete_Random} (@file{g-mbdira.ads})
+@cindex @code{GNAT.MBBS_Discrete_Random} (@file{g-mbdira.ads})
+@cindex Random number generation
+
+@noindent
+The original implementation of @code{Ada.Numerics.Discrete_Random}. Uses
+a modified version of the Blum-Blum-Shub generator.
+
+@node GNAT.MBBS_Float_Random (g-mbflra.ads)
+@section @code{GNAT.MBBS_Float_Random} (@file{g-mbflra.ads})
+@cindex @code{GNAT.MBBS_Float_Random} (@file{g-mbflra.ads})
+@cindex Random number generation
+
+@noindent
+The original implementation of @code{Ada.Numerics.Float_Random}. Uses
+a modified version of the Blum-Blum-Shub generator.
+
+@node GNAT.MD5 (g-md5.ads)
+@section @code{GNAT.MD5} (@file{g-md5.ads})
+@cindex @code{GNAT.MD5} (@file{g-md5.ads})
+@cindex Message Digest MD5
+
+@noindent
+Implements the MD5 Message-Digest Algorithm as described in RFC 1321.
+
+@node GNAT.Memory_Dump (g-memdum.ads)
+@section @code{GNAT.Memory_Dump} (@file{g-memdum.ads})
+@cindex @code{GNAT.Memory_Dump} (@file{g-memdum.ads})
+@cindex Dump Memory
+
+@noindent
+Provides a convenient routine for dumping raw memory to either the
+standard output or standard error files. Uses GNAT.IO for actual
+output.
+
+@node GNAT.Most_Recent_Exception (g-moreex.ads)
+@section @code{GNAT.Most_Recent_Exception} (@file{g-moreex.ads})
+@cindex @code{GNAT.Most_Recent_Exception} (@file{g-moreex.ads})
+@cindex Exception, obtaining most recent
+
+@noindent
+Provides access to the most recently raised exception. Can be used for
+various logging purposes, including duplicating functionality of some
+Ada 83 implementation dependent extensions.
+
+@node GNAT.OS_Lib (g-os_lib.ads)
+@section @code{GNAT.OS_Lib} (@file{g-os_lib.ads})
+@cindex @code{GNAT.OS_Lib} (@file{g-os_lib.ads})
+@cindex Operating System interface
+@cindex Spawn capability
+
+@noindent
+Provides a range of target independent operating system interface functions,
+including time/date management, file operations, subprocess management,
+including a portable spawn procedure, and access to environment variables
+and error return codes.
+
+@node GNAT.Perfect_Hash_Generators (g-pehage.ads)
+@section @code{GNAT.Perfect_Hash_Generators} (@file{g-pehage.ads})
+@cindex @code{GNAT.Perfect_Hash_Generators} (@file{g-pehage.ads})
+@cindex Hash functions
+
+@noindent
+Provides a generator of static minimal perfect hash functions. No
+collisions occur and each item can be retrieved from the table in one
+probe (perfect property). The hash table size corresponds to the exact
+size of the key set and no larger (minimal property). The key set has to
+be know in advance (static property). The hash functions are also order
+preserving. If w2 is inserted after w1 in the generator, their
+hashcode are in the same order. These hashing functions are very
+convenient for use with realtime applications.
+
+@node GNAT.Random_Numbers (g-rannum.ads)
+@section @code{GNAT.Random_Numbers} (@file{g-rannum.ads})
+@cindex @code{GNAT.Random_Numbers} (@file{g-rannum.ads})
+@cindex Random number generation
+
+@noindent
+Provides random number capabilities which extend those available in the
+standard Ada library and are more convenient to use.
+
+@node GNAT.Regexp (g-regexp.ads)
+@section @code{GNAT.Regexp} (@file{g-regexp.ads})
+@cindex @code{GNAT.Regexp} (@file{g-regexp.ads})
+@cindex Regular expressions
+@cindex Pattern matching
+
+@noindent
+A simple implementation of regular expressions, using a subset of regular
+expression syntax copied from familiar Unix style utilities. This is the
+simples of the three pattern matching packages provided, and is particularly
+suitable for ``file globbing'' applications.
+
+@node GNAT.Registry (g-regist.ads)
+@section @code{GNAT.Registry} (@file{g-regist.ads})
+@cindex @code{GNAT.Registry} (@file{g-regist.ads})
+@cindex Windows Registry
+
+@noindent
+This is a high level binding to the Windows registry. It is possible to
+do simple things like reading a key value, creating a new key. For full
+registry API, but at a lower level of abstraction, refer to the Win32.Winreg
+package provided with the Win32Ada binding
+
+@node GNAT.Regpat (g-regpat.ads)
+@section @code{GNAT.Regpat} (@file{g-regpat.ads})
+@cindex @code{GNAT.Regpat} (@file{g-regpat.ads})
+@cindex Regular expressions
+@cindex Pattern matching
+
+@noindent
+A complete implementation of Unix-style regular expression matching, copied
+from the original V7 style regular expression library written in C by
+Henry Spencer (and binary compatible with this C library).
+
+@node GNAT.Secondary_Stack_Info (g-sestin.ads)
+@section @code{GNAT.Secondary_Stack_Info} (@file{g-sestin.ads})
+@cindex @code{GNAT.Secondary_Stack_Info} (@file{g-sestin.ads})
+@cindex Secondary Stack Info
+
+@noindent
+Provide the capability to query the high water mark of the current task's
+secondary stack.
+
+@node GNAT.Semaphores (g-semaph.ads)
+@section @code{GNAT.Semaphores} (@file{g-semaph.ads})
+@cindex @code{GNAT.Semaphores} (@file{g-semaph.ads})
+@cindex Semaphores
+
+@noindent
+Provides classic counting and binary semaphores using protected types.
+
+@node GNAT.Serial_Communications (g-sercom.ads)
+@section @code{GNAT.Serial_Communications} (@file{g-sercom.ads})
+@cindex @code{GNAT.Serial_Communications} (@file{g-sercom.ads})
+@cindex Serial_Communications
+
+@noindent
+Provides a simple interface to send and receive data over a serial
+port. This is only supported on GNU/Linux and Windows.
+
+@node GNAT.SHA1 (g-sha1.ads)
+@section @code{GNAT.SHA1} (@file{g-sha1.ads})
+@cindex @code{GNAT.SHA1} (@file{g-sha1.ads})
+@cindex Secure Hash Algorithm SHA-1
+
+@noindent
+Implements the SHA-1 Secure Hash Algorithm as described in FIPS PUB 180-3
+and RFC 3174.
+
+@node GNAT.SHA224 (g-sha224.ads)
+@section @code{GNAT.SHA224} (@file{g-sha224.ads})
+@cindex @code{GNAT.SHA224} (@file{g-sha224.ads})
+@cindex Secure Hash Algorithm SHA-224
+
+@noindent
+Implements the SHA-224 Secure Hash Algorithm as described in FIPS PUB 180-3.
+
+@node GNAT.SHA256 (g-sha256.ads)
+@section @code{GNAT.SHA256} (@file{g-sha256.ads})
+@cindex @code{GNAT.SHA256} (@file{g-sha256.ads})
+@cindex Secure Hash Algorithm SHA-256
+
+@noindent
+Implements the SHA-256 Secure Hash Algorithm as described in FIPS PUB 180-3.
+
+@node GNAT.SHA384 (g-sha384.ads)
+@section @code{GNAT.SHA384} (@file{g-sha384.ads})
+@cindex @code{GNAT.SHA384} (@file{g-sha384.ads})
+@cindex Secure Hash Algorithm SHA-384
+
+@noindent
+Implements the SHA-384 Secure Hash Algorithm as described in FIPS PUB 180-3.
+
+@node GNAT.SHA512 (g-sha512.ads)
+@section @code{GNAT.SHA512} (@file{g-sha512.ads})
+@cindex @code{GNAT.SHA512} (@file{g-sha512.ads})
+@cindex Secure Hash Algorithm SHA-512
+
+@noindent
+Implements the SHA-512 Secure Hash Algorithm as described in FIPS PUB 180-3.
+
+@node GNAT.Signals (g-signal.ads)
+@section @code{GNAT.Signals} (@file{g-signal.ads})
+@cindex @code{GNAT.Signals} (@file{g-signal.ads})
+@cindex Signals
+
+@noindent
+Provides the ability to manipulate the blocked status of signals on supported
+targets.
+
+@node GNAT.Sockets (g-socket.ads)
+@section @code{GNAT.Sockets} (@file{g-socket.ads})
+@cindex @code{GNAT.Sockets} (@file{g-socket.ads})
+@cindex Sockets
+
+@noindent
+A high level and portable interface to develop sockets based applications.
+This package is based on the sockets thin binding found in
+@code{GNAT.Sockets.Thin}. Currently @code{GNAT.Sockets} is implemented
+on all native GNAT ports except for OpenVMS@. It is not implemented
+for the LynxOS@ cross port.
+
+@node GNAT.Source_Info (g-souinf.ads)
+@section @code{GNAT.Source_Info} (@file{g-souinf.ads})
+@cindex @code{GNAT.Source_Info} (@file{g-souinf.ads})
+@cindex Source Information
+
+@noindent
+Provides subprograms that give access to source code information known at
+compile time, such as the current file name and line number.
+
+@node GNAT.Spelling_Checker (g-speche.ads)
+@section @code{GNAT.Spelling_Checker} (@file{g-speche.ads})
+@cindex @code{GNAT.Spelling_Checker} (@file{g-speche.ads})
+@cindex Spell checking
+
+@noindent
+Provides a function for determining whether one string is a plausible
+near misspelling of another string.
+
+@node GNAT.Spelling_Checker_Generic (g-spchge.ads)
+@section @code{GNAT.Spelling_Checker_Generic} (@file{g-spchge.ads})
+@cindex @code{GNAT.Spelling_Checker_Generic} (@file{g-spchge.ads})
+@cindex Spell checking
+
+@noindent
+Provides a generic function that can be instantiated with a string type for
+determining whether one string is a plausible near misspelling of another
+string.
+
+@node GNAT.Spitbol.Patterns (g-spipat.ads)
+@section @code{GNAT.Spitbol.Patterns} (@file{g-spipat.ads})
+@cindex @code{GNAT.Spitbol.Patterns} (@file{g-spipat.ads})
+@cindex SPITBOL pattern matching
+@cindex Pattern matching
+
+@noindent
+A complete implementation of SNOBOL4 style pattern matching. This is the
+most elaborate of the pattern matching packages provided. It fully duplicates
+the SNOBOL4 dynamic pattern construction and matching capabilities, using the
+efficient algorithm developed by Robert Dewar for the SPITBOL system.
+
+@node GNAT.Spitbol (g-spitbo.ads)
+@section @code{GNAT.Spitbol} (@file{g-spitbo.ads})
+@cindex @code{GNAT.Spitbol} (@file{g-spitbo.ads})
+@cindex SPITBOL interface
+
+@noindent
+The top level package of the collection of SPITBOL-style functionality, this
+package provides basic SNOBOL4 string manipulation functions, such as
+Pad, Reverse, Trim, Substr capability, as well as a generic table function
+useful for constructing arbitrary mappings from strings in the style of
+the SNOBOL4 TABLE function.
+
+@node GNAT.Spitbol.Table_Boolean (g-sptabo.ads)
+@section @code{GNAT.Spitbol.Table_Boolean} (@file{g-sptabo.ads})
+@cindex @code{GNAT.Spitbol.Table_Boolean} (@file{g-sptabo.ads})
+@cindex Sets of strings
+@cindex SPITBOL Tables
+
+@noindent
+A library level of instantiation of @code{GNAT.Spitbol.Patterns.Table}
+for type @code{Standard.Boolean}, giving an implementation of sets of
+string values.
+
+@node GNAT.Spitbol.Table_Integer (g-sptain.ads)
+@section @code{GNAT.Spitbol.Table_Integer} (@file{g-sptain.ads})
+@cindex @code{GNAT.Spitbol.Table_Integer} (@file{g-sptain.ads})
+@cindex Integer maps
+@cindex Maps
+@cindex SPITBOL Tables
+
+@noindent
+A library level of instantiation of @code{GNAT.Spitbol.Patterns.Table}
+for type @code{Standard.Integer}, giving an implementation of maps
+from string to integer values.
+
+@node GNAT.Spitbol.Table_VString (g-sptavs.ads)
+@section @code{GNAT.Spitbol.Table_VString} (@file{g-sptavs.ads})
+@cindex @code{GNAT.Spitbol.Table_VString} (@file{g-sptavs.ads})
+@cindex String maps
+@cindex Maps
+@cindex SPITBOL Tables
+
+@noindent
+A library level of instantiation of @code{GNAT.Spitbol.Patterns.Table} for
+a variable length string type, giving an implementation of general
+maps from strings to strings.
+
+@node GNAT.SSE (g-sse.ads)
+@section @code{GNAT.SSE} (@file{g-sse.ads})
+@cindex @code{GNAT.SSE} (@file{g-sse.ads})
+
+@noindent
+Root of a set of units aimed at offering Ada bindings to a subset of
+the Intel(r) Streaming SIMD Extensions with GNAT on the x86 family of
+targets. It exposes vector component types together with a general
+introduction to the binding contents and use.
+
+@node GNAT.SSE.Vector_Types (g-ssvety.ads)
+@section @code{GNAT.SSE.Vector_Types} (@file{g-ssvety.ads})
+@cindex @code{GNAT.SSE.Vector_Types} (@file{g-ssvety.ads})
+
+@noindent
+SSE vector types for use with SSE related intrinsics.
+
+@node GNAT.Strings (g-string.ads)
+@section @code{GNAT.Strings} (@file{g-string.ads})
+@cindex @code{GNAT.Strings} (@file{g-string.ads})
+
+@noindent
+Common String access types and related subprograms. Basically it
+defines a string access and an array of string access types.
+
+@node GNAT.String_Split (g-strspl.ads)
+@section @code{GNAT.String_Split} (@file{g-strspl.ads})
+@cindex @code{GNAT.String_Split} (@file{g-strspl.ads})
+@cindex String splitter
+
+@noindent
+Useful string manipulation routines: given a set of separators, split
+a string wherever the separators appear, and provide direct access
+to the resulting slices. This package is instantiated from
+@code{GNAT.Array_Split}.
+
+@node GNAT.Table (g-table.ads)
+@section @code{GNAT.Table} (@file{g-table.ads})
+@cindex @code{GNAT.Table} (@file{g-table.ads})
+@cindex Table implementation
+@cindex Arrays, extendable
+
+@noindent
+A generic package providing a single dimension array abstraction where the
+length of the array can be dynamically modified.
+
+@noindent
+This package provides a facility similar to that of @code{GNAT.Dynamic_Tables},
+except that this package declares a single instance of the table type,
+while an instantiation of @code{GNAT.Dynamic_Tables} creates a type that can be
+used to define dynamic instances of the table.
+
+@node GNAT.Task_Lock (g-tasloc.ads)
+@section @code{GNAT.Task_Lock} (@file{g-tasloc.ads})
+@cindex @code{GNAT.Task_Lock} (@file{g-tasloc.ads})
+@cindex Task synchronization
+@cindex Task locking
+@cindex Locking
+
+@noindent
+A very simple facility for locking and unlocking sections of code using a
+single global task lock. Appropriate for use in situations where contention
+between tasks is very rarely expected.
+
+@node GNAT.Time_Stamp (g-timsta.ads)
+@section @code{GNAT.Time_Stamp} (@file{g-timsta.ads})
+@cindex @code{GNAT.Time_Stamp} (@file{g-timsta.ads})
+@cindex Time stamp
+@cindex Current time
+
+@noindent
+Provides a simple function that returns a string YYYY-MM-DD HH:MM:SS.SS that
+represents the current date and time in ISO 8601 format. This is a very simple
+routine with minimal code and there are no dependencies on any other unit.
+
+@node GNAT.Threads (g-thread.ads)
+@section @code{GNAT.Threads} (@file{g-thread.ads})
+@cindex @code{GNAT.Threads} (@file{g-thread.ads})
+@cindex Foreign threads
+@cindex Threads, foreign
+
+@noindent
+Provides facilities for dealing with foreign threads which need to be known
+by the GNAT run-time system. Consult the documentation of this package for
+further details if your program has threads that are created by a non-Ada
+environment which then accesses Ada code.
+
+@node GNAT.Traceback (g-traceb.ads)
+@section @code{GNAT.Traceback} (@file{g-traceb.ads})
+@cindex @code{GNAT.Traceback} (@file{g-traceb.ads})
+@cindex Trace back facilities
+
+@noindent
+Provides a facility for obtaining non-symbolic traceback information, useful
+in various debugging situations.
+
+@node GNAT.Traceback.Symbolic (g-trasym.ads)
+@section @code{GNAT.Traceback.Symbolic} (@file{g-trasym.ads})
+@cindex @code{GNAT.Traceback.Symbolic} (@file{g-trasym.ads})
+@cindex Trace back facilities
+
+@node GNAT.UTF_32 (g-utf_32.ads)
+@section @code{GNAT.UTF_32} (@file{g-table.ads})
+@cindex @code{GNAT.UTF_32} (@file{g-table.ads})
+@cindex Wide character codes
+
+@noindent
+This is a package intended to be used in conjunction with the
+@code{Wide_Character} type in Ada 95 and the
+@code{Wide_Wide_Character} type in Ada 2005 (available
+in @code{GNAT} in Ada 2005 mode). This package contains
+Unicode categorization routines, as well as lexical
+categorization routines corresponding to the Ada 2005
+lexical rules for identifiers and strings, and also a
+lower case to upper case fold routine corresponding to
+the Ada 2005 rules for identifier equivalence.
+
+@node GNAT.UTF_32_Spelling_Checker (g-u3spch.ads)
+@section @code{GNAT.Wide_Spelling_Checker} (@file{g-u3spch.ads})
+@cindex @code{GNAT.Wide_Spelling_Checker} (@file{g-u3spch.ads})
+@cindex Spell checking
+
+@noindent
+Provides a function for determining whether one wide wide string is a plausible
+near misspelling of another wide wide string, where the strings are represented
+using the UTF_32_String type defined in System.Wch_Cnv.
+
+@node GNAT.Wide_Spelling_Checker (g-wispch.ads)
+@section @code{GNAT.Wide_Spelling_Checker} (@file{g-wispch.ads})
+@cindex @code{GNAT.Wide_Spelling_Checker} (@file{g-wispch.ads})
+@cindex Spell checking
+
+@noindent
+Provides a function for determining whether one wide string is a plausible
+near misspelling of another wide string.
+
+@node GNAT.Wide_String_Split (g-wistsp.ads)
+@section @code{GNAT.Wide_String_Split} (@file{g-wistsp.ads})
+@cindex @code{GNAT.Wide_String_Split} (@file{g-wistsp.ads})
+@cindex Wide_String splitter
+
+@noindent
+Useful wide string manipulation routines: given a set of separators, split
+a wide string wherever the separators appear, and provide direct access
+to the resulting slices. This package is instantiated from
+@code{GNAT.Array_Split}.
+
+@node GNAT.Wide_Wide_Spelling_Checker (g-zspche.ads)
+@section @code{GNAT.Wide_Wide_Spelling_Checker} (@file{g-zspche.ads})
+@cindex @code{GNAT.Wide_Wide_Spelling_Checker} (@file{g-zspche.ads})
+@cindex Spell checking
+
+@noindent
+Provides a function for determining whether one wide wide string is a plausible
+near misspelling of another wide wide string.
+
+@node GNAT.Wide_Wide_String_Split (g-zistsp.ads)
+@section @code{GNAT.Wide_Wide_String_Split} (@file{g-zistsp.ads})
+@cindex @code{GNAT.Wide_Wide_String_Split} (@file{g-zistsp.ads})
+@cindex Wide_Wide_String splitter
+
+@noindent
+Useful wide wide string manipulation routines: given a set of separators, split
+a wide wide string wherever the separators appear, and provide direct access
+to the resulting slices. This package is instantiated from
+@code{GNAT.Array_Split}.
+
+@node Interfaces.C.Extensions (i-cexten.ads)
+@section @code{Interfaces.C.Extensions} (@file{i-cexten.ads})
+@cindex @code{Interfaces.C.Extensions} (@file{i-cexten.ads})
+
+@noindent
+This package contains additional C-related definitions, intended
+for use with either manually or automatically generated bindings
+to C libraries.
+
+@node Interfaces.C.Streams (i-cstrea.ads)
+@section @code{Interfaces.C.Streams} (@file{i-cstrea.ads})
+@cindex @code{Interfaces.C.Streams} (@file{i-cstrea.ads})
+@cindex C streams, interfacing
+
+@noindent
+This package is a binding for the most commonly used operations
+on C streams.
+
+@node Interfaces.CPP (i-cpp.ads)
+@section @code{Interfaces.CPP} (@file{i-cpp.ads})
+@cindex @code{Interfaces.CPP} (@file{i-cpp.ads})
+@cindex C++ interfacing
+@cindex Interfacing, to C++
+
+@noindent
+This package provides facilities for use in interfacing to C++. It
+is primarily intended to be used in connection with automated tools
+for the generation of C++ interfaces.
+
+@node Interfaces.Packed_Decimal (i-pacdec.ads)
+@section @code{Interfaces.Packed_Decimal} (@file{i-pacdec.ads})
+@cindex @code{Interfaces.Packed_Decimal} (@file{i-pacdec.ads})
+@cindex IBM Packed Format
+@cindex Packed Decimal
+
+@noindent
+This package provides a set of routines for conversions to and
+from a packed decimal format compatible with that used on IBM
+mainframes.
+
+@node Interfaces.VxWorks (i-vxwork.ads)
+@section @code{Interfaces.VxWorks} (@file{i-vxwork.ads})
+@cindex @code{Interfaces.VxWorks} (@file{i-vxwork.ads})
+@cindex Interfacing to VxWorks
+@cindex VxWorks, interfacing
+
+@noindent
+This package provides a limited binding to the VxWorks API.
+In particular, it interfaces with the
+VxWorks hardware interrupt facilities.
+
+@node Interfaces.VxWorks.IO (i-vxwoio.ads)
+@section @code{Interfaces.VxWorks.IO} (@file{i-vxwoio.ads})
+@cindex @code{Interfaces.VxWorks.IO} (@file{i-vxwoio.ads})
+@cindex Interfacing to VxWorks' I/O
+@cindex VxWorks, I/O interfacing
+@cindex VxWorks, Get_Immediate
+@cindex Get_Immediate, VxWorks
+
+@noindent
+This package provides a binding to the ioctl (IO/Control)
+function of VxWorks, defining a set of option values and
+function codes. A particular use of this package is
+to enable the use of Get_Immediate under VxWorks.
+
+@node System.Address_Image (s-addima.ads)
+@section @code{System.Address_Image} (@file{s-addima.ads})
+@cindex @code{System.Address_Image} (@file{s-addima.ads})
+@cindex Address image
+@cindex Image, of an address
+
+@noindent
+This function provides a useful debugging
+function that gives an (implementation dependent)
+string which identifies an address.
+
+@node System.Assertions (s-assert.ads)
+@section @code{System.Assertions} (@file{s-assert.ads})
+@cindex @code{System.Assertions} (@file{s-assert.ads})
+@cindex Assertions
+@cindex Assert_Failure, exception
+
+@noindent
+This package provides the declaration of the exception raised
+by an run-time assertion failure, as well as the routine that
+is used internally to raise this assertion.
+
+@node System.Memory (s-memory.ads)
+@section @code{System.Memory} (@file{s-memory.ads})
+@cindex @code{System.Memory} (@file{s-memory.ads})
+@cindex Memory allocation
+
+@noindent
+This package provides the interface to the low level routines used
+by the generated code for allocation and freeing storage for the
+default storage pool (analogous to the C routines malloc and free.
+It also provides a reallocation interface analogous to the C routine
+realloc. The body of this unit may be modified to provide alternative
+allocation mechanisms for the default pool, and in addition, direct
+calls to this unit may be made for low level allocation uses (for
+example see the body of @code{GNAT.Tables}).
+
+@node System.Multiprocessors (s-multip.ads)
+@section @code{System.Multiprocessors} (@file{s-multip.ads})
+@cindex @code{System.Multiprocessors} (@file{s-multip.ads})
+@cindex Multiprocessor interface
+This is an Ada 2012 unit defined in the Ada 2012 Reference Manual, but
+in GNAT we also make it available in Ada 95 and Ada 2005 (where it is
+technically an implementation-defined addition).
+
+@node System.Multiprocessors.Dispatching_Domains (s-mudido.ads)
+@section @code{System.Multiprocessors.Dispatching_Domains} (@file{s-mudido.ads})
+@cindex @code{System.Multiprocessors.Dispatching_Domains} (@file{s-mudido.ads})
+@cindex Multiprocessor interface
+This is an Ada 2012 unit defined in the Ada 2012 Reference Manual, but
+in GNAT we also make it available in Ada 95 and Ada 2005 (where it is
+technically an implementation-defined addition).
+
+@node System.Partition_Interface (s-parint.ads)
+@section @code{System.Partition_Interface} (@file{s-parint.ads})
+@cindex @code{System.Partition_Interface} (@file{s-parint.ads})
+@cindex Partition interfacing functions
+
+@noindent
+This package provides facilities for partition interfacing. It
+is used primarily in a distribution context when using Annex E
+with @code{GLADE}.
+
+@node System.Pool_Global (s-pooglo.ads)
+@section @code{System.Pool_Global} (@file{s-pooglo.ads})
+@cindex @code{System.Pool_Global} (@file{s-pooglo.ads})
+@cindex Storage pool, global
+@cindex Global storage pool
+
+@noindent
+This package provides a storage pool that is equivalent to the default
+storage pool used for access types for which no pool is specifically
+declared. It uses malloc/free to allocate/free and does not attempt to
+do any automatic reclamation.
+
+@node System.Pool_Local (s-pooloc.ads)
+@section @code{System.Pool_Local} (@file{s-pooloc.ads})
+@cindex @code{System.Pool_Local} (@file{s-pooloc.ads})
+@cindex Storage pool, local
+@cindex Local storage pool
+
+@noindent
+This package provides a storage pool that is intended for use with locally
+defined access types. It uses malloc/free for allocate/free, and maintains
+a list of allocated blocks, so that all storage allocated for the pool can
+be freed automatically when the pool is finalized.
+
+@node System.Restrictions (s-restri.ads)
+@section @code{System.Restrictions} (@file{s-restri.ads})
+@cindex @code{System.Restrictions} (@file{s-restri.ads})
+@cindex Run-time restrictions access
+
+@noindent
+This package provides facilities for accessing at run time
+the status of restrictions specified at compile time for
+the partition. Information is available both with regard
+to actual restrictions specified, and with regard to
+compiler determined information on which restrictions
+are violated by one or more packages in the partition.
+
+@node System.Rident (s-rident.ads)
+@section @code{System.Rident} (@file{s-rident.ads})
+@cindex @code{System.Rident} (@file{s-rident.ads})
+@cindex Restrictions definitions
+
+@noindent
+This package provides definitions of the restrictions
+identifiers supported by GNAT, and also the format of
+the restrictions provided in package System.Restrictions.
+It is not normally necessary to @code{with} this generic package
+since the necessary instantiation is included in
+package System.Restrictions.
+
+@node System.Strings.Stream_Ops (s-ststop.ads)
+@section @code{System.Strings.Stream_Ops} (@file{s-ststop.ads})
+@cindex @code{System.Strings.Stream_Ops} (@file{s-ststop.ads})
+@cindex Stream operations
+@cindex String stream operations
+
+@noindent
+This package provides a set of stream subprograms for standard string types.
+It is intended primarily to support implicit use of such subprograms when
+stream attributes are applied to string types, but the subprograms in this
+package can be used directly by application programs.
+
+@node System.Task_Info (s-tasinf.ads)
+@section @code{System.Task_Info} (@file{s-tasinf.ads})
+@cindex @code{System.Task_Info} (@file{s-tasinf.ads})
+@cindex Task_Info pragma
+
+@noindent
+This package provides target dependent functionality that is used
+to support the @code{Task_Info} pragma
+
+@node System.Wch_Cnv (s-wchcnv.ads)
+@section @code{System.Wch_Cnv} (@file{s-wchcnv.ads})
+@cindex @code{System.Wch_Cnv} (@file{s-wchcnv.ads})
+@cindex Wide Character, Representation
+@cindex Wide String, Conversion
+@cindex Representation of wide characters
+
+@noindent
+This package provides routines for converting between
+wide and wide wide characters and a representation as a value of type
+@code{Standard.String}, using a specified wide character
+encoding method. It uses definitions in
+package @code{System.Wch_Con}.
+
+@node System.Wch_Con (s-wchcon.ads)
+@section @code{System.Wch_Con} (@file{s-wchcon.ads})
+@cindex @code{System.Wch_Con} (@file{s-wchcon.ads})
+
+@noindent
+This package provides definitions and descriptions of
+the various methods used for encoding wide characters
+in ordinary strings. These definitions are used by
+the package @code{System.Wch_Cnv}.
+
+@node Interfacing to Other Languages
+@chapter Interfacing to Other Languages
+@noindent
+The facilities in annex B of the Ada Reference Manual are fully
+implemented in GNAT, and in addition, a full interface to C++ is
+provided.
+
+@menu
+* Interfacing to C::
+* Interfacing to C++::
+* Interfacing to COBOL::
+* Interfacing to Fortran::
+* Interfacing to non-GNAT Ada code::
+@end menu
+
+@node Interfacing to C
+@section Interfacing to C
+
+@noindent
+Interfacing to C with GNAT can use one of two approaches:
+
+@itemize @bullet
+@item
+The types in the package @code{Interfaces.C} may be used.
+@item
+Standard Ada types may be used directly. This may be less portable to
+other compilers, but will work on all GNAT compilers, which guarantee
+correspondence between the C and Ada types.
+@end itemize
+
+@noindent
+Pragma @code{Convention C} may be applied to Ada types, but mostly has no
+effect, since this is the default. The following table shows the
+correspondence between Ada scalar types and the corresponding C types.
+
+@table @code
+@item Integer
+@code{int}
+@item Short_Integer
+@code{short}
+@item Short_Short_Integer
+@code{signed char}
+@item Long_Integer
+@code{long}
+@item Long_Long_Integer
+@code{long long}
+@item Short_Float
+@code{float}
+@item Float
+@code{float}
+@item Long_Float
+@code{double}
+@item Long_Long_Float
+This is the longest floating-point type supported by the hardware.
+@end table
+
+@noindent
+Additionally, there are the following general correspondences between Ada
+and C types:
+@itemize @bullet
+@item
+Ada enumeration types map to C enumeration types directly if pragma
+@code{Convention C} is specified, which causes them to have int
+length. Without pragma @code{Convention C}, Ada enumeration types map to
+8, 16, or 32 bits (i.e.@: C types @code{signed char}, @code{short},
+@code{int}, respectively) depending on the number of values passed.
+This is the only case in which pragma @code{Convention C} affects the
+representation of an Ada type.
+
+@item
+Ada access types map to C pointers, except for the case of pointers to
+unconstrained types in Ada, which have no direct C equivalent.
+
+@item
+Ada arrays map directly to C arrays.
+
+@item
+Ada records map directly to C structures.
+
+@item
+Packed Ada records map to C structures where all members are bit fields
+of the length corresponding to the @code{@var{type}'Size} value in Ada.
+@end itemize
+
+@node Interfacing to C++
+@section Interfacing to C++
+
+@noindent
+The interface to C++ makes use of the following pragmas, which are
+primarily intended to be constructed automatically using a binding generator
+tool, although it is possible to construct them by hand.
+
+Using these pragmas it is possible to achieve complete
+inter-operability between Ada tagged types and C++ class definitions.
+See @ref{Implementation Defined Pragmas}, for more details.
+
+@table @code
+@item pragma CPP_Class ([Entity =>] @var{LOCAL_NAME})
+The argument denotes an entity in the current declarative region that is
+declared as a tagged or untagged record type. It indicates that the type
+corresponds to an externally declared C++ class type, and is to be laid
+out the same way that C++ would lay out the type.
+
+Note: Pragma @code{CPP_Class} is currently obsolete. It is supported
+for backward compatibility but its functionality is available
+using pragma @code{Import} with @code{Convention} = @code{CPP}.
+
+@item pragma CPP_Constructor ([Entity =>] @var{LOCAL_NAME})
+This pragma identifies an imported function (imported in the usual way
+with pragma @code{Import}) as corresponding to a C++ constructor.
+@end table
+
+A few restrictions are placed on the use of the @code{Access} attribute
+in conjunction with subprograms subject to convention @code{CPP}: the
+attribute may be used neither on primitive operations of a tagged
+record type with convention @code{CPP}, imported or not, nor on
+subprograms imported with pragma @code{CPP_Constructor}.
+
+In addition, C++ exceptions are propagated and can be handled in an
+@code{others} choice of an exception handler. The corresponding Ada
+occurrence has no message, and the simple name of the exception identity
+contains @samp{Foreign_Exception}. Finalization and awaiting dependent
+tasks works properly when such foreign exceptions are propagated.
+
+It is also possible to import a C++ exception using the following syntax:
+
+@smallexample @c ada
+LOCAL_NAME : exception;
+pragma Import (Cpp,
+ [Entity =>] LOCAL_NAME,
+ [External_Name =>] static_string_EXPRESSION);
+@end smallexample
+
+@noindent
+The @code{External_Name} is the name of the C++ RTTI symbol. You can then
+cover a specific C++ exception in an exception handler.
+
+@node Interfacing to COBOL
+@section Interfacing to COBOL
+
+@noindent
+Interfacing to COBOL is achieved as described in section B.4 of
+the Ada Reference Manual.
+
+@node Interfacing to Fortran
+@section Interfacing to Fortran
+
+@noindent
+Interfacing to Fortran is achieved as described in section B.5 of the
+Ada Reference Manual. The pragma @code{Convention Fortran}, applied to a
+multi-dimensional array causes the array to be stored in column-major
+order as required for convenient interface to Fortran.
+
+@node Interfacing to non-GNAT Ada code
+@section Interfacing to non-GNAT Ada code
+
+It is possible to specify the convention @code{Ada} in a pragma
+@code{Import} or pragma @code{Export}. However this refers to
+the calling conventions used by GNAT, which may or may not be
+similar enough to those used by some other Ada 83 / Ada 95 / Ada 2005
+compiler to allow interoperation.
+
+If arguments types are kept simple, and if the foreign compiler generally
+follows system calling conventions, then it may be possible to integrate
+files compiled by other Ada compilers, provided that the elaboration
+issues are adequately addressed (for example by eliminating the
+need for any load time elaboration).
+
+In particular, GNAT running on VMS is designed to
+be highly compatible with the DEC Ada 83 compiler, so this is one
+case in which it is possible to import foreign units of this type,
+provided that the data items passed are restricted to simple scalar
+values or simple record types without variants, or simple array
+types with fixed bounds.
+
+@node Specialized Needs Annexes
+@chapter Specialized Needs Annexes
+
+@noindent
+Ada 95 and Ada 2005 define a number of Specialized Needs Annexes, which are not
+required in all implementations. However, as described in this chapter,
+GNAT implements all of these annexes:
+
+@table @asis
+@item Systems Programming (Annex C)
+The Systems Programming Annex is fully implemented.
+
+@item Real-Time Systems (Annex D)
+The Real-Time Systems Annex is fully implemented.
+
+@item Distributed Systems (Annex E)
+Stub generation is fully implemented in the GNAT compiler. In addition,
+a complete compatible PCS is available as part of the GLADE system,
+a separate product. When the two
+products are used in conjunction, this annex is fully implemented.
+
+@item Information Systems (Annex F)
+The Information Systems annex is fully implemented.
+
+@item Numerics (Annex G)
+The Numerics Annex is fully implemented.
+
+@item Safety and Security / High-Integrity Systems (Annex H)
+The Safety and Security Annex (termed the High-Integrity Systems Annex
+in Ada 2005) is fully implemented.
+@end table
+
+@node Implementation of Specific Ada Features
+@chapter Implementation of Specific Ada Features
+
+@noindent
+This chapter describes the GNAT implementation of several Ada language
+facilities.
+
+@menu
+* Machine Code Insertions::
+* GNAT Implementation of Tasking::
+* GNAT Implementation of Shared Passive Packages::
+* Code Generation for Array Aggregates::
+* The Size of Discriminated Records with Default Discriminants::
+* Strict Conformance to the Ada Reference Manual::
+@end menu
+
+@node Machine Code Insertions
+@section Machine Code Insertions
+@cindex Machine Code insertions
+
+@noindent
+Package @code{Machine_Code} provides machine code support as described
+in the Ada Reference Manual in two separate forms:
+@itemize @bullet
+@item
+Machine code statements, consisting of qualified expressions that
+fit the requirements of RM section 13.8.
+@item
+An intrinsic callable procedure, providing an alternative mechanism of
+including machine instructions in a subprogram.
+@end itemize
+
+@noindent
+The two features are similar, and both are closely related to the mechanism
+provided by the asm instruction in the GNU C compiler. Full understanding
+and use of the facilities in this package requires understanding the asm
+instruction, see @ref{Extended Asm,, Assembler Instructions with C Expression
+Operands, gcc, Using the GNU Compiler Collection (GCC)}.
+
+Calls to the function @code{Asm} and the procedure @code{Asm} have identical
+semantic restrictions and effects as described below. Both are provided so
+that the procedure call can be used as a statement, and the function call
+can be used to form a code_statement.
+
+The first example given in the GCC documentation is the C @code{asm}
+instruction:
+@smallexample
+ asm ("fsinx %1 %0" : "=f" (result) : "f" (angle));
+@end smallexample
+
+@noindent
+The equivalent can be written for GNAT as:
+
+@smallexample @c ada
+Asm ("fsinx %1 %0",
+ My_Float'Asm_Output ("=f", result),
+ My_Float'Asm_Input ("f", angle));
+@end smallexample
+
+@noindent
+The first argument to @code{Asm} is the assembler template, and is
+identical to what is used in GNU C@. This string must be a static
+expression. The second argument is the output operand list. It is
+either a single @code{Asm_Output} attribute reference, or a list of such
+references enclosed in parentheses (technically an array aggregate of
+such references).
+
+The @code{Asm_Output} attribute denotes a function that takes two
+parameters. The first is a string, the second is the name of a variable
+of the type designated by the attribute prefix. The first (string)
+argument is required to be a static expression and designates the
+constraint for the parameter (e.g.@: what kind of register is
+required). The second argument is the variable to be updated with the
+result. The possible values for constraint are the same as those used in
+the RTL, and are dependent on the configuration file used to build the
+GCC back end. If there are no output operands, then this argument may
+either be omitted, or explicitly given as @code{No_Output_Operands}.
+
+The second argument of @code{@var{my_float}'Asm_Output} functions as
+though it were an @code{out} parameter, which is a little curious, but
+all names have the form of expressions, so there is no syntactic
+irregularity, even though normally functions would not be permitted
+@code{out} parameters. The third argument is the list of input
+operands. It is either a single @code{Asm_Input} attribute reference, or
+a list of such references enclosed in parentheses (technically an array
+aggregate of such references).
+
+The @code{Asm_Input} attribute denotes a function that takes two
+parameters. The first is a string, the second is an expression of the
+type designated by the prefix. The first (string) argument is required
+to be a static expression, and is the constraint for the parameter,
+(e.g.@: what kind of register is required). The second argument is the
+value to be used as the input argument. The possible values for the
+constant are the same as those used in the RTL, and are dependent on
+the configuration file used to built the GCC back end.
+
+If there are no input operands, this argument may either be omitted, or
+explicitly given as @code{No_Input_Operands}. The fourth argument, not
+present in the above example, is a list of register names, called the
+@dfn{clobber} argument. This argument, if given, must be a static string
+expression, and is a space or comma separated list of names of registers
+that must be considered destroyed as a result of the @code{Asm} call. If
+this argument is the null string (the default value), then the code
+generator assumes that no additional registers are destroyed.
+
+The fifth argument, not present in the above example, called the
+@dfn{volatile} argument, is by default @code{False}. It can be set to
+the literal value @code{True} to indicate to the code generator that all
+optimizations with respect to the instruction specified should be
+suppressed, and that in particular, for an instruction that has outputs,
+the instruction will still be generated, even if none of the outputs are
+used. @xref{Extended Asm,, Assembler Instructions with C Expression Operands,
+gcc, Using the GNU Compiler Collection (GCC)}, for the full description.
+Generally it is strongly advisable to use Volatile for any ASM statement
+that is missing either input or output operands, or when two or more ASM
+statements appear in sequence, to avoid unwanted optimizations. A warning
+is generated if this advice is not followed.
+
+The @code{Asm} subprograms may be used in two ways. First the procedure
+forms can be used anywhere a procedure call would be valid, and
+correspond to what the RM calls ``intrinsic'' routines. Such calls can
+be used to intersperse machine instructions with other Ada statements.
+Second, the function forms, which return a dummy value of the limited
+private type @code{Asm_Insn}, can be used in code statements, and indeed
+this is the only context where such calls are allowed. Code statements
+appear as aggregates of the form:
+
+@smallexample @c ada
+Asm_Insn'(Asm (@dots{}));
+Asm_Insn'(Asm_Volatile (@dots{}));
+@end smallexample
+
+@noindent
+In accordance with RM rules, such code statements are allowed only
+within subprograms whose entire body consists of such statements. It is
+not permissible to intermix such statements with other Ada statements.
+
+Typically the form using intrinsic procedure calls is more convenient
+and more flexible. The code statement form is provided to meet the RM
+suggestion that such a facility should be made available. The following
+is the exact syntax of the call to @code{Asm}. As usual, if named notation
+is used, the arguments may be given in arbitrary order, following the
+normal rules for use of positional and named arguments)
+
+@smallexample
+ASM_CALL ::= Asm (
+ [Template =>] static_string_EXPRESSION
+ [,[Outputs =>] OUTPUT_OPERAND_LIST ]
+ [,[Inputs =>] INPUT_OPERAND_LIST ]
+ [,[Clobber =>] static_string_EXPRESSION ]
+ [,[Volatile =>] static_boolean_EXPRESSION] )
+
+OUTPUT_OPERAND_LIST ::=
+ [PREFIX.]No_Output_Operands
+| OUTPUT_OPERAND_ATTRIBUTE
+| (OUTPUT_OPERAND_ATTRIBUTE @{,OUTPUT_OPERAND_ATTRIBUTE@})
+
+OUTPUT_OPERAND_ATTRIBUTE ::=
+ SUBTYPE_MARK'Asm_Output (static_string_EXPRESSION, NAME)
+
+INPUT_OPERAND_LIST ::=
+ [PREFIX.]No_Input_Operands
+| INPUT_OPERAND_ATTRIBUTE
+| (INPUT_OPERAND_ATTRIBUTE @{,INPUT_OPERAND_ATTRIBUTE@})
+
+INPUT_OPERAND_ATTRIBUTE ::=
+ SUBTYPE_MARK'Asm_Input (static_string_EXPRESSION, EXPRESSION)
+@end smallexample
+
+@noindent
+The identifiers @code{No_Input_Operands} and @code{No_Output_Operands}
+are declared in the package @code{Machine_Code} and must be referenced
+according to normal visibility rules. In particular if there is no
+@code{use} clause for this package, then appropriate package name
+qualification is required.
+
+@node GNAT Implementation of Tasking
+@section GNAT Implementation of Tasking
+
+@noindent
+This chapter outlines the basic GNAT approach to tasking (in particular,
+a multi-layered library for portability) and discusses issues related
+to compliance with the Real-Time Systems Annex.
+
+@menu
+* Mapping Ada Tasks onto the Underlying Kernel Threads::
+* Ensuring Compliance with the Real-Time Annex::
+@end menu
+
+@node Mapping Ada Tasks onto the Underlying Kernel Threads
+@subsection Mapping Ada Tasks onto the Underlying Kernel Threads
+
+@noindent
+GNAT's run-time support comprises two layers:
+
+@itemize @bullet
+@item GNARL (GNAT Run-time Layer)
+@item GNULL (GNAT Low-level Library)
+@end itemize
+
+@noindent
+In GNAT, Ada's tasking services rely on a platform and OS independent
+layer known as GNARL@. This code is responsible for implementing the
+correct semantics of Ada's task creation, rendezvous, protected
+operations etc.
+
+GNARL decomposes Ada's tasking semantics into simpler lower level
+operations such as create a thread, set the priority of a thread,
+yield, create a lock, lock/unlock, etc. The spec for these low-level
+operations constitutes GNULLI, the GNULL Interface. This interface is
+directly inspired from the POSIX real-time API@.
+
+If the underlying executive or OS implements the POSIX standard
+faithfully, the GNULL Interface maps as is to the services offered by
+the underlying kernel. Otherwise, some target dependent glue code maps
+the services offered by the underlying kernel to the semantics expected
+by GNARL@.
+
+Whatever the underlying OS (VxWorks, UNIX, Windows, etc.) the
+key point is that each Ada task is mapped on a thread in the underlying
+kernel. For example, in the case of VxWorks, one Ada task = one VxWorks task.
+
+In addition Ada task priorities map onto the underlying thread priorities.
+Mapping Ada tasks onto the underlying kernel threads has several advantages:
+
+@itemize @bullet
+@item
+The underlying scheduler is used to schedule the Ada tasks. This
+makes Ada tasks as efficient as kernel threads from a scheduling
+standpoint.
+
+@item
+Interaction with code written in C containing threads is eased
+since at the lowest level Ada tasks and C threads map onto the same
+underlying kernel concept.
+
+@item
+When an Ada task is blocked during I/O the remaining Ada tasks are
+able to proceed.
+
+@item
+On multiprocessor systems Ada tasks can execute in parallel.
+@end itemize
+
+@noindent
+Some threads libraries offer a mechanism to fork a new process, with the
+child process duplicating the threads from the parent.
+GNAT does not
+support this functionality when the parent contains more than one task.
+@cindex Forking a new process
+
+@node Ensuring Compliance with the Real-Time Annex
+@subsection Ensuring Compliance with the Real-Time Annex
+@cindex Real-Time Systems Annex compliance
+
+@noindent
+Although mapping Ada tasks onto
+the underlying threads has significant advantages, it does create some
+complications when it comes to respecting the scheduling semantics
+specified in the real-time annex (Annex D).
+
+For instance the Annex D requirement for the @code{FIFO_Within_Priorities}
+scheduling policy states:
+
+@quotation
+@emph{When the active priority of a ready task that is not running
+changes, or the setting of its base priority takes effect, the
+task is removed from the ready queue for its old active priority
+and is added at the tail of the ready queue for its new active
+priority, except in the case where the active priority is lowered
+due to the loss of inherited priority, in which case the task is
+added at the head of the ready queue for its new active priority.}
+@end quotation
+
+@noindent
+While most kernels do put tasks at the end of the priority queue when
+a task changes its priority, (which respects the main
+FIFO_Within_Priorities requirement), almost none keep a thread at the
+beginning of its priority queue when its priority drops from the loss
+of inherited priority.
+
+As a result most vendors have provided incomplete Annex D implementations.
+
+The GNAT run-time, has a nice cooperative solution to this problem
+which ensures that accurate FIFO_Within_Priorities semantics are
+respected.
+
+The principle is as follows. When an Ada task T is about to start
+running, it checks whether some other Ada task R with the same
+priority as T has been suspended due to the loss of priority
+inheritance. If this is the case, T yields and is placed at the end of
+its priority queue. When R arrives at the front of the queue it
+executes.
+
+Note that this simple scheme preserves the relative order of the tasks
+that were ready to execute in the priority queue where R has been
+placed at the end.
+
+@node GNAT Implementation of Shared Passive Packages
+@section GNAT Implementation of Shared Passive Packages
+@cindex Shared passive packages
+
+@noindent
+GNAT fully implements the pragma @code{Shared_Passive} for
+@cindex pragma @code{Shared_Passive}
+the purpose of designating shared passive packages.
+This allows the use of passive partitions in the
+context described in the Ada Reference Manual; i.e., for communication
+between separate partitions of a distributed application using the
+features in Annex E.
+@cindex Annex E
+@cindex Distribution Systems Annex
+
+However, the implementation approach used by GNAT provides for more
+extensive usage as follows:
+
+@table @emph
+@item Communication between separate programs
+
+This allows separate programs to access the data in passive
+partitions, using protected objects for synchronization where
+needed. The only requirement is that the two programs have a
+common shared file system. It is even possible for programs
+running on different machines with different architectures
+(e.g.@: different endianness) to communicate via the data in
+a passive partition.
+
+@item Persistence between program runs
+
+The data in a passive package can persist from one run of a
+program to another, so that a later program sees the final
+values stored by a previous run of the same program.
+
+@end table
+
+@noindent
+The implementation approach used is to store the data in files. A
+separate stream file is created for each object in the package, and
+an access to an object causes the corresponding file to be read or
+written.
+
+The environment variable @code{SHARED_MEMORY_DIRECTORY} should be
+@cindex @code{SHARED_MEMORY_DIRECTORY} environment variable
+set to the directory to be used for these files.
+The files in this directory
+have names that correspond to their fully qualified names. For
+example, if we have the package
+
+@smallexample @c ada
+package X is
+ pragma Shared_Passive (X);
+ Y : Integer;
+ Z : Float;
+end X;
+@end smallexample
+
+@noindent
+and the environment variable is set to @code{/stemp/}, then the files created
+will have the names:
+
+@smallexample
+/stemp/x.y
+/stemp/x.z
+@end smallexample
+
+@noindent
+These files are created when a value is initially written to the object, and
+the files are retained until manually deleted. This provides the persistence
+semantics. If no file exists, it means that no partition has assigned a value
+to the variable; in this case the initial value declared in the package
+will be used. This model ensures that there are no issues in synchronizing
+the elaboration process, since elaboration of passive packages elaborates the
+initial values, but does not create the files.
+
+The files are written using normal @code{Stream_IO} access.
+If you want to be able
+to communicate between programs or partitions running on different
+architectures, then you should use the XDR versions of the stream attribute
+routines, since these are architecture independent.
+
+If active synchronization is required for access to the variables in the
+shared passive package, then as described in the Ada Reference Manual, the
+package may contain protected objects used for this purpose. In this case
+a lock file (whose name is @file{___lock} (three underscores)
+is created in the shared memory directory.
+@cindex @file{___lock} file (for shared passive packages)
+This is used to provide the required locking
+semantics for proper protected object synchronization.
+
+As of January 2003, GNAT supports shared passive packages on all platforms
+except for OpenVMS.
+
+@node Code Generation for Array Aggregates
+@section Code Generation for Array Aggregates
+
+@menu
+* Static constant aggregates with static bounds::
+* Constant aggregates with unconstrained nominal types::
+* Aggregates with static bounds::
+* Aggregates with non-static bounds::
+* Aggregates in assignment statements::
+@end menu
+
+@noindent
+Aggregates have a rich syntax and allow the user to specify the values of
+complex data structures by means of a single construct. As a result, the
+code generated for aggregates can be quite complex and involve loops, case
+statements and multiple assignments. In the simplest cases, however, the
+compiler will recognize aggregates whose components and constraints are
+fully static, and in those cases the compiler will generate little or no
+executable code. The following is an outline of the code that GNAT generates
+for various aggregate constructs. For further details, you will find it
+useful to examine the output produced by the -gnatG flag to see the expanded
+source that is input to the code generator. You may also want to examine
+the assembly code generated at various levels of optimization.
+
+The code generated for aggregates depends on the context, the component values,
+and the type. In the context of an object declaration the code generated is
+generally simpler than in the case of an assignment. As a general rule, static
+component values and static subtypes also lead to simpler code.
+
+@node Static constant aggregates with static bounds
+@subsection Static constant aggregates with static bounds
+
+@noindent
+For the declarations:
+@smallexample @c ada
+ type One_Dim is array (1..10) of integer;
+ ar0 : constant One_Dim := (1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
+@end smallexample
+
+@noindent
+GNAT generates no executable code: the constant ar0 is placed in static memory.
+The same is true for constant aggregates with named associations:
+
+@smallexample @c ada
+ Cr1 : constant One_Dim := (4 => 16, 2 => 4, 3 => 9, 1 => 1, 5 .. 10 => 0);
+ Cr3 : constant One_Dim := (others => 7777);
+@end smallexample
+
+@noindent
+The same is true for multidimensional constant arrays such as:
+
+@smallexample @c ada
+ type two_dim is array (1..3, 1..3) of integer;
+ Unit : constant two_dim := ( (1,0,0), (0,1,0), (0,0,1));
+@end smallexample
+
+@noindent
+The same is true for arrays of one-dimensional arrays: the following are
+static:
+
+@smallexample @c ada
+type ar1b is array (1..3) of boolean;
+type ar_ar is array (1..3) of ar1b;
+None : constant ar1b := (others => false); -- fully static
+None2 : constant ar_ar := (1..3 => None); -- fully static
+@end smallexample
+
+@noindent
+However, for multidimensional aggregates with named associations, GNAT will
+generate assignments and loops, even if all associations are static. The
+following two declarations generate a loop for the first dimension, and
+individual component assignments for the second dimension:
+
+@smallexample @c ada
+Zero1: constant two_dim := (1..3 => (1..3 => 0));
+Zero2: constant two_dim := (others => (others => 0));
+@end smallexample
+
+@node Constant aggregates with unconstrained nominal types
+@subsection Constant aggregates with unconstrained nominal types
+
+@noindent
+In such cases the aggregate itself establishes the subtype, so that
+associations with @code{others} cannot be used. GNAT determines the
+bounds for the actual subtype of the aggregate, and allocates the
+aggregate statically as well. No code is generated for the following:
+
+@smallexample @c ada
+ type One_Unc is array (natural range <>) of integer;
+ Cr_Unc : constant One_Unc := (12,24,36);
+@end smallexample
+
+@node Aggregates with static bounds
+@subsection Aggregates with static bounds
+
+@noindent
+In all previous examples the aggregate was the initial (and immutable) value
+of a constant. If the aggregate initializes a variable, then code is generated
+for it as a combination of individual assignments and loops over the target
+object. The declarations
+
+@smallexample @c ada
+ Cr_Var1 : One_Dim := (2, 5, 7, 11, 0, 0, 0, 0, 0, 0);
+ Cr_Var2 : One_Dim := (others > -1);
+@end smallexample
+
+@noindent
+generate the equivalent of
+
+@smallexample @c ada
+ Cr_Var1 (1) := 2;
+ Cr_Var1 (2) := 3;
+ Cr_Var1 (3) := 5;
+ Cr_Var1 (4) := 11;
+
+ for I in Cr_Var2'range loop
+ Cr_Var2 (I) := -1;
+ end loop;
+@end smallexample
+
+@node Aggregates with non-static bounds
+@subsection Aggregates with non-static bounds
+
+@noindent
+If the bounds of the aggregate are not statically compatible with the bounds
+of the nominal subtype of the target, then constraint checks have to be
+generated on the bounds. For a multidimensional array, constraint checks may
+have to be applied to sub-arrays individually, if they do not have statically
+compatible subtypes.
+
+@node Aggregates in assignment statements
+@subsection Aggregates in assignment statements
+
+@noindent
+In general, aggregate assignment requires the construction of a temporary,
+and a copy from the temporary to the target of the assignment. This is because
+it is not always possible to convert the assignment into a series of individual
+component assignments. For example, consider the simple case:
+
+@smallexample @c ada
+ A := (A(2), A(1));
+@end smallexample
+
+@noindent
+This cannot be converted into:
+
+@smallexample @c ada
+ A(1) := A(2);
+ A(2) := A(1);
+@end smallexample
+
+@noindent
+So the aggregate has to be built first in a separate location, and then
+copied into the target. GNAT recognizes simple cases where this intermediate
+step is not required, and the assignments can be performed in place, directly
+into the target. The following sufficient criteria are applied:
+
+@itemize @bullet
+@item
+The bounds of the aggregate are static, and the associations are static.
+@item
+The components of the aggregate are static constants, names of
+simple variables that are not renamings, or expressions not involving
+indexed components whose operands obey these rules.
+@end itemize
+
+@noindent
+If any of these conditions are violated, the aggregate will be built in
+a temporary (created either by the front-end or the code generator) and then
+that temporary will be copied onto the target.
+
+@node The Size of Discriminated Records with Default Discriminants
+@section The Size of Discriminated Records with Default Discriminants
+
+@noindent
+If a discriminated type @code{T} has discriminants with default values, it is
+possible to declare an object of this type without providing an explicit
+constraint:
+
+@smallexample @c ada
+@group
+type Size is range 1..100;
+
+type Rec (D : Size := 15) is record
+ Name : String (1..D);
+end T;
+
+Word : Rec;
+@end group
+@end smallexample
+
+@noindent
+Such an object is said to be @emph{unconstrained}.
+The discriminant of the object
+can be modified by a full assignment to the object, as long as it preserves the
+relation between the value of the discriminant, and the value of the components
+that depend on it:
+
+@smallexample @c ada
+@group
+Word := (3, "yes");
+
+Word := (5, "maybe");
+
+Word := (5, "no"); -- raises Constraint_Error
+@end group
+@end smallexample
+
+@noindent
+In order to support this behavior efficiently, an unconstrained object is
+given the maximum size that any value of the type requires. In the case
+above, @code{Word} has storage for the discriminant and for
+a @code{String} of length 100.
+It is important to note that unconstrained objects do not require dynamic
+allocation. It would be an improper implementation to place on the heap those
+components whose size depends on discriminants. (This improper implementation
+was used by some Ada83 compilers, where the @code{Name} component above
+would have
+been stored as a pointer to a dynamic string). Following the principle that
+dynamic storage management should never be introduced implicitly,
+an Ada compiler should reserve the full size for an unconstrained declared
+object, and place it on the stack.
+
+This maximum size approach
+has been a source of surprise to some users, who expect the default
+values of the discriminants to determine the size reserved for an
+unconstrained object: ``If the default is 15, why should the object occupy
+a larger size?''
+The answer, of course, is that the discriminant may be later modified,
+and its full range of values must be taken into account. This is why the
+declaration:
+
+@smallexample
+@group
+type Rec (D : Positive := 15) is record
+ Name : String (1..D);
+end record;
+
+Too_Large : Rec;
+@end group
+@end smallexample
+
+@noindent
+is flagged by the compiler with a warning:
+an attempt to create @code{Too_Large} will raise @code{Storage_Error},
+because the required size includes @code{Positive'Last}
+bytes. As the first example indicates, the proper approach is to declare an
+index type of ``reasonable'' range so that unconstrained objects are not too
+large.
+
+One final wrinkle: if the object is declared to be @code{aliased}, or if it is
+created in the heap by means of an allocator, then it is @emph{not}
+unconstrained:
+it is constrained by the default values of the discriminants, and those values
+cannot be modified by full assignment. This is because in the presence of
+aliasing all views of the object (which may be manipulated by different tasks,
+say) must be consistent, so it is imperative that the object, once created,
+remain invariant.
+
+@node Strict Conformance to the Ada Reference Manual
+@section Strict Conformance to the Ada Reference Manual
+
+@noindent
+The dynamic semantics defined by the Ada Reference Manual impose a set of
+run-time checks to be generated. By default, the GNAT compiler will insert many
+run-time checks into the compiled code, including most of those required by the
+Ada Reference Manual. However, there are three checks that are not enabled
+in the default mode for efficiency reasons: arithmetic overflow checking for
+integer operations (including division by zero), checks for access before
+elaboration on subprogram calls, and stack overflow checking (most operating
+systems do not perform this check by default).
+
+Strict conformance to the Ada Reference Manual can be achieved by adding
+three compiler options for overflow checking for integer operations
+(@option{-gnato}), dynamic checks for access-before-elaboration on subprogram
+calls and generic instantiations (@option{-gnatE}), and stack overflow
+checking (@option{-fstack-check}).
+
+Note that the result of a floating point arithmetic operation in overflow and
+invalid situations, when the @code{Machine_Overflows} attribute of the result
+type is @code{False}, is to generate IEEE NaN and infinite values. This is the
+case for machines compliant with the IEEE floating-point standard, but on
+machines that are not fully compliant with this standard, such as Alpha, the
+@option{-mieee} compiler flag must be used for achieving IEEE confirming
+behavior (although at the cost of a significant performance penalty), so
+infinite and NaN values are properly generated.
+
+
+@node Implementation of Ada 2012 Features
+@chapter Implementation of Ada 2012 Features
+@cindex Ada 2012 implementation status
+
+This chapter contains a complete list of Ada 2012 features that have been
+implemented as of GNAT version 6.4. Generally, these features are only
+available if the @option{-gnat12} (Ada 2012 features enabled) flag is set
+@cindex @option{-gnat12} option
+or if the configuration pragma @code{Ada_2012} is used.
+@cindex pragma @code{Ada_2012}
+@cindex configuration pragma @code{Ada_2012}
+@cindex @code{Ada_2012} configuration pragma
+However, new pragmas, attributes, and restrictions are
+unconditionally available, since the Ada 95 standard allows the addition of
+new pragmas, attributes, and restrictions (there are exceptions, which are
+documented in the individual descriptions), and also certain packages
+were made available in earlier versions of Ada.
+
+An ISO date (YYYY-MM-DD) appears in parentheses on the description line.
+This date shows the implementation date of the feature. Any wavefront
+subsequent to this date will contain the indicated feature, as will any
+subsequent releases. A date of 0000-00-00 means that GNAT has always
+implemented the feature, or implemented it as soon as it appeared as a
+binding interpretation.
+
+Each feature corresponds to an Ada Issue (``AI'') approved by the Ada
+standardization group (ISO/IEC JTC1/SC22/WG9) for inclusion in Ada 2012.
+The features are ordered based on the relevant sections of the Ada
+Reference Manual (``RM''). When a given AI relates to multiple points
+in the RM, the earliest is used.
+
+A complete description of the AIs may be found in
+@url{www.ada-auth.org/ai05-summary.html}.
+
+@itemize @bullet
+
+@item
+@emph{AI-0176 Quantified expressions (2010-09-29)}
+@cindex AI-0176 (Ada 2012 feature)
+
+@noindent
+ Both universally and existentially quantified expressions are implemented.
+ They use the new syntax for iterators proposed in AI05-139-2, as well as
+ the standard Ada loop syntax.
+
+@noindent
+ RM References: 1.01.04 (12) 2.09 (2/2) 4.04 (7) 4.05.09 (0)
+
+@item
+@emph{AI-0079 Allow @i{other_format} characters in source (2010-07-10)}
+@cindex AI-0079 (Ada 2012 feature)
+
+@noindent
+ Wide characters in the unicode category @i{other_format} are now allowed in
+ source programs between tokens, but not within a token such as an identifier.
+
+@noindent
+ RM References: 2.01 (4/2) 2.02 (7)
+
+@item
+@emph{AI-0091 Do not allow @i{other_format} in identifiers (0000-00-00)}
+@cindex AI-0091 (Ada 2012 feature)
+
+@noindent
+ Wide characters in the unicode category @i{other_format} are not permitted
+ within an identifier, since this can be a security problem. The error
+ message for this case has been improved to be more specific, but GNAT has
+ never allowed such characters to appear in identifiers.
+
+@noindent
+ RM References: 2.03 (3.1/2) 2.03 (4/2) 2.03 (5/2) 2.03 (5.1/2) 2.03 (5.2/2) 2.03 (5.3/2) 2.09 (2/2)
+
+@item
+@emph{AI-0100 Placement of pragmas (2010-07-01)}
+@cindex AI-0100 (Ada 2012 feature)
+
+@noindent
+ This AI is an earlier version of AI-163. It simplifies the rules
+ for legal placement of pragmas. In the case of lists that allow pragmas, if
+ the list may have no elements, then the list may consist solely of pragmas.
+
+@noindent
+ RM References: 2.08 (7)
+
+@item
+@emph{AI-0163 Pragmas in place of null (2010-07-01)}
+@cindex AI-0163 (Ada 2012 feature)
+
+@noindent
+ A statement sequence may be composed entirely of pragmas. It is no longer
+ necessary to add a dummy @code{null} statement to make the sequence legal.
+
+@noindent
+ RM References: 2.08 (7) 2.08 (16)
+
+
+@item
+@emph{AI-0080 ``View of'' not needed if clear from context (0000-00-00)}
+@cindex AI-0080 (Ada 2012 feature)
+
+@noindent
+ This is an editorial change only, described as non-testable in the AI.
+
+@noindent
+ RM References: 3.01 (7)
+
+
+@item
+@emph{AI-0183 Aspect specifications (2010-08-16)}
+@cindex AI-0183 (Ada 2012 feature)
+
+@noindent
+ Aspect specifications have been fully implemented except for pre and post-
+ conditions, and type invariants, which have their own separate AI's. All
+ forms of declarations listed in the AI are supported. The following is a
+ list of the aspects supported (with GNAT implementation aspects marked)
+
+@multitable {@code{Preelaborable_Initialization}} {--GNAT}
+@item @code{Ada_2005} @tab -- GNAT
+@item @code{Ada_2012} @tab -- GNAT
+@item @code{Address} @tab
+@item @code{Alignment} @tab
+@item @code{Atomic} @tab
+@item @code{Atomic_Components} @tab
+@item @code{Bit_Order} @tab
+@item @code{Component_Size} @tab
+@item @code{Contract_Cases} @tab -- GNAT
+@item @code{Discard_Names} @tab
+@item @code{External_Tag} @tab
+@item @code{Favor_Top_Level} @tab -- GNAT
+@item @code{Inline} @tab
+@item @code{Inline_Always} @tab -- GNAT
+@item @code{Invariant} @tab -- GNAT
+@item @code{Machine_Radix} @tab
+@item @code{No_Return} @tab
+@item @code{Object_Size} @tab -- GNAT
+@item @code{Pack} @tab
+@item @code{Persistent_BSS} @tab -- GNAT
+@item @code{Post} @tab
+@item @code{Pre} @tab
+@item @code{Predicate} @tab
+@item @code{Preelaborable_Initialization} @tab
+@item @code{Pure_Function} @tab -- GNAT
+@item @code{Remote_Access_Type} @tab -- GNAT
+@item @code{Shared} @tab -- GNAT
+@item @code{Size} @tab
+@item @code{Storage_Pool} @tab
+@item @code{Storage_Size} @tab
+@item @code{Stream_Size} @tab
+@item @code{Suppress} @tab
+@item @code{Suppress_Debug_Info} @tab -- GNAT
+@item @code{Test_Case} @tab -- GNAT
+@item @code{Type_Invariant} @tab
+@item @code{Unchecked_Union} @tab
+@item @code{Universal_Aliasing} @tab -- GNAT
+@item @code{Unmodified} @tab -- GNAT
+@item @code{Unreferenced} @tab -- GNAT
+@item @code{Unreferenced_Objects} @tab -- GNAT
+@item @code{Unsuppress} @tab
+@item @code{Value_Size} @tab -- GNAT
+@item @code{Volatile} @tab
+@item @code{Volatile_Components}
+@item @code{Warnings} @tab -- GNAT
+@end multitable
+
+@noindent
+ Note that for aspects with an expression, e.g. @code{Size}, the expression is
+ treated like a default expression (visibility is analyzed at the point of
+ occurrence of the aspect, but evaluation of the expression occurs at the
+ freeze point of the entity involved).
+
+@noindent
+ RM References: 3.02.01 (3) 3.02.02 (2) 3.03.01 (2/2) 3.08 (6)
+ 3.09.03 (1.1/2) 6.01 (2/2) 6.07 (2/2) 9.05.02 (2/2) 7.01 (3) 7.03
+ (2) 7.03 (3) 9.01 (2/2) 9.01 (3/2) 9.04 (2/2) 9.04 (3/2)
+ 9.05.02 (2/2) 11.01 (2) 12.01 (3) 12.03 (2/2) 12.04 (2/2) 12.05 (2)
+ 12.06 (2.1/2) 12.06 (2.2/2) 12.07 (2) 13.01 (0.1/2) 13.03 (5/1)
+ 13.03.01 (0)
+
+
+@item
+@emph{AI-0128 Inequality is a primitive operation (0000-00-00)}
+@cindex AI-0128 (Ada 2012 feature)
+
+@noindent
+ If an equality operator ("=") is declared for a type, then the implicitly
+ declared inequality operator ("/=") is a primitive operation of the type.
+ This is the only reasonable interpretation, and is the one always implemented
+ by GNAT, but the RM was not entirely clear in making this point.
+
+@noindent
+ RM References: 3.02.03 (6) 6.06 (6)
+
+@item
+@emph{AI-0003 Qualified expressions as names (2010-07-11)}
+@cindex AI-0003 (Ada 2012 feature)
+
+@noindent
+ In Ada 2012, a qualified expression is considered to be syntactically a name,
+ meaning that constructs such as @code{A'(F(X)).B} are now legal. This is
+ useful in disambiguating some cases of overloading.
+
+@noindent
+ RM References: 3.03 (11) 3.03 (21) 4.01 (2) 4.04 (7) 4.07 (3)
+ 5.04 (7)
+
+@item
+@emph{AI-0120 Constant instance of protected object (0000-00-00)}
+@cindex AI-0120 (Ada 2012 feature)
+
+@noindent
+ This is an RM editorial change only. The section that lists objects that are
+ constant failed to include the current instance of a protected object
+ within a protected function. This has always been treated as a constant
+ in GNAT.
+
+@noindent
+ RM References: 3.03 (21)
+
+@item
+@emph{AI-0008 General access to constrained objects (0000-00-00)}
+@cindex AI-0008 (Ada 2012 feature)
+
+@noindent
+ The wording in the RM implied that if you have a general access to a
+ constrained object, it could be used to modify the discriminants. This was
+ obviously not intended. @code{Constraint_Error} should be raised, and GNAT
+ has always done so in this situation.
+
+@noindent
+ RM References: 3.03 (23) 3.10.02 (26/2) 4.01 (9) 6.04.01 (17) 8.05.01 (5/2)
+
+
+@item
+@emph{AI-0093 Additional rules use immutably limited (0000-00-00)}
+@cindex AI-0093 (Ada 2012 feature)
+
+@noindent
+ This is an editorial change only, to make more widespread use of the Ada 2012
+ ``immutably limited''.
+
+@noindent
+ RM References: 3.03 (23.4/3)
+
+
+
+@item
+@emph{AI-0096 Deriving from formal private types (2010-07-20)}
+@cindex AI-0096 (Ada 2012 feature)
+
+@noindent
+ In general it is illegal for a type derived from a formal limited type to be
+ nonlimited. This AI makes an exception to this rule: derivation is legal
+ if it appears in the private part of the generic, and the formal type is not
+ tagged. If the type is tagged, the legality check must be applied to the
+ private part of the package.
+
+@noindent
+ RM References: 3.04 (5.1/2) 6.02 (7)
+
+
+@item
+@emph{AI-0181 Soft hyphen is a non-graphic character (2010-07-23)}
+@cindex AI-0181 (Ada 2012 feature)
+
+@noindent
+ From Ada 2005 on, soft hyphen is considered a non-graphic character, which
+ means that it has a special name (@code{SOFT_HYPHEN}) in conjunction with the
+ @code{Image} and @code{Value} attributes for the character types. Strictly
+ speaking this is an inconsistency with Ada 95, but in practice the use of
+ these attributes is so obscure that it will not cause problems.
+
+@noindent
+ RM References: 3.05.02 (2/2) A.01 (35/2) A.03.03 (21)
+
+
+@item
+@emph{AI-0182 Additional forms for @code{Character'Value} (0000-00-00)}
+@cindex AI-0182 (Ada 2012 feature)
+
+@noindent
+ This AI allows @code{Character'Value} to accept the string @code{'?'} where
+ @code{?} is any character including non-graphic control characters. GNAT has
+ always accepted such strings. It also allows strings such as
+ @code{HEX_00000041} to be accepted, but GNAT does not take advantage of this
+ permission and raises @code{Constraint_Error}, as is certainly still
+ permitted.
+
+@noindent
+ RM References: 3.05 (56/2)
+
+
+@item
+@emph{AI-0214 Defaulted discriminants for limited tagged (2010-10-01)}
+@cindex AI-0214 (Ada 2012 feature)
+
+@noindent
+ Ada 2012 relaxes the restriction that forbids discriminants of tagged types
+ to have default expressions by allowing them when the type is limited. It
+ is often useful to define a default value for a discriminant even though
+ it can't be changed by assignment.
+
+@noindent
+ RM References: 3.07 (9.1/2) 3.07.02 (3)
+
+
+@item
+@emph{AI-0102 Some implicit conversions are illegal (0000-00-00)}
+@cindex AI-0102 (Ada 2012 feature)
+
+@noindent
+ It is illegal to assign an anonymous access constant to an anonymous access
+ variable. The RM did not have a clear rule to prevent this, but GNAT has
+ always generated an error for this usage.
+
+@noindent
+ RM References: 3.07 (16) 3.07.01 (9) 6.04.01 (6) 8.06 (27/2)
+
+
+@item
+@emph{AI-0158 Generalizing membership tests (2010-09-16)}
+@cindex AI-0158 (Ada 2012 feature)
+
+@noindent
+ This AI extends the syntax of membership tests to simplify complex conditions
+ that can be expressed as membership in a subset of values of any type. It
+ introduces syntax for a list of expressions that may be used in loop contexts
+ as well.
+
+@noindent
+ RM References: 3.08.01 (5) 4.04 (3) 4.05.02 (3) 4.05.02 (5) 4.05.02 (27)
+
+
+@item
+@emph{AI-0173 Testing if tags represent abstract types (2010-07-03)}
+@cindex AI-0173 (Ada 2012 feature)
+
+@noindent
+ The function @code{Ada.Tags.Type_Is_Abstract} returns @code{True} if invoked
+ with the tag of an abstract type, and @code{False} otherwise.
+
+@noindent
+ RM References: 3.09 (7.4/2) 3.09 (12.4/2)
+
+
+
+@item
+@emph{AI-0076 function with controlling result (0000-00-00)}
+@cindex AI-0076 (Ada 2012 feature)
+
+@noindent
+ This is an editorial change only. The RM defines calls with controlling
+ results, but uses the term ``function with controlling result'' without an
+ explicit definition.
+
+@noindent
+ RM References: 3.09.02 (2/2)
+
+
+@item
+@emph{AI-0126 Dispatching with no declared operation (0000-00-00)}
+@cindex AI-0126 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies dispatching rules, and simply confirms that dispatching
+ executes the operation of the parent type when there is no explicitly or
+ implicitly declared operation for the descendant type. This has always been
+ the case in all versions of GNAT.
+
+@noindent
+ RM References: 3.09.02 (20/2) 3.09.02 (20.1/2) 3.09.02 (20.2/2)
+
+
+@item
+@emph{AI-0097 Treatment of abstract null extension (2010-07-19)}
+@cindex AI-0097 (Ada 2012 feature)
+
+@noindent
+ The RM as written implied that in some cases it was possible to create an
+ object of an abstract type, by having an abstract extension inherit a non-
+ abstract constructor from its parent type. This mistake has been corrected
+ in GNAT and in the RM, and this construct is now illegal.
+
+@noindent
+ RM References: 3.09.03 (4/2)
+
+
+@item
+@emph{AI-0203 Extended return cannot be abstract (0000-00-00)}
+@cindex AI-0203 (Ada 2012 feature)
+
+@noindent
+ A return_subtype_indication cannot denote an abstract subtype. GNAT has never
+ permitted such usage.
+
+@noindent
+ RM References: 3.09.03 (8/3)
+
+
+@item
+@emph{AI-0198 Inheriting abstract operators (0000-00-00)}
+@cindex AI-0198 (Ada 2012 feature)
+
+@noindent
+ This AI resolves a conflict between two rules involving inherited abstract
+ operations and predefined operators. If a derived numeric type inherits
+ an abstract operator, it overrides the predefined one. This interpretation
+ was always the one implemented in GNAT.
+
+@noindent
+ RM References: 3.09.03 (4/3)
+
+@item
+@emph{AI-0073 Functions returning abstract types (2010-07-10)}
+@cindex AI-0073 (Ada 2012 feature)
+
+@noindent
+ This AI covers a number of issues regarding returning abstract types. In
+ particular generic functions cannot have abstract result types or access
+ result types designated an abstract type. There are some other cases which
+ are detailed in the AI. Note that this binding interpretation has not been
+ retrofitted to operate before Ada 2012 mode, since it caused a significant
+ number of regressions.
+
+@noindent
+ RM References: 3.09.03 (8) 3.09.03 (10) 6.05 (8/2)
+
+
+@item
+@emph{AI-0070 Elaboration of interface types (0000-00-00)}
+@cindex AI-0070 (Ada 2012 feature)
+
+@noindent
+ This is an editorial change only, there are no testable consequences short of
+ checking for the absence of generated code for an interface declaration.
+
+@noindent
+ RM References: 3.09.04 (18/2)
+
+
+@item
+@emph{AI-0208 Characteristics of incomplete views (0000-00-00)}
+@cindex AI-0208 (Ada 2012 feature)
+
+@noindent
+ The wording in the Ada 2005 RM concerning characteristics of incomplete views
+ was incorrect and implied that some programs intended to be legal were now
+ illegal. GNAT had never considered such programs illegal, so it has always
+ implemented the intent of this AI.
+
+@noindent
+ RM References: 3.10.01 (2.4/2) 3.10.01 (2.6/2)
+
+
+@item
+@emph{AI-0162 Incomplete type completed by partial view (2010-09-15)}
+@cindex AI-0162 (Ada 2012 feature)
+
+@noindent
+ Incomplete types are made more useful by allowing them to be completed by
+ private types and private extensions.
+
+@noindent
+ RM References: 3.10.01 (2.5/2) 3.10.01 (2.6/2) 3.10.01 (3) 3.10.01 (4/2)
+
+
+
+@item
+@emph{AI-0098 Anonymous subprogram access restrictions (0000-00-00)}
+@cindex AI-0098 (Ada 2012 feature)
+
+@noindent
+ An unintentional omission in the RM implied some inconsistent restrictions on
+ the use of anonymous access to subprogram values. These restrictions were not
+ intentional, and have never been enforced by GNAT.
+
+@noindent
+ RM References: 3.10.01 (6) 3.10.01 (9.2/2)
+
+
+@item
+@emph{AI-0199 Aggregate with anonymous access components (2010-07-14)}
+@cindex AI-0199 (Ada 2012 feature)
+
+@noindent
+ A choice list in a record aggregate can include several components of
+ (distinct) anonymous access types as long as they have matching designated
+ subtypes.
+
+@noindent
+ RM References: 4.03.01 (16)
+
+
+@item
+@emph{AI-0220 Needed components for aggregates (0000-00-00)}
+@cindex AI-0220 (Ada 2012 feature)
+
+@noindent
+ This AI addresses a wording problem in the RM that appears to permit some
+ complex cases of aggregates with non-static discriminants. GNAT has always
+ implemented the intended semantics.
+
+@noindent
+ RM References: 4.03.01 (17)
+
+@item
+@emph{AI-0147 Conditional expressions (2009-03-29)}
+@cindex AI-0147 (Ada 2012 feature)
+
+@noindent
+ Conditional expressions are permitted. The form of such an expression is:
+
+@smallexample
+ (@b{if} @i{expr} @b{then} @i{expr} @{@b{elsif} @i{expr} @b{then} @i{expr}@} [@b{else} @i{expr}])
+@end smallexample
+
+ The parentheses can be omitted in contexts where parentheses are present
+ anyway, such as subprogram arguments and pragma arguments. If the @b{else}
+ clause is omitted, @b{else True} is assumed;
+ thus @code{(@b{if} A @b{then} B)} is a way to conveniently represent
+ @emph{(A implies B)} in standard logic.
+
+@noindent
+ RM References: 4.03.03 (15) 4.04 (1) 4.04 (7) 4.05.07 (0) 4.07 (2)
+ 4.07 (3) 4.09 (12) 4.09 (33) 5.03 (3) 5.03 (4) 7.05 (2.1/2)
+
+
+@item
+@emph{AI-0037 Out-of-range box associations in aggregate (0000-00-00)}
+@cindex AI-0037 (Ada 2012 feature)
+
+@noindent
+ This AI confirms that an association of the form @code{Indx => <>} in an
+ array aggregate must raise @code{Constraint_Error} if @code{Indx}
+ is out of range. The RM specified a range check on other associations, but
+ not when the value of the association was defaulted. GNAT has always inserted
+ a constraint check on the index value.
+
+@noindent
+ RM References: 4.03.03 (29)
+
+
+@item
+@emph{AI-0123 Composability of equality (2010-04-13)}
+@cindex AI-0123 (Ada 2012 feature)
+
+@noindent
+ Equality of untagged record composes, so that the predefined equality for a
+ composite type that includes a component of some untagged record type
+ @code{R} uses the equality operation of @code{R} (which may be user-defined
+ or predefined). This makes the behavior of untagged records identical to that
+ of tagged types in this respect.
+
+ This change is an incompatibility with previous versions of Ada, but it
+ corrects a non-uniformity that was often a source of confusion. Analysis of
+ a large number of industrial programs indicates that in those rare cases
+ where a composite type had an untagged record component with a user-defined
+ equality, either there was no use of the composite equality, or else the code
+ expected the same composability as for tagged types, and thus had a bug that
+ would be fixed by this change.
+
+@noindent
+ RM References: 4.05.02 (9.7/2) 4.05.02 (14) 4.05.02 (15) 4.05.02 (24)
+ 8.05.04 (8)
+
+
+@item
+@emph{AI-0088 The value of exponentiation (0000-00-00)}
+@cindex AI-0088 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies the equivalence rule given for the dynamic semantics of
+ exponentiation: the value of the operation can be obtained by repeated
+ multiplication, but the operation can be implemented otherwise (for example
+ using the familiar divide-by-two-and-square algorithm, even if this is less
+ accurate), and does not imply repeated reads of a volatile base.
+
+@noindent
+ RM References: 4.05.06 (11)
+
+@item
+@emph{AI-0188 Case expressions (2010-01-09)}
+@cindex AI-0188 (Ada 2012 feature)
+
+@noindent
+ Case expressions are permitted. This allows use of constructs such as:
+@smallexample
+ X := (@b{case} Y @b{is when} 1 => 2, @b{when} 2 => 3, @b{when others} => 31)
+@end smallexample
+
+@noindent
+ RM References: 4.05.07 (0) 4.05.08 (0) 4.09 (12) 4.09 (33)
+
+@item
+@emph{AI-0104 Null exclusion and uninitialized allocator (2010-07-15)}
+@cindex AI-0104 (Ada 2012 feature)
+
+@noindent
+ The assignment @code{Ptr := @b{new not null} Some_Ptr;} will raise
+ @code{Constraint_Error} because the default value of the allocated object is
+ @b{null}. This useless construct is illegal in Ada 2012.
+
+@noindent
+ RM References: 4.08 (2)
+
+@item
+@emph{AI-0157 Allocation/Deallocation from empty pool (2010-07-11)}
+@cindex AI-0157 (Ada 2012 feature)
+
+@noindent
+ Allocation and Deallocation from an empty storage pool (i.e. allocation or
+ deallocation of a pointer for which a static storage size clause of zero
+ has been given) is now illegal and is detected as such. GNAT
+ previously gave a warning but not an error.
+
+@noindent
+ RM References: 4.08 (5.3/2) 13.11.02 (4) 13.11.02 (17)
+
+@item
+@emph{AI-0179 Statement not required after label (2010-04-10)}
+@cindex AI-0179 (Ada 2012 feature)
+
+@noindent
+ It is not necessary to have a statement following a label, so a label
+ can appear at the end of a statement sequence without the need for putting a
+ null statement afterwards, but it is not allowable to have only labels and
+ no real statements in a statement sequence.
+
+@noindent
+ RM References: 5.01 (2)
+
+
+@item
+@emph{AI-139-2 Syntactic sugar for iterators (2010-09-29)}
+@cindex AI-139-2 (Ada 2012 feature)
+
+@noindent
+ The new syntax for iterating over arrays and containers is now implemented.
+ Iteration over containers is for now limited to read-only iterators. Only
+ default iterators are supported, with the syntax: @code{@b{for} Elem @b{of} C}.
+
+@noindent
+ RM References: 5.05
+
+@item
+@emph{AI-0134 Profiles must match for full conformance (0000-00-00)}
+@cindex AI-0134 (Ada 2012 feature)
+
+@noindent
+ For full conformance, the profiles of anonymous-access-to-subprogram
+ parameters must match. GNAT has always enforced this rule.
+
+@noindent
+ RM References: 6.03.01 (18)
+
+@item
+@emph{AI-0207 Mode conformance and access constant (0000-00-00)}
+@cindex AI-0207 (Ada 2012 feature)
+
+@noindent
+ This AI confirms that access_to_constant indication must match for mode
+ conformance. This was implemented in GNAT when the qualifier was originally
+ introduced in Ada 2005.
+
+@noindent
+ RM References: 6.03.01 (16/2)
+
+
+@item
+@emph{AI-0046 Null exclusion match for full conformance (2010-07-17)}
+@cindex AI-0046 (Ada 2012 feature)
+
+@noindent
+ For full conformance, in the case of access parameters, the null exclusion
+ must match (either both or neither must have @code{@b{not null}}).
+
+@noindent
+ RM References: 6.03.02 (18)
+
+
+@item
+@emph{AI-0118 The association of parameter associations (0000-00-00)}
+@cindex AI-0118 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies the rules for named associations in subprogram calls and
+ generic instantiations. The rules have been in place since Ada 83.
+
+@noindent
+ RM References: 6.04.01 (2) 12.03 (9)
+
+
+@item
+@emph{AI-0196 Null exclusion tests for out parameters (0000-00-00)}
+@cindex AI-0196 (Ada 2012 feature)
+
+@noindent
+ Null exclusion checks are not made for @code{@b{out}} parameters when
+ evaluating the actual parameters. GNAT has never generated these checks.
+
+@noindent
+ RM References: 6.04.01 (13)
+
+@item
+@emph{AI-0015 Constant return objects (0000-00-00)}
+@cindex AI-0015 (Ada 2012 feature)
+
+@noindent
+ The return object declared in an @i{extended_return_statement} may be
+ declared constant. This was always intended, and GNAT has always allowed it.
+
+@noindent
+ RM References: 6.05 (2.1/2) 3.03 (10/2) 3.03 (21) 6.05 (5/2)
+ 6.05 (5.7/2)
+
+
+@item
+@emph{AI-0032 Extended return for class-wide functions (0000-00-00)}
+@cindex AI-0032 (Ada 2012 feature)
+
+@noindent
+ If a function returns a class-wide type, the object of an extended return
+ statement can be declared with a specific type that is covered by the class-
+ wide type. This has been implemented in GNAT since the introduction of
+ extended returns. Note AI-0103 complements this AI by imposing matching
+ rules for constrained return types.
+
+@noindent
+ RM References: 6.05 (5.2/2) 6.05 (5.3/2) 6.05 (5.6/2) 6.05 (5.8/2)
+ 6.05 (8/2)
+
+@item
+@emph{AI-0103 Static matching for extended return (2010-07-23)}
+@cindex AI-0103 (Ada 2012 feature)
+
+@noindent
+ If the return subtype of a function is an elementary type or a constrained
+ type, the subtype indication in an extended return statement must match
+ statically this return subtype.
+
+@noindent
+ RM References: 6.05 (5.2/2)
+
+
+@item
+@emph{AI-0058 Abnormal completion of an extended return (0000-00-00)}
+@cindex AI-0058 (Ada 2012 feature)
+
+@noindent
+ The RM had some incorrect wording implying wrong treatment of abnormal
+ completion in an extended return. GNAT has always implemented the intended
+ correct semantics as described by this AI.
+
+@noindent
+ RM References: 6.05 (22/2)
+
+
+@item
+@emph{AI-0050 Raising Constraint_Error early for function call (0000-00-00)}
+@cindex AI-0050 (Ada 2012 feature)
+
+@noindent
+ The implementation permissions for raising @code{Constraint_Error} early on a function call when it was clear an exception would be raised were over-permissive and allowed mishandling of discriminants in some cases. GNAT did
+ not take advantage of these incorrect permissions in any case.
+
+@noindent
+ RM References: 6.05 (24/2)
+
+
+@item
+@emph{AI-0125 Nonoverridable operations of an ancestor (2010-09-28)}
+@cindex AI-0125 (Ada 2012 feature)
+
+@noindent
+ In Ada 2012, the declaration of a primitive operation of a type extension
+ or private extension can also override an inherited primitive that is not
+ visible at the point of this declaration.
+
+@noindent
+ RM References: 7.03.01 (6) 8.03 (23) 8.03.01 (5/2) 8.03.01 (6/2)
+
+@item
+@emph{AI-0062 Null exclusions and deferred constants (0000-00-00)}
+@cindex AI-0062 (Ada 2012 feature)
+
+@noindent
+ A full constant may have a null exclusion even if its associated deferred
+ constant does not. GNAT has always allowed this.
+
+@noindent
+ RM References: 7.04 (6/2) 7.04 (7.1/2)
+
+
+@item
+@emph{AI-0178 Incomplete views are limited (0000-00-00)}
+@cindex AI-0178 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies the role of incomplete views and plugs an omission in the
+ RM. GNAT always correctly restricted the use of incomplete views and types.
+
+@noindent
+ RM References: 7.05 (3/2) 7.05 (6/2)
+
+@item
+@emph{AI-0087 Actual for formal nonlimited derived type (2010-07-15)}
+@cindex AI-0087 (Ada 2012 feature)
+
+@noindent
+ The actual for a formal nonlimited derived type cannot be limited. In
+ particular, a formal derived type that extends a limited interface but which
+ is not explicitly limited cannot be instantiated with a limited type.
+
+@noindent
+ RM References: 7.05 (5/2) 12.05.01 (5.1/2)
+
+@item
+@emph{AI-0099 Tag determines whether finalization needed (0000-00-00)}
+@cindex AI-0099 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies that ``needs finalization'' is part of dynamic semantics,
+ and therefore depends on the run-time characteristics of an object (i.e. its
+ tag) and not on its nominal type. As the AI indicates: ``we do not expect
+ this to affect any implementation''.
+
+@noindent
+ RM References: 7.06.01 (6) 7.06.01 (7) 7.06.01 (8) 7.06.01 (9/2)
+
+
+
+@item
+@emph{AI-0064 Redundant finalization rule (0000-00-00)}
+@cindex AI-0064 (Ada 2012 feature)
+
+@noindent
+ This is an editorial change only. The intended behavior is already checked
+ by an existing ACATS test, which GNAT has always executed correctly.
+
+@noindent
+ RM References: 7.06.01 (17.1/1)
+
+@item
+@emph{AI-0026 Missing rules for Unchecked_Union (2010-07-07)}
+@cindex AI-0026 (Ada 2012 feature)
+
+@noindent
+ Record representation clauses concerning Unchecked_Union types cannot mention
+ the discriminant of the type. The type of a component declared in the variant
+ part of an Unchecked_Union cannot be controlled, have controlled components,
+ nor have protected or task parts. If an Unchecked_Union type is declared
+ within the body of a generic unit or its descendants, then the type of a
+ component declared in the variant part cannot be a formal private type or a
+ formal private extension declared within the same generic unit.
+
+@noindent
+ RM References: 7.06 (9.4/2) B.03.03 (9/2) B.03.03 (10/2)
+
+
+@item
+@emph{AI-0205 Extended return declares visible name (0000-00-00)}
+@cindex AI-0205 (Ada 2012 feature)
+
+@noindent
+ This AI corrects a simple omission in the RM. Return objects have always
+ been visible within an extended return statement.
+
+@noindent
+ RM References: 8.03 (17)
+
+
+@item
+@emph{AI-0042 Overriding versus implemented-by (0000-00-00)}
+@cindex AI-0042 (Ada 2012 feature)
+
+@noindent
+ This AI fixes a wording gap in the RM. An operation of a synchronized
+ interface can be implemented by a protected or task entry, but the abstract
+ operation is not being overridden in the usual sense, and it must be stated
+ separately that this implementation is legal. This has always been the case
+ in GNAT.
+
+@noindent
+ RM References: 9.01 (9.2/2) 9.04 (11.1/2)
+
+@item
+@emph{AI-0030 Requeue on synchronized interfaces (2010-07-19)}
+@cindex AI-0030 (Ada 2012 feature)
+
+@noindent
+ Requeue is permitted to a protected, synchronized or task interface primitive
+ providing it is known that the overriding operation is an entry. Otherwise
+ the requeue statement has the same effect as a procedure call. Use of pragma
+ @code{Implemented} provides a way to impose a static requirement on the
+ overriding operation by adhering to one of the implementation kinds: entry,
+ protected procedure or any of the above.
+
+@noindent
+ RM References: 9.05 (9) 9.05.04 (2) 9.05.04 (3) 9.05.04 (5)
+ 9.05.04 (6) 9.05.04 (7) 9.05.04 (12)
+
+
+@item
+@emph{AI-0201 Independence of atomic object components (2010-07-22)}
+@cindex AI-0201 (Ada 2012 feature)
+
+@noindent
+ If an Atomic object has a pragma @code{Pack} or a @code{Component_Size}
+ attribute, then individual components may not be addressable by independent
+ tasks. However, if the representation clause has no effect (is confirming),
+ then independence is not compromised. Furthermore, in GNAT, specification of
+ other appropriately addressable component sizes (e.g. 16 for 8-bit
+ characters) also preserves independence. GNAT now gives very clear warnings
+ both for the declaration of such a type, and for any assignment to its components.
+
+@noindent
+ RM References: 9.10 (1/3) C.06 (22/2) C.06 (23/2)
+
+@item
+@emph{AI-0009 Pragma Independent[_Components] (2010-07-23)}
+@cindex AI-0009 (Ada 2012 feature)
+
+@noindent
+ This AI introduces the new pragmas @code{Independent} and
+ @code{Independent_Components},
+ which control guaranteeing independence of access to objects and components.
+ The AI also requires independence not unaffected by confirming rep clauses.
+
+@noindent
+ RM References: 9.10 (1) 13.01 (15/1) 13.02 (9) 13.03 (13) C.06 (2)
+ C.06 (4) C.06 (6) C.06 (9) C.06 (13) C.06 (14)
+
+
+@item
+@emph{AI-0072 Task signalling using 'Terminated (0000-00-00)}
+@cindex AI-0072 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies that task signalling for reading @code{'Terminated} only
+ occurs if the result is True. GNAT semantics has always been consistent with
+ this notion of task signalling.
+
+@noindent
+ RM References: 9.10 (6.1/1)
+
+@item
+@emph{AI-0108 Limited incomplete view and discriminants (0000-00-00)}
+@cindex AI-0108 (Ada 2012 feature)
+
+@noindent
+ This AI confirms that an incomplete type from a limited view does not have
+ discriminants. This has always been the case in GNAT.
+
+@noindent
+ RM References: 10.01.01 (12.3/2)
+
+@item
+@emph{AI-0129 Limited views and incomplete types (0000-00-00)}
+@cindex AI-0129 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies the description of limited views: a limited view of a
+ package includes only one view of a type that has an incomplete declaration
+ and a full declaration (there is no possible ambiguity in a client package).
+ This AI also fixes an omission: a nested package in the private part has no
+ limited view. GNAT always implemented this correctly.
+
+@noindent
+ RM References: 10.01.01 (12.2/2) 10.01.01 (12.3/2)
+
+
+
+@item
+@emph{AI-0077 Limited withs and scope of declarations (0000-00-00)}
+@cindex AI-0077 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies that a declaration does not include a context clause,
+ and confirms that it is illegal to have a context in which both a limited
+ and a nonlimited view of a package are accessible. Such double visibility
+ was always rejected by GNAT.
+
+@noindent
+ RM References: 10.01.02 (12/2) 10.01.02 (21/2) 10.01.02 (22/2)
+
+@item
+@emph{AI-0122 Private with and children of generics (0000-00-00)}
+@cindex AI-0122 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies the visibility of private children of generic units within
+ instantiations of a parent. GNAT has always handled this correctly.
+
+@noindent
+ RM References: 10.01.02 (12/2)
+
+
+
+@item
+@emph{AI-0040 Limited with clauses on descendant (0000-00-00)}
+@cindex AI-0040 (Ada 2012 feature)
+
+@noindent
+ This AI confirms that a limited with clause in a child unit cannot name
+ an ancestor of the unit. This has always been checked in GNAT.
+
+@noindent
+ RM References: 10.01.02 (20/2)
+
+@item
+@emph{AI-0132 Placement of library unit pragmas (0000-00-00)}
+@cindex AI-0132 (Ada 2012 feature)
+
+@noindent
+ This AI fills a gap in the description of library unit pragmas. The pragma
+ clearly must apply to a library unit, even if it does not carry the name
+ of the enclosing unit. GNAT has always enforced the required check.
+
+@noindent
+ RM References: 10.01.05 (7)
+
+
+@item
+@emph{AI-0034 Categorization of limited views (0000-00-00)}
+@cindex AI-0034 (Ada 2012 feature)
+
+@noindent
+ The RM makes certain limited with clauses illegal because of categorization
+ considerations, when the corresponding normal with would be legal. This is
+ not intended, and GNAT has always implemented the recommended behavior.
+
+@noindent
+ RM References: 10.02.01 (11/1) 10.02.01 (17/2)
+
+
+@item
+@emph{AI-0035 Inconsistencies with Pure units (0000-00-00)}
+@cindex AI-0035 (Ada 2012 feature)
+
+@noindent
+ This AI remedies some inconsistencies in the legality rules for Pure units.
+ Derived access types are legal in a pure unit (on the assumption that the
+ rule for a zero storage pool size has been enforced on the ancestor type).
+ The rules are enforced in generic instances and in subunits. GNAT has always
+ implemented the recommended behavior.
+
+@noindent
+ RM References: 10.02.01 (15.1/2) 10.02.01 (15.4/2) 10.02.01 (15.5/2) 10.02.01 (17/2)
+
+
+@item
+@emph{AI-0219 Pure permissions and limited parameters (2010-05-25)}
+@cindex AI-0219 (Ada 2012 feature)
+
+@noindent
+ This AI refines the rules for the cases with limited parameters which do not
+ allow the implementations to omit ``redundant''. GNAT now properly conforms
+ to the requirements of this binding interpretation.
+
+@noindent
+ RM References: 10.02.01 (18/2)
+
+@item
+@emph{AI-0043 Rules about raising exceptions (0000-00-00)}
+@cindex AI-0043 (Ada 2012 feature)
+
+@noindent
+ This AI covers various omissions in the RM regarding the raising of
+ exceptions. GNAT has always implemented the intended semantics.
+
+@noindent
+ RM References: 11.04.01 (10.1/2) 11 (2)
+
+
+@item
+@emph{AI-0200 Mismatches in formal package declarations (0000-00-00)}
+@cindex AI-0200 (Ada 2012 feature)
+
+@noindent
+ This AI plugs a gap in the RM which appeared to allow some obviously intended
+ illegal instantiations. GNAT has never allowed these instantiations.
+
+@noindent
+ RM References: 12.07 (16)
+
+
+@item
+@emph{AI-0112 Detection of duplicate pragmas (2010-07-24)}
+@cindex AI-0112 (Ada 2012 feature)
+
+@noindent
+ This AI concerns giving names to various representation aspects, but the
+ practical effect is simply to make the use of duplicate
+ @code{Atomic}[@code{_Components}],
+ @code{Volatile}[@code{_Components}] and
+ @code{Independent}[@code{_Components}] pragmas illegal, and GNAT
+ now performs this required check.
+
+@noindent
+ RM References: 13.01 (8)
+
+@item
+@emph{AI-0106 No representation pragmas on generic formals (0000-00-00)}
+@cindex AI-0106 (Ada 2012 feature)
+
+@noindent
+ The RM appeared to allow representation pragmas on generic formal parameters,
+ but this was not intended, and GNAT has never permitted this usage.
+
+@noindent
+ RM References: 13.01 (9.1/1)
+
+
+@item
+@emph{AI-0012 Pack/Component_Size for aliased/atomic (2010-07-15)}
+@cindex AI-0012 (Ada 2012 feature)
+
+@noindent
+ It is now illegal to give an inappropriate component size or a pragma
+ @code{Pack} that attempts to change the component size in the case of atomic
+ or aliased components. Previously GNAT ignored such an attempt with a
+ warning.
+
+@noindent
+ RM References: 13.02 (6.1/2) 13.02 (7) C.06 (10) C.06 (11) C.06 (21)
+
+
+@item
+@emph{AI-0039 Stream attributes cannot be dynamic (0000-00-00)}
+@cindex AI-0039 (Ada 2012 feature)
+
+@noindent
+ The RM permitted the use of dynamic expressions (such as @code{ptr.@b{all})}
+ for stream attributes, but these were never useful and are now illegal. GNAT
+ has always regarded such expressions as illegal.
+
+@noindent
+ RM References: 13.03 (4) 13.03 (6) 13.13.02 (38/2)
+
+
+@item
+@emph{AI-0095 Address of intrinsic subprograms (0000-00-00)}
+@cindex AI-0095 (Ada 2012 feature)
+
+@noindent
+ The prefix of @code{'Address} cannot statically denote a subprogram with
+ convention @code{Intrinsic}. The use of the @code{Address} attribute raises
+ @code{Program_Error} if the prefix denotes a subprogram with convention
+ @code{Intrinsic}.
+
+@noindent
+ RM References: 13.03 (11/1)
+
+
+@item
+@emph{AI-0116 Alignment of class-wide objects (0000-00-00)}
+@cindex AI-0116 (Ada 2012 feature)
+
+@noindent
+ This AI requires that the alignment of a class-wide object be no greater
+ than the alignment of any type in the class. GNAT has always followed this
+ recommendation.
+
+@noindent
+ RM References: 13.03 (29) 13.11 (16)
+
+
+@item
+@emph{AI-0146 Type invariants (2009-09-21)}
+@cindex AI-0146 (Ada 2012 feature)
+
+@noindent
+ Type invariants may be specified for private types using the aspect notation.
+ Aspect @code{Type_Invariant} may be specified for any private type,
+ @code{Type_Invariant'Class} can
+ only be specified for tagged types, and is inherited by any descendent of the
+ tagged types. The invariant is a boolean expression that is tested for being
+ true in the following situations: conversions to the private type, object
+ declarations for the private type that are default initialized, and
+ [@b{in}] @b{out}
+ parameters and returned result on return from any primitive operation for
+ the type that is visible to a client.
+ GNAT defines the synonyms @code{Invariant} for @code{Type_Invariant} and
+ @code{Invariant'Class} for @code{Type_Invariant'Class}.
+
+@noindent
+ RM References: 13.03.03 (00)
+
+@item
+@emph{AI-0078 Relax Unchecked_Conversion alignment rules (0000-00-00)}
+@cindex AI-0078 (Ada 2012 feature)
+
+@noindent
+ In Ada 2012, compilers are required to support unchecked conversion where the
+ target alignment is a multiple of the source alignment. GNAT always supported
+ this case (and indeed all cases of differing alignments, doing copies where
+ required if the alignment was reduced).
+
+@noindent
+ RM References: 13.09 (7)
+
+
+@item
+@emph{AI-0195 Invalid value handling is implementation defined (2010-07-03)}
+@cindex AI-0195 (Ada 2012 feature)
+
+@noindent
+ The handling of invalid values is now designated to be implementation
+ defined. This is a documentation change only, requiring Annex M in the GNAT
+ Reference Manual to document this handling.
+ In GNAT, checks for invalid values are made
+ only when necessary to avoid erroneous behavior. Operations like assignments
+ which cannot cause erroneous behavior ignore the possibility of invalid
+ values and do not do a check. The date given above applies only to the
+ documentation change, this behavior has always been implemented by GNAT.
+
+@noindent
+ RM References: 13.09.01 (10)
+
+@item
+@emph{AI-0193 Alignment of allocators (2010-09-16)}
+@cindex AI-0193 (Ada 2012 feature)
+
+@noindent
+ This AI introduces a new attribute @code{Max_Alignment_For_Allocation},
+ analogous to @code{Max_Size_In_Storage_Elements}, but for alignment instead
+ of size.
+
+@noindent
+ RM References: 13.11 (16) 13.11 (21) 13.11.01 (0) 13.11.01 (1)
+ 13.11.01 (2) 13.11.01 (3)
+
+
+@item
+@emph{AI-0177 Parameterized expressions (2010-07-10)}
+@cindex AI-0177 (Ada 2012 feature)
+
+@noindent
+ The new Ada 2012 notion of parameterized expressions is implemented. The form
+ is:
+@smallexample
+ @i{function specification} @b{is} (@i{expression})
+@end smallexample
+
+@noindent
+ This is exactly equivalent to the
+ corresponding function body that returns the expression, but it can appear
+ in a package spec. Note that the expression must be parenthesized.
+
+@noindent
+ RM References: 13.11.01 (3/2)
+
+@item
+@emph{AI-0033 Attach/Interrupt_Handler in generic (2010-07-24)}
+@cindex AI-0033 (Ada 2012 feature)
+
+@noindent
+ Neither of these two pragmas may appear within a generic template, because
+ the generic might be instantiated at other than the library level.
+
+@noindent
+ RM References: 13.11.02 (16) C.03.01 (7/2) C.03.01 (8/2)
+
+
+@item
+@emph{AI-0161 Restriction No_Default_Stream_Attributes (2010-09-11)}
+@cindex AI-0161 (Ada 2012 feature)
+
+@noindent
+ A new restriction @code{No_Default_Stream_Attributes} prevents the use of any
+ of the default stream attributes for elementary types. If this restriction is
+ in force, then it is necessary to provide explicit subprograms for any
+ stream attributes used.
+
+@noindent
+ RM References: 13.12.01 (4/2) 13.13.02 (40/2) 13.13.02 (52/2)
+
+@item
+@emph{AI-0194 Value of Stream_Size attribute (0000-00-00)}
+@cindex AI-0194 (Ada 2012 feature)
+
+@noindent
+ The @code{Stream_Size} attribute returns the default number of bits in the
+ stream representation of the given type.
+ This value is not affected by the presence
+ of stream subprogram attributes for the type. GNAT has always implemented
+ this interpretation.
+
+@noindent
+ RM References: 13.13.02 (1.2/2)
+
+@item
+@emph{AI-0109 Redundant check in S'Class'Input (0000-00-00)}
+@cindex AI-0109 (Ada 2012 feature)
+
+@noindent
+ This AI is an editorial change only. It removes the need for a tag check
+ that can never fail.
+
+@noindent
+ RM References: 13.13.02 (34/2)
+
+@item
+@emph{AI-0007 Stream read and private scalar types (0000-00-00)}
+@cindex AI-0007 (Ada 2012 feature)
+
+@noindent
+ The RM as written appeared to limit the possibilities of declaring read
+ attribute procedures for private scalar types. This limitation was not
+ intended, and has never been enforced by GNAT.
+
+@noindent
+ RM References: 13.13.02 (50/2) 13.13.02 (51/2)
+
+
+@item
+@emph{AI-0065 Remote access types and external streaming (0000-00-00)}
+@cindex AI-0065 (Ada 2012 feature)
+
+@noindent
+ This AI clarifies the fact that all remote access types support external
+ streaming. This fixes an obvious oversight in the definition of the
+ language, and GNAT always implemented the intended correct rules.
+
+@noindent
+ RM References: 13.13.02 (52/2)
+
+@item
+@emph{AI-0019 Freezing of primitives for tagged types (0000-00-00)}
+@cindex AI-0019 (Ada 2012 feature)
+
+@noindent
+ The RM suggests that primitive subprograms of a specific tagged type are
+ frozen when the tagged type is frozen. This would be an incompatible change
+ and is not intended. GNAT has never attempted this kind of freezing and its
+ behavior is consistent with the recommendation of this AI.
+
+@noindent
+ RM References: 13.14 (2) 13.14 (3/1) 13.14 (8.1/1) 13.14 (10) 13.14 (14) 13.14 (15.1/2)
+
+@item
+@emph{AI-0017 Freezing and incomplete types (0000-00-00)}
+@cindex AI-0017 (Ada 2012 feature)
+
+@noindent
+ So-called ``Taft-amendment types'' (i.e., types that are completed in package
+ bodies) are not frozen by the occurrence of bodies in the
+ enclosing declarative part. GNAT always implemented this properly.
+
+@noindent
+ RM References: 13.14 (3/1)
+
+
+@item
+@emph{AI-0060 Extended definition of remote access types (0000-00-00)}
+@cindex AI-0060 (Ada 2012 feature)
+
+@noindent
+ This AI extends the definition of remote access types to include access
+ to limited, synchronized, protected or task class-wide interface types.
+ GNAT already implemented this extension.
+
+@noindent
+ RM References: A (4) E.02.02 (9/1) E.02.02 (9.2/1) E.02.02 (14/2) E.02.02 (18)
+
+@item
+@emph{AI-0114 Classification of letters (0000-00-00)}
+@cindex AI-0114 (Ada 2012 feature)
+
+@noindent
+ The code points 170 (@code{FEMININE ORDINAL INDICATOR}),
+ 181 (@code{MICRO SIGN}), and
+ 186 (@code{MASCULINE ORDINAL INDICATOR}) are technically considered
+ lower case letters by Unicode.
+ However, they are not allowed in identifiers, and they
+ return @code{False} to @code{Ada.Characters.Handling.Is_Letter/Is_Lower}.
+ This behavior is consistent with that defined in Ada 95.
+
+@noindent
+ RM References: A.03.02 (59) A.04.06 (7)
+
+
+@item
+@emph{AI-0185 Ada.Wide_[Wide_]Characters.Handling (2010-07-06)}
+@cindex AI-0185 (Ada 2012 feature)
+
+@noindent
+ Two new packages @code{Ada.Wide_[Wide_]Characters.Handling} provide
+ classification functions for @code{Wide_Character} and
+ @code{Wide_Wide_Character}, as well as providing
+ case folding routines for @code{Wide_[Wide_]Character} and
+ @code{Wide_[Wide_]String}.
+
+@noindent
+ RM References: A.03.05 (0) A.03.06 (0)
+
+
+@item
+@emph{AI-0031 Add From parameter to Find_Token (2010-07-25)}
+@cindex AI-0031 (Ada 2012 feature)
+
+@noindent
+ A new version of @code{Find_Token} is added to all relevant string packages,
+ with an extra parameter @code{From}. Instead of starting at the first
+ character of the string, the search for a matching Token starts at the
+ character indexed by the value of @code{From}.
+ These procedures are available in all versions of Ada
+ but if used in versions earlier than Ada 2012 they will generate a warning
+ that an Ada 2012 subprogram is being used.
+
+@noindent
+ RM References: A.04.03 (16) A.04.03 (67) A.04.03 (68/1) A.04.04 (51)
+ A.04.05 (46)
+
+
+@item
+@emph{AI-0056 Index on null string returns zero (0000-00-00)}
+@cindex AI-0056 (Ada 2012 feature)
+
+@noindent
+ The wording in the Ada 2005 RM implied an incompatible handling of the
+ @code{Index} functions, resulting in raising an exception instead of
+ returning zero in some situations.
+ This was not intended and has been corrected.
+ GNAT always returned zero, and is thus consistent with this AI.
+
+@noindent
+ RM References: A.04.03 (56.2/2) A.04.03 (58.5/2)
+
+
+@item
+@emph{AI-0137 String encoding package (2010-03-25)}
+@cindex AI-0137 (Ada 2012 feature)
+
+@noindent
+ The packages @code{Ada.Strings.UTF_Encoding}, together with its child
+ packages, @code{Conversions}, @code{Strings}, @code{Wide_Strings},
+ and @code{Wide_Wide_Strings} have been
+ implemented. These packages (whose documentation can be found in the spec
+ files @file{a-stuten.ads}, @file{a-suenco.ads}, @file{a-suenst.ads},
+ @file{a-suewst.ads}, @file{a-suezst.ads}) allow encoding and decoding of
+ @code{String}, @code{Wide_String}, and @code{Wide_Wide_String}
+ values using UTF coding schemes (including UTF-8, UTF-16LE, UTF-16BE, and
+ UTF-16), as well as conversions between the different UTF encodings. With
+ the exception of @code{Wide_Wide_Strings}, these packages are available in
+ Ada 95 and Ada 2005 mode as well as Ada 2012 mode.
+ The @code{Wide_Wide_Strings package}
+ is available in Ada 2005 mode as well as Ada 2012 mode (but not in Ada 95
+ mode since it uses @code{Wide_Wide_Character}).
+
+@noindent
+ RM References: A.04.11
+
+@item
+@emph{AI-0038 Minor errors in Text_IO (0000-00-00)}
+@cindex AI-0038 (Ada 2012 feature)
+
+@noindent
+ These are minor errors in the description on three points. The intent on
+ all these points has always been clear, and GNAT has always implemented the
+ correct intended semantics.
+
+@noindent
+ RM References: A.10.05 (37) A.10.07 (8/1) A.10.07 (10) A.10.07 (12) A.10.08 (10) A.10.08 (24)
+
+@item
+@emph{AI-0044 Restrictions on container instantiations (0000-00-00)}
+@cindex AI-0044 (Ada 2012 feature)
+
+@noindent
+ This AI places restrictions on allowed instantiations of generic containers.
+ These restrictions are not checked by the compiler, so there is nothing to
+ change in the implementation. This affects only the RM documentation.
+
+@noindent
+ RM References: A.18 (4/2) A.18.02 (231/2) A.18.03 (145/2) A.18.06 (56/2) A.18.08 (66/2) A.18.09 (79/2) A.18.26 (5/2) A.18.26 (9/2)
+
+@item
+@emph{AI-0127 Adding Locale Capabilities (2010-09-29)}
+@cindex AI-0127 (Ada 2012 feature)
+
+@noindent
+ This package provides an interface for identifying the current locale.
+
+@noindent
+ RM References: A.19 A.19.01 A.19.02 A.19.03 A.19.05 A.19.06
+ A.19.07 A.19.08 A.19.09 A.19.10 A.19.11 A.19.12 A.19.13
+
+
+
+@item
+@emph{AI-0002 Export C with unconstrained arrays (0000-00-00)}
+@cindex AI-0002 (Ada 2012 feature)
+
+@noindent
+ The compiler is not required to support exporting an Ada subprogram with
+ convention C if there are parameters or a return type of an unconstrained
+ array type (such as @code{String}). GNAT allows such declarations but
+ generates warnings. It is possible, but complicated, to write the
+ corresponding C code and certainly such code would be specific to GNAT and
+ non-portable.
+
+@noindent
+ RM References: B.01 (17) B.03 (62) B.03 (71.1/2)
+
+
+@item
+@emph{AI-0216 No_Task_Hierarchy forbids local tasks (0000-00-00)}
+@cindex AI05-0216 (Ada 2012 feature)
+
+@noindent
+ It is clearly the intention that @code{No_Task_Hierarchy} is intended to
+ forbid tasks declared locally within subprograms, or functions returning task
+ objects, and that is the implementation that GNAT has always provided.
+ However the language in the RM was not sufficiently clear on this point.
+ Thus this is a documentation change in the RM only.
+
+@noindent
+ RM References: D.07 (3/3)
+
+@item
+@emph{AI-0211 No_Relative_Delays forbids Set_Handler use (2010-07-09)}
+@cindex AI-0211 (Ada 2012 feature)
+
+@noindent
+ The restriction @code{No_Relative_Delays} forbids any calls to the subprogram
+ @code{Ada.Real_Time.Timing_Events.Set_Handler}.
+
+@noindent
+ RM References: D.07 (5) D.07 (10/2) D.07 (10.4/2) D.07 (10.7/2)
+
+@item
+@emph{AI-0190 pragma Default_Storage_Pool (2010-09-15)}
+@cindex AI-0190 (Ada 2012 feature)
+
+@noindent
+ This AI introduces a new pragma @code{Default_Storage_Pool}, which can be
+ used to control storage pools globally.
+ In particular, you can force every access
+ type that is used for allocation (@b{new}) to have an explicit storage pool,
+ or you can declare a pool globally to be used for all access types that lack
+ an explicit one.
+
+@noindent
+ RM References: D.07 (8)
+
+@item
+@emph{AI-0189 No_Allocators_After_Elaboration (2010-01-23)}
+@cindex AI-0189 (Ada 2012 feature)
+
+@noindent
+ This AI introduces a new restriction @code{No_Allocators_After_Elaboration},
+ which says that no dynamic allocation will occur once elaboration is
+ completed.
+ In general this requires a run-time check, which is not required, and which
+ GNAT does not attempt. But the static cases of allocators in a task body or
+ in the body of the main program are detected and flagged at compile or bind
+ time.
+
+@noindent
+ RM References: D.07 (19.1/2) H.04 (23.3/2)
+
+@item
+@emph{AI-0171 Pragma CPU and Ravenscar Profile (2010-09-24)}
+@cindex AI-0171 (Ada 2012 feature)
+
+@noindent
+ A new package @code{System.Multiprocessors} is added, together with the
+ definition of pragma @code{CPU} for controlling task affinity. A new no
+ dependence restriction, on @code{System.Multiprocessors.Dispatching_Domains},
+ is added to the Ravenscar profile.
+
+@noindent
+ RM References: D.13.01 (4/2) D.16
+
+
+@item
+@emph{AI-0210 Correct Timing_Events metric (0000-00-00)}
+@cindex AI-0210 (Ada 2012 feature)
+
+@noindent
+ This is a documentation only issue regarding wording of metric requirements,
+ that does not affect the implementation of the compiler.
+
+@noindent
+ RM References: D.15 (24/2)
+
+
+@item
+@emph{AI-0206 Remote types packages and preelaborate (2010-07-24)}
+@cindex AI-0206 (Ada 2012 feature)
+
+@noindent
+ Remote types packages are now allowed to depend on preelaborated packages.
+ This was formerly considered illegal.
+
+@noindent
+ RM References: E.02.02 (6)
+
+
+
+@item
+@emph{AI-0152 Restriction No_Anonymous_Allocators (2010-09-08)}
+@cindex AI-0152 (Ada 2012 feature)
+
+@noindent
+ Restriction @code{No_Anonymous_Allocators} prevents the use of allocators
+ where the type of the returned value is an anonymous access type.
+
+@noindent
+ RM References: H.04 (8/1)
+@end itemize
+
+
+@node Obsolescent Features
+@chapter Obsolescent Features
+
+@noindent
+This chapter describes features that are provided by GNAT, but are
+considered obsolescent since there are preferred ways of achieving
+the same effect. These features are provided solely for historical
+compatibility purposes.
+
+@menu
+* pragma No_Run_Time::
+* pragma Ravenscar::
+* pragma Restricted_Run_Time::
+@end menu
+
+@node pragma No_Run_Time
+@section pragma No_Run_Time
+
+The pragma @code{No_Run_Time} is used to achieve an affect similar
+to the use of the "Zero Foot Print" configurable run time, but without
+requiring a specially configured run time. The result of using this
+pragma, which must be used for all units in a partition, is to restrict
+the use of any language features requiring run-time support code. The
+preferred usage is to use an appropriately configured run-time that
+includes just those features that are to be made accessible.
+
+@node pragma Ravenscar
+@section pragma Ravenscar
+
+The pragma @code{Ravenscar} has exactly the same effect as pragma
+@code{Profile (Ravenscar)}. The latter usage is preferred since it
+is part of the new Ada 2005 standard.
+
+@node pragma Restricted_Run_Time
+@section pragma Restricted_Run_Time
+
+The pragma @code{Restricted_Run_Time} has exactly the same effect as
+pragma @code{Profile (Restricted)}. The latter usage is
+preferred since the Ada 2005 pragma @code{Profile} is intended for
+this kind of implementation dependent addition.
+
+@include fdl.texi
+@c GNU Free Documentation License
+
+@node Index,,GNU Free Documentation License, Top
+@unnumbered Index
+
+@printindex cp
+
+@contents
+
+@bye
+tablishes the following set of restrictions:
+Pragma Shared