OSDN Git Service

9b10794e5c9de1c18e8b5704288deeb8d4fe4435
[pf3gnuchains/gcc-fork.git] / gcc / ada / gnat_rm.texi
1 \input texinfo   @c -*-texinfo-*-
2
3 @c %**start of header
4
5 @c oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
6 @c                                                                            o
7 @c                           GNAT DOCUMENTATION                               o
8 @c                                                                            o
9 @c                              G N A T _ RM                                  o
10 @c                                                                            o
11 @c  GNAT is maintained by Ada Core Technologies Inc (http://www.gnat.com).    o
12 @c                                                                            o
13 @c oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
14
15 @setfilename gnat_rm.info
16
17 @copying
18 Copyright @copyright{} 1995-2008, Free Software Foundation, Inc.
19
20 Permission is granted to copy, distribute and/or modify this document
21 under the terms of the GNU Free Documentation License, Version 1.3 or
22 any later version published by the Free Software Foundation; with no
23 Invariant Sections, with the Front-Cover Texts being ``GNAT Reference
24 Manual'', and with no Back-Cover Texts.  A copy of the license is
25 included in the section entitled ``GNU Free Documentation License''.
26 @end copying
27
28 @set EDITION GNAT
29 @set DEFAULTLANGUAGEVERSION Ada 2005
30 @set NONDEFAULTLANGUAGEVERSION Ada 95
31
32 @settitle GNAT Reference Manual
33
34 @setchapternewpage odd
35 @syncodeindex fn cp
36
37 @include gcc-common.texi
38
39 @dircategory GNU Ada tools
40 @direntry
41 * GNAT Reference Manual: (gnat_rm).  Reference Manual for GNU Ada tools.
42 @end direntry
43
44 @titlepage
45 @title GNAT Reference Manual
46 @subtitle GNAT, The GNU Ada Compiler
47 @versionsubtitle
48 @author AdaCore
49 @page
50 @vskip 0pt plus 1filll
51
52 @insertcopying
53
54 @end titlepage
55
56 @ifnottex
57 @node Top, About This Guide, (dir), (dir)
58 @top GNAT Reference Manual
59
60 @noindent
61 GNAT Reference Manual
62
63 @noindent
64 GNAT, The GNU Ada Compiler@*
65 GCC version @value{version-GCC}@*
66
67 @noindent
68 AdaCore
69
70 @menu
71 * About This Guide::
72 * Implementation Defined Pragmas::
73 * Implementation Defined Attributes::
74 * Implementation Defined Restrictions::
75 * Implementation Advice::
76 * Implementation Defined Characteristics::
77 * Intrinsic Subprograms::
78 * Representation Clauses and Pragmas::
79 * Standard Library Routines::
80 * The Implementation of Standard I/O::
81 * The GNAT Library::
82 * Interfacing to Other Languages::
83 * Specialized Needs Annexes::
84 * Implementation of Specific Ada Features::
85 * Implementation of Ada 2012 Features::
86 * Obsolescent Features::
87 * GNU Free Documentation License::
88 * Index::
89
90  --- The Detailed Node Listing ---
91
92 About This Guide
93
94 * What This Reference Manual Contains::
95 * Related Information::
96
97 Implementation Defined Pragmas
98
99 * Pragma Abort_Defer::
100 * Pragma Ada_83::
101 * Pragma Ada_95::
102 * Pragma Ada_05::
103 * Pragma Ada_2005::
104 * Pragma Ada_12::
105 * Pragma Ada_2012::
106 * Pragma Annotate::
107 * Pragma Assert::
108 * Pragma Assertion_Policy::
109 * Pragma Assume_No_Invalid_Values::
110 * Pragma Ast_Entry::
111 * Pragma C_Pass_By_Copy::
112 * Pragma Check::
113 * Pragma Check_Name::
114 * Pragma Check_Policy::
115 * Pragma Comment::
116 * Pragma Common_Object::
117 * Pragma Compile_Time_Error::
118 * Pragma Compile_Time_Warning::
119 * Pragma Compiler_Unit::
120 * Pragma Complete_Representation::
121 * Pragma Complex_Representation::
122 * Pragma Component_Alignment::
123 * Pragma Convention_Identifier::
124 * Pragma CPP_Class::
125 * Pragma CPP_Constructor::
126 * Pragma CPP_Virtual::
127 * Pragma CPP_Vtable::
128 * Pragma Debug::
129 * Pragma Debug_Policy::
130 * Pragma Detect_Blocking::
131 * Pragma Elaboration_Checks::
132 * Pragma Eliminate::
133 * Pragma Export_Exception::
134 * Pragma Export_Function::
135 * Pragma Export_Object::
136 * Pragma Export_Procedure::
137 * Pragma Export_Value::
138 * Pragma Export_Valued_Procedure::
139 * Pragma Extend_System::
140 * Pragma Extensions_Allowed::
141 * Pragma External::
142 * Pragma External_Name_Casing::
143 * Pragma Fast_Math::
144 * Pragma Favor_Top_Level::
145 * Pragma Finalize_Storage_Only::
146 * Pragma Float_Representation::
147 * Pragma Ident::
148 * Pragma Implemented::
149 * Pragma Implicit_Packing::
150 * Pragma Import_Exception::
151 * Pragma Import_Function::
152 * Pragma Import_Object::
153 * Pragma Import_Procedure::
154 * Pragma Import_Valued_Procedure::
155 * Pragma Initialize_Scalars::
156 * Pragma Inline_Always::
157 * Pragma Inline_Generic::
158 * Pragma Interface::
159 * Pragma Interface_Name::
160 * Pragma Interrupt_Handler::
161 * Pragma Interrupt_State::
162 * Pragma Invariant::
163 * Pragma Keep_Names::
164 * Pragma License::
165 * Pragma Link_With::
166 * Pragma Linker_Alias::
167 * Pragma Linker_Constructor::
168 * Pragma Linker_Destructor::
169 * Pragma Linker_Section::
170 * Pragma Long_Float::
171 * Pragma Machine_Attribute::
172 * Pragma Main::
173 * Pragma Main_Storage::
174 * Pragma No_Body::
175 * Pragma No_Return::
176 * Pragma No_Strict_Aliasing ::
177 * Pragma Normalize_Scalars::
178 * Pragma Obsolescent::
179 * Pragma Optimize_Alignment::
180 * Pragma Ordered::
181 * Pragma Passive::
182 * Pragma Persistent_BSS::
183 * Pragma Polling::
184 * Pragma Postcondition::
185 * Pragma Precondition::
186 * Pragma Profile (Ravenscar)::
187 * Pragma Profile (Restricted)::
188 * Pragma Psect_Object::
189 * Pragma Pure_Function::
190 * Pragma Remote_Access_Type::
191 * Pragma Restriction_Warnings::
192 * Pragma Shared::
193 * Pragma Short_Circuit_And_Or::
194 * Pragma Short_Descriptors::
195 * Pragma Simple_Storage_Pool_Type::
196 * Pragma Source_File_Name::
197 * Pragma Source_File_Name_Project::
198 * Pragma Source_Reference::
199 * Pragma Static_Elaboration_Desired::
200 * Pragma Stream_Convert::
201 * Pragma Style_Checks::
202 * Pragma Subtitle::
203 * Pragma Suppress::
204 * Pragma Suppress_All::
205 * Pragma Suppress_Exception_Locations::
206 * Pragma Suppress_Initialization::
207 * Pragma Task_Info::
208 * Pragma Task_Name::
209 * Pragma Task_Storage::
210 * Pragma Test_Case::
211 * Pragma Thread_Local_Storage::
212 * Pragma Time_Slice::
213 * Pragma Title::
214 * Pragma Unchecked_Union::
215 * Pragma Unimplemented_Unit::
216 * Pragma Universal_Aliasing ::
217 * Pragma Universal_Data::
218 * Pragma Unmodified::
219 * Pragma Unreferenced::
220 * Pragma Unreferenced_Objects::
221 * Pragma Unreserve_All_Interrupts::
222 * Pragma Unsuppress::
223 * Pragma Use_VADS_Size::
224 * Pragma Validity_Checks::
225 * Pragma Volatile::
226 * Pragma Warnings::
227 * Pragma Weak_External::
228 * Pragma Wide_Character_Encoding::
229
230 Implementation Defined Attributes
231
232 * Abort_Signal::
233 * Address_Size::
234 * Asm_Input::
235 * Asm_Output::
236 * AST_Entry::
237 * Bit::
238 * Bit_Position::
239 * Compiler_Version::
240 * Code_Address::
241 * Default_Bit_Order::
242 * Descriptor_Size::
243 * Elaborated::
244 * Elab_Body::
245 * Elab_Spec::
246 * Elab_Subp_Body::
247 * Emax::
248 * Enabled::
249 * Enum_Rep::
250 * Enum_Val::
251 * Epsilon::
252 * Fixed_Value::
253 * Has_Access_Values::
254 * Has_Discriminants::
255 * Img::
256 * Integer_Value::
257 * Invalid_Value::
258 * Large::
259 * Machine_Size::
260 * Mantissa::
261 * Max_Interrupt_Priority::
262 * Max_Priority::
263 * Maximum_Alignment::
264 * Mechanism_Code::
265 * Null_Parameter::
266 * Object_Size::
267 * Old::
268 * Passed_By_Reference::
269 * Pool_Address::
270 * Range_Length::
271 * Result::
272 * Safe_Emax::
273 * Safe_Large::
274 * Simple_Storage_Pool::
275 * Small::
276 * Storage_Unit::
277 * Stub_Type::
278 * System_Allocator_Alignment::
279 * Target_Name::
280 * Tick::
281 * To_Address::
282 * Type_Class::
283 * UET_Address::
284 * Unconstrained_Array::
285 * Universal_Literal_String::
286 * Unrestricted_Access::
287 * VADS_Size::
288 * Value_Size::
289 * Wchar_T_Size::
290 * Word_Size::
291
292 Implementation Defined Restrictions
293
294 * Partition-Wide Restrictions::
295 * Program Unit Level Restrictions::
296
297 Partition-Wide Restrictions
298
299 * Immediate_Reclamation::
300 * Max_Asynchronous_Select_Nesting::
301 * Max_Entry_Queue_Length::
302 * Max_Protected_Entries::
303 * Max_Select_Alternatives::
304 * Max_Storage_At_Blocking::
305 * Max_Task_Entries::
306 * Max_Tasks::
307 * No_Abort_Statements::
308 * No_Access_Parameter_Allocators::
309 * No_Access_Subprograms::
310 * No_Allocators::
311 * No_Anonymous_Allocators::
312 * No_Calendar::
313 * No_Coextensions::
314 * No_Default_Initialization::
315 * No_Delay::
316 * No_Dependence::
317 * No_Direct_Boolean_Operators::
318 * No_Dispatch::
319 * No_Dispatching_Calls::
320 * No_Dynamic_Attachment::
321 * No_Dynamic_Priorities::
322 * No_Entry_Calls_In_Elaboration_Code::
323 * No_Enumeration_Maps::
324 * No_Exception_Handlers::
325 * No_Exception_Propagation::
326 * No_Exception_Registration::
327 * No_Exceptions::
328 * No_Finalization::
329 * No_Fixed_Point::
330 * No_Floating_Point::
331 * No_Implicit_Conditionals::
332 * No_Implicit_Dynamic_Code::
333 * No_Implicit_Heap_Allocations::
334 * No_Implicit_Loops::
335 * No_Initialize_Scalars::
336 * No_IO::
337 * No_Local_Allocators::
338 * No_Local_Protected_Objects::
339 * No_Local_Timing_Events::
340 * No_Nested_Finalization::
341 * No_Protected_Type_Allocators::
342 * No_Protected_Types::
343 * No_Recursion::
344 * No_Reentrancy::
345 * No_Relative_Delay::
346 * No_Requeue_Statements::
347 * No_Secondary_Stack::
348 * No_Select_Statements::
349 * No_Specific_Termination_Handlers::
350 * No_Specification_of_Aspect::
351 * No_Standard_Allocators_After_Elaboration::
352 * No_Standard_Storage_Pools::
353 * No_Stream_Optimizations::
354 * No_Streams::
355 * No_Task_Allocators::
356 * No_Task_Attributes_Package::
357 * No_Task_Hierarchy::
358 * No_Task_Termination::
359 * No_Tasking::
360 * No_Terminate_Alternatives::
361 * No_Unchecked_Access::
362 * Simple_Barriers::
363 * Static_Priorities::
364 * Static_Storage_Size::
365
366 Program Unit Level Restrictions
367
368 * No_Elaboration_Code::
369 * No_Entry_Queue::
370 * No_Implementation_Aspect_Specifications::
371 * No_Implementation_Attributes::
372 * No_Implementation_Identifiers::
373 * No_Implementation_Pragmas::
374 * No_Implementation_Restrictions::
375 * No_Implementation_Units::
376 * No_Implicit_Aliasing::
377 * No_Obsolescent_Features::
378 * No_Wide_Characters::
379 * SPARK::
380
381 The Implementation of Standard I/O
382
383 * Standard I/O Packages::
384 * FORM Strings::
385 * Direct_IO::
386 * Sequential_IO::
387 * Text_IO::
388 * Wide_Text_IO::
389 * Wide_Wide_Text_IO::
390 * Stream_IO::
391 * Text Translation::
392 * Shared Files::
393 * Filenames encoding::
394 * Open Modes::
395 * Operations on C Streams::
396 * Interfacing to C Streams::
397
398 The GNAT Library
399
400 * Ada.Characters.Latin_9 (a-chlat9.ads)::
401 * Ada.Characters.Wide_Latin_1 (a-cwila1.ads)::
402 * Ada.Characters.Wide_Latin_9 (a-cwila9.ads)::
403 * Ada.Characters.Wide_Wide_Latin_1 (a-chzla1.ads)::
404 * Ada.Characters.Wide_Wide_Latin_9 (a-chzla9.ads)::
405 * Ada.Containers.Formal_Doubly_Linked_Lists (a-cfdlli.ads)::
406 * Ada.Containers.Formal_Hashed_Maps (a-cfhama.ads)::
407 * Ada.Containers.Formal_Hashed_Sets (a-cfhase.ads)::
408 * Ada.Containers.Formal_Ordered_Maps (a-cforma.ads)::
409 * Ada.Containers.Formal_Ordered_Sets (a-cforse.ads)::
410 * Ada.Containers.Formal_Vectors (a-cofove.ads)::
411 * Ada.Command_Line.Environment (a-colien.ads)::
412 * Ada.Command_Line.Remove (a-colire.ads)::
413 * Ada.Command_Line.Response_File (a-clrefi.ads)::
414 * Ada.Direct_IO.C_Streams (a-diocst.ads)::
415 * Ada.Exceptions.Is_Null_Occurrence (a-einuoc.ads)::
416 * Ada.Exceptions.Last_Chance_Handler (a-elchha.ads)::
417 * Ada.Exceptions.Traceback (a-exctra.ads)::
418 * Ada.Sequential_IO.C_Streams (a-siocst.ads)::
419 * Ada.Streams.Stream_IO.C_Streams (a-ssicst.ads)::
420 * Ada.Strings.Unbounded.Text_IO (a-suteio.ads)::
421 * Ada.Strings.Wide_Unbounded.Wide_Text_IO (a-swuwti.ads)::
422 * Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO (a-szuzti.ads)::
423 * Ada.Text_IO.C_Streams (a-tiocst.ads)::
424 * Ada.Text_IO.Reset_Standard_Files (a-tirsfi.ads)::
425 * Ada.Wide_Characters.Unicode (a-wichun.ads)::
426 * Ada.Wide_Text_IO.C_Streams (a-wtcstr.ads)::
427 * Ada.Wide_Text_IO.Reset_Standard_Files (a-wrstfi.ads)::
428 * Ada.Wide_Wide_Characters.Unicode (a-zchuni.ads)::
429 * Ada.Wide_Wide_Text_IO.C_Streams (a-ztcstr.ads)::
430 * Ada.Wide_Wide_Text_IO.Reset_Standard_Files (a-zrstfi.ads)::
431 * GNAT.Altivec (g-altive.ads)::
432 * GNAT.Altivec.Conversions (g-altcon.ads)::
433 * GNAT.Altivec.Vector_Operations (g-alveop.ads)::
434 * GNAT.Altivec.Vector_Types (g-alvety.ads)::
435 * GNAT.Altivec.Vector_Views (g-alvevi.ads)::
436 * GNAT.Array_Split (g-arrspl.ads)::
437 * GNAT.AWK (g-awk.ads)::
438 * GNAT.Bounded_Buffers (g-boubuf.ads)::
439 * GNAT.Bounded_Mailboxes (g-boumai.ads)::
440 * GNAT.Bubble_Sort (g-bubsor.ads)::
441 * GNAT.Bubble_Sort_A (g-busora.ads)::
442 * GNAT.Bubble_Sort_G (g-busorg.ads)::
443 * GNAT.Byte_Order_Mark (g-byorma.ads)::
444 * GNAT.Byte_Swapping (g-bytswa.ads)::
445 * GNAT.Calendar (g-calend.ads)::
446 * GNAT.Calendar.Time_IO (g-catiio.ads)::
447 * GNAT.Case_Util (g-casuti.ads)::
448 * GNAT.CGI (g-cgi.ads)::
449 * GNAT.CGI.Cookie (g-cgicoo.ads)::
450 * GNAT.CGI.Debug (g-cgideb.ads)::
451 * GNAT.Command_Line (g-comlin.ads)::
452 * GNAT.Compiler_Version (g-comver.ads)::
453 * GNAT.Ctrl_C (g-ctrl_c.ads)::
454 * GNAT.CRC32 (g-crc32.ads)::
455 * GNAT.Current_Exception (g-curexc.ads)::
456 * GNAT.Debug_Pools (g-debpoo.ads)::
457 * GNAT.Debug_Utilities (g-debuti.ads)::
458 * GNAT.Decode_String (g-decstr.ads)::
459 * GNAT.Decode_UTF8_String (g-deutst.ads)::
460 * GNAT.Directory_Operations (g-dirope.ads)::
461 * GNAT.Directory_Operations.Iteration (g-diopit.ads)::
462 * GNAT.Dynamic_HTables (g-dynhta.ads)::
463 * GNAT.Dynamic_Tables (g-dyntab.ads)::
464 * GNAT.Encode_String (g-encstr.ads)::
465 * GNAT.Encode_UTF8_String (g-enutst.ads)::
466 * GNAT.Exception_Actions (g-excact.ads)::
467 * GNAT.Exception_Traces (g-exctra.ads)::
468 * GNAT.Exceptions (g-except.ads)::
469 * GNAT.Expect (g-expect.ads)::
470 * GNAT.Expect.TTY (g-exptty.ads)::
471 * GNAT.Float_Control (g-flocon.ads)::
472 * GNAT.Heap_Sort (g-heasor.ads)::
473 * GNAT.Heap_Sort_A (g-hesora.ads)::
474 * GNAT.Heap_Sort_G (g-hesorg.ads)::
475 * GNAT.HTable (g-htable.ads)::
476 * GNAT.IO (g-io.ads)::
477 * GNAT.IO_Aux (g-io_aux.ads)::
478 * GNAT.Lock_Files (g-locfil.ads)::
479 * GNAT.MBBS_Discrete_Random (g-mbdira.ads)::
480 * GNAT.MBBS_Float_Random (g-mbflra.ads)::
481 * GNAT.MD5 (g-md5.ads)::
482 * GNAT.Memory_Dump (g-memdum.ads)::
483 * GNAT.Most_Recent_Exception (g-moreex.ads)::
484 * GNAT.OS_Lib (g-os_lib.ads)::
485 * GNAT.Perfect_Hash_Generators (g-pehage.ads)::
486 * GNAT.Random_Numbers (g-rannum.ads)::
487 * GNAT.Regexp (g-regexp.ads)::
488 * GNAT.Registry (g-regist.ads)::
489 * GNAT.Regpat (g-regpat.ads)::
490 * GNAT.Secondary_Stack_Info (g-sestin.ads)::
491 * GNAT.Semaphores (g-semaph.ads)::
492 * GNAT.Serial_Communications (g-sercom.ads)::
493 * GNAT.SHA1 (g-sha1.ads)::
494 * GNAT.SHA224 (g-sha224.ads)::
495 * GNAT.SHA256 (g-sha256.ads)::
496 * GNAT.SHA384 (g-sha384.ads)::
497 * GNAT.SHA512 (g-sha512.ads)::
498 * GNAT.Signals (g-signal.ads)::
499 * GNAT.Sockets (g-socket.ads)::
500 * GNAT.Source_Info (g-souinf.ads)::
501 * GNAT.Spelling_Checker (g-speche.ads)::
502 * GNAT.Spelling_Checker_Generic (g-spchge.ads)::
503 * GNAT.Spitbol.Patterns (g-spipat.ads)::
504 * GNAT.Spitbol (g-spitbo.ads)::
505 * GNAT.Spitbol.Table_Boolean (g-sptabo.ads)::
506 * GNAT.Spitbol.Table_Integer (g-sptain.ads)::
507 * GNAT.Spitbol.Table_VString (g-sptavs.ads)::
508 * GNAT.SSE (g-sse.ads)::
509 * GNAT.SSE.Vector_Types (g-ssvety.ads)::
510 * GNAT.Strings (g-string.ads)::
511 * GNAT.String_Split (g-strspl.ads)::
512 * GNAT.Table (g-table.ads)::
513 * GNAT.Task_Lock (g-tasloc.ads)::
514 * GNAT.Threads (g-thread.ads)::
515 * GNAT.Time_Stamp (g-timsta.ads)::
516 * GNAT.Traceback (g-traceb.ads)::
517 * GNAT.Traceback.Symbolic (g-trasym.ads)::
518 * GNAT.UTF_32 (g-utf_32.ads)::
519 * GNAT.UTF_32_Spelling_Checker (g-u3spch.ads)::
520 * GNAT.Wide_Spelling_Checker (g-wispch.ads)::
521 * GNAT.Wide_String_Split (g-wistsp.ads)::
522 * GNAT.Wide_Wide_Spelling_Checker (g-zspche.ads)::
523 * GNAT.Wide_Wide_String_Split (g-zistsp.ads)::
524 * Interfaces.C.Extensions (i-cexten.ads)::
525 * Interfaces.C.Streams (i-cstrea.ads)::
526 * Interfaces.CPP (i-cpp.ads)::
527 * Interfaces.Packed_Decimal (i-pacdec.ads)::
528 * Interfaces.VxWorks (i-vxwork.ads)::
529 * Interfaces.VxWorks.IO (i-vxwoio.ads)::
530 * System.Address_Image (s-addima.ads)::
531 * System.Assertions (s-assert.ads)::
532 * System.Memory (s-memory.ads)::
533 * System.Partition_Interface (s-parint.ads)::
534 * System.Pool_Global (s-pooglo.ads)::
535 * System.Pool_Local (s-pooloc.ads)::
536 * System.Restrictions (s-restri.ads)::
537 * System.Rident (s-rident.ads)::
538 * System.Strings.Stream_Ops (s-ststop.ads)::
539 * System.Task_Info (s-tasinf.ads)::
540 * System.Wch_Cnv (s-wchcnv.ads)::
541 * System.Wch_Con (s-wchcon.ads)::
542
543 Text_IO
544
545 * Text_IO Stream Pointer Positioning::
546 * Text_IO Reading and Writing Non-Regular Files::
547 * Get_Immediate::
548 * Treating Text_IO Files as Streams::
549 * Text_IO Extensions::
550 * Text_IO Facilities for Unbounded Strings::
551
552 Wide_Text_IO
553
554 * Wide_Text_IO Stream Pointer Positioning::
555 * Wide_Text_IO Reading and Writing Non-Regular Files::
556
557 Wide_Wide_Text_IO
558
559 * Wide_Wide_Text_IO Stream Pointer Positioning::
560 * Wide_Wide_Text_IO Reading and Writing Non-Regular Files::
561
562 Interfacing to Other Languages
563
564 * Interfacing to C::
565 * Interfacing to C++::
566 * Interfacing to COBOL::
567 * Interfacing to Fortran::
568 * Interfacing to non-GNAT Ada code::
569
570 Specialized Needs Annexes
571
572 Implementation of Specific Ada Features
573 * Machine Code Insertions::
574 * GNAT Implementation of Tasking::
575 * GNAT Implementation of Shared Passive Packages::
576 * Code Generation for Array Aggregates::
577 * The Size of Discriminated Records with Default Discriminants::
578 * Strict Conformance to the Ada Reference Manual::
579
580 Implementation of Ada 2012 Features
581
582 Obsolescent Features
583
584 GNU Free Documentation License
585
586 Index
587 @end menu
588
589 @end ifnottex
590
591 @node About This Guide
592 @unnumbered About This Guide
593
594 @noindent
595 This manual contains useful information in writing programs using the
596 @value{EDITION} compiler.  It includes information on implementation dependent
597 characteristics of @value{EDITION}, including all the information required by
598 Annex M of the Ada language standard.
599
600 @value{EDITION} implements Ada 95 and Ada 2005, and it may also be invoked in
601 Ada 83 compatibility mode.
602 By default, @value{EDITION} assumes @value{DEFAULTLANGUAGEVERSION},
603 but you can override with a compiler switch
604 to explicitly specify the language version.
605 (Please refer to @ref{Compiling Different Versions of Ada,,, gnat_ugn,
606 @value{EDITION} User's Guide}, for details on these switches.)
607 Throughout this manual, references to ``Ada'' without a year suffix
608 apply to both the Ada 95 and Ada 2005 versions of the language.
609
610 Ada is designed to be highly portable.
611 In general, a program will have the same effect even when compiled by
612 different compilers on different platforms.
613 However, since Ada is designed to be used in a
614 wide variety of applications, it also contains a number of system
615 dependent features to be used in interfacing to the external world.
616 @cindex Implementation-dependent features
617 @cindex Portability
618
619 Note: Any program that makes use of implementation-dependent features
620 may be non-portable.  You should follow good programming practice and
621 isolate and clearly document any sections of your program that make use
622 of these features in a non-portable manner.
623
624 @ifset PROEDITION
625 For ease of exposition, ``@value{EDITION}'' will be referred to simply as
626 ``GNAT'' in the remainder of this document.
627 @end ifset
628
629 @menu
630 * What This Reference Manual Contains::
631 * Conventions::
632 * Related Information::
633 @end menu
634
635 @node What This Reference Manual Contains
636 @unnumberedsec What This Reference Manual Contains
637
638 @noindent
639 This reference manual contains the following chapters:
640
641 @itemize @bullet
642 @item
643 @ref{Implementation Defined Pragmas}, lists GNAT implementation-dependent
644 pragmas, which can be used to extend and enhance the functionality of the
645 compiler.
646
647 @item
648 @ref{Implementation Defined Attributes}, lists GNAT
649 implementation-dependent attributes, which can be used to extend and
650 enhance the functionality of the compiler.
651
652 @item
653 @ref{Implementation Defined Restrictions}, lists GNAT
654 implementation-dependent restrictions, which can be used to extend and
655 enhance the functionality of the compiler.
656
657 @item
658 @ref{Implementation Advice}, provides information on generally
659 desirable behavior which are not requirements that all compilers must
660 follow since it cannot be provided on all systems, or which may be
661 undesirable on some systems.
662
663 @item
664 @ref{Implementation Defined Characteristics}, provides a guide to
665 minimizing implementation dependent features.
666
667 @item
668 @ref{Intrinsic Subprograms}, describes the intrinsic subprograms
669 implemented by GNAT, and how they can be imported into user
670 application programs.
671
672 @item
673 @ref{Representation Clauses and Pragmas}, describes in detail the
674 way that GNAT represents data, and in particular the exact set
675 of representation clauses and pragmas that is accepted.
676
677 @item
678 @ref{Standard Library Routines}, provides a listing of packages and a
679 brief description of the functionality that is provided by Ada's
680 extensive set of standard library routines as implemented by GNAT@.
681
682 @item
683 @ref{The Implementation of Standard I/O}, details how the GNAT
684 implementation of the input-output facilities.
685
686 @item
687 @ref{The GNAT Library}, is a catalog of packages that complement
688 the Ada predefined library.
689
690 @item
691 @ref{Interfacing to Other Languages}, describes how programs
692 written in Ada using GNAT can be interfaced to other programming
693 languages.
694
695 @ref{Specialized Needs Annexes}, describes the GNAT implementation of all
696 of the specialized needs annexes.
697
698 @item
699 @ref{Implementation of Specific Ada Features}, discusses issues related
700 to GNAT's implementation of machine code insertions, tasking, and several
701 other features.
702
703 @item
704 @ref{Implementation of Ada 2012 Features}, describes the status of the
705 GNAT implementation of the Ada 2012 language standard.
706
707 @item
708 @ref{Obsolescent Features} documents implementation dependent features,
709 including pragmas and attributes, which are considered obsolescent, since
710 there are other preferred ways of achieving the same results. These
711 obsolescent forms are retained for backwards compatibility.
712
713 @end itemize
714
715 @cindex Ada 95 Language Reference Manual
716 @cindex Ada 2005 Language Reference Manual
717 @noindent
718 This reference manual assumes a basic familiarity with the Ada 95 language, as
719 described in the International Standard ANSI/ISO/IEC-8652:1995,
720 January 1995.
721 It does not require knowledge of the new features introduced by Ada 2005,
722 (officially known as ISO/IEC 8652:1995 with Technical Corrigendum 1
723 and Amendment 1).
724 Both reference manuals are included in the GNAT documentation
725 package.
726
727 @node Conventions
728 @unnumberedsec Conventions
729 @cindex Conventions, typographical
730 @cindex Typographical conventions
731
732 @noindent
733 Following are examples of the typographical and graphic conventions used
734 in this guide:
735
736 @itemize @bullet
737 @item
738 @code{Functions}, @code{utility program names}, @code{standard names},
739 and @code{classes}.
740
741 @item
742 @code{Option flags}
743
744 @item
745 @file{File names}, @samp{button names}, and @samp{field names}.
746
747 @item
748 @code{Variables}, @env{environment variables}, and @var{metasyntactic
749 variables}.
750
751 @item
752 @emph{Emphasis}.
753
754 @item
755 [optional information or parameters]
756
757 @item
758 Examples are described by text
759 @smallexample
760 and then shown this way.
761 @end smallexample
762 @end itemize
763
764 @noindent
765 Commands that are entered by the user are preceded in this manual by the
766 characters @samp{$ } (dollar sign followed by space).  If your system uses this
767 sequence as a prompt, then the commands will appear exactly as you see them
768 in the manual.  If your system uses some other prompt, then the command will
769 appear with the @samp{$} replaced by whatever prompt character you are using.
770
771 @node Related Information
772 @unnumberedsec Related Information
773 @noindent
774 See the following documents for further information on GNAT:
775
776 @itemize @bullet
777 @item
778 @xref{Top, @value{EDITION} User's Guide, About This Guide, gnat_ugn,
779 @value{EDITION} User's Guide}, which provides information on how to use the
780 GNAT compiler system.
781
782 @item
783 @cite{Ada 95 Reference Manual}, which contains all reference
784 material for the Ada 95 programming language.
785
786 @item
787 @cite{Ada 95 Annotated Reference Manual}, which is an annotated version
788 of the Ada 95 standard.  The annotations describe
789 detailed aspects of the design decision, and in particular contain useful
790 sections on Ada 83 compatibility.
791
792 @item
793 @cite{Ada 2005 Reference Manual}, which contains all reference
794 material for the Ada 2005 programming language.
795
796 @item
797 @cite{Ada 2005 Annotated Reference Manual}, which is an annotated version
798 of the Ada 2005 standard.  The annotations describe
799 detailed aspects of the design decision, and in particular contain useful
800 sections on Ada 83 and Ada 95 compatibility.
801
802 @item
803 @cite{DEC Ada, Technical Overview and Comparison on DIGITAL Platforms},
804 which contains specific information on compatibility between GNAT and
805 DEC Ada 83 systems.
806
807 @item
808 @cite{DEC Ada, Language Reference Manual, part number AA-PYZAB-TK} which
809 describes in detail the pragmas and attributes provided by the DEC Ada 83
810 compiler system.
811
812 @end itemize
813
814 @node Implementation Defined Pragmas
815 @chapter Implementation Defined Pragmas
816
817 @noindent
818 Ada defines a set of pragmas that can be used to supply additional
819 information to the compiler.  These language defined pragmas are
820 implemented in GNAT and work as described in the Ada Reference Manual.
821
822 In addition, Ada allows implementations to define additional pragmas
823 whose meaning is defined by the implementation.  GNAT provides a number
824 of these implementation-defined pragmas, which can be used to extend
825 and enhance the functionality of the compiler.  This section of the GNAT
826 Reference Manual describes these additional pragmas.
827
828 Note that any program using these pragmas might not be portable to other
829 compilers (although GNAT implements this set of pragmas on all
830 platforms).  Therefore if portability to other compilers is an important
831 consideration, the use of these pragmas should be minimized.
832
833 @menu
834 * Pragma Abort_Defer::
835 * Pragma Ada_83::
836 * Pragma Ada_95::
837 * Pragma Ada_05::
838 * Pragma Ada_2005::
839 * Pragma Ada_12::
840 * Pragma Ada_2012::
841 * Pragma Annotate::
842 * Pragma Assert::
843 * Pragma Assertion_Policy::
844 * Pragma Assume_No_Invalid_Values::
845 * Pragma Ast_Entry::
846 * Pragma C_Pass_By_Copy::
847 * Pragma Check::
848 * Pragma Check_Name::
849 * Pragma Check_Policy::
850 * Pragma Comment::
851 * Pragma Common_Object::
852 * Pragma Compile_Time_Error::
853 * Pragma Compile_Time_Warning::
854 * Pragma Compiler_Unit::
855 * Pragma Complete_Representation::
856 * Pragma Complex_Representation::
857 * Pragma Component_Alignment::
858 * Pragma Convention_Identifier::
859 * Pragma CPP_Class::
860 * Pragma CPP_Constructor::
861 * Pragma CPP_Virtual::
862 * Pragma CPP_Vtable::
863 * Pragma Debug::
864 * Pragma Debug_Policy::
865 * Pragma Detect_Blocking::
866 * Pragma Elaboration_Checks::
867 * Pragma Eliminate::
868 * Pragma Export_Exception::
869 * Pragma Export_Function::
870 * Pragma Export_Object::
871 * Pragma Export_Procedure::
872 * Pragma Export_Value::
873 * Pragma Export_Valued_Procedure::
874 * Pragma Extend_System::
875 * Pragma Extensions_Allowed::
876 * Pragma External::
877 * Pragma External_Name_Casing::
878 * Pragma Fast_Math::
879 * Pragma Favor_Top_Level::
880 * Pragma Finalize_Storage_Only::
881 * Pragma Float_Representation::
882 * Pragma Ident::
883 * Pragma Implemented::
884 * Pragma Implicit_Packing::
885 * Pragma Import_Exception::
886 * Pragma Import_Function::
887 * Pragma Import_Object::
888 * Pragma Import_Procedure::
889 * Pragma Import_Valued_Procedure::
890 * Pragma Initialize_Scalars::
891 * Pragma Inline_Always::
892 * Pragma Inline_Generic::
893 * Pragma Interface::
894 * Pragma Interface_Name::
895 * Pragma Interrupt_Handler::
896 * Pragma Interrupt_State::
897 * Pragma Invariant::
898 * Pragma Keep_Names::
899 * Pragma License::
900 * Pragma Link_With::
901 * Pragma Linker_Alias::
902 * Pragma Linker_Constructor::
903 * Pragma Linker_Destructor::
904 * Pragma Linker_Section::
905 * Pragma Long_Float::
906 * Pragma Machine_Attribute::
907 * Pragma Main::
908 * Pragma Main_Storage::
909 * Pragma No_Body::
910 * Pragma No_Return::
911 * Pragma No_Strict_Aliasing::
912 * Pragma Normalize_Scalars::
913 * Pragma Obsolescent::
914 * Pragma Optimize_Alignment::
915 * Pragma Ordered::
916 * Pragma Passive::
917 * Pragma Persistent_BSS::
918 * Pragma Polling::
919 * Pragma Postcondition::
920 * Pragma Precondition::
921 * Pragma Profile (Ravenscar)::
922 * Pragma Profile (Restricted)::
923 * Pragma Psect_Object::
924 * Pragma Pure_Function::
925 * Pragma Remote_Access_Type::
926 * Pragma Restriction_Warnings::
927 * Pragma Shared::
928 * Pragma Short_Circuit_And_Or::
929 * Pragma Short_Descriptors::
930 * Pragma Simple_Storage_Pool_Type::
931 * Pragma Source_File_Name::
932 * Pragma Source_File_Name_Project::
933 * Pragma Source_Reference::
934 * Pragma Static_Elaboration_Desired::
935 * Pragma Stream_Convert::
936 * Pragma Style_Checks::
937 * Pragma Subtitle::
938 * Pragma Suppress::
939 * Pragma Suppress_All::
940 * Pragma Suppress_Exception_Locations::
941 * Pragma Suppress_Initialization::
942 * Pragma Task_Info::
943 * Pragma Task_Name::
944 * Pragma Task_Storage::
945 * Pragma Test_Case::
946 * Pragma Thread_Local_Storage::
947 * Pragma Time_Slice::
948 * Pragma Title::
949 * Pragma Unchecked_Union::
950 * Pragma Unimplemented_Unit::
951 * Pragma Universal_Aliasing ::
952 * Pragma Universal_Data::
953 * Pragma Unmodified::
954 * Pragma Unreferenced::
955 * Pragma Unreferenced_Objects::
956 * Pragma Unreserve_All_Interrupts::
957 * Pragma Unsuppress::
958 * Pragma Use_VADS_Size::
959 * Pragma Validity_Checks::
960 * Pragma Volatile::
961 * Pragma Warnings::
962 * Pragma Weak_External::
963 * Pragma Wide_Character_Encoding::
964 @end menu
965
966 @node Pragma Abort_Defer
967 @unnumberedsec Pragma Abort_Defer
968 @findex Abort_Defer
969 @cindex Deferring aborts
970 @noindent
971 Syntax:
972 @smallexample
973 pragma Abort_Defer;
974 @end smallexample
975
976 @noindent
977 This pragma must appear at the start of the statement sequence of a
978 handled sequence of statements (right after the @code{begin}).  It has
979 the effect of deferring aborts for the sequence of statements (but not
980 for the declarations or handlers, if any, associated with this statement
981 sequence).
982
983 @node Pragma Ada_83
984 @unnumberedsec Pragma Ada_83
985 @findex Ada_83
986 @noindent
987 Syntax:
988 @smallexample @c ada
989 pragma Ada_83;
990 @end smallexample
991
992 @noindent
993 A configuration pragma that establishes Ada 83 mode for the unit to
994 which it applies, regardless of the mode set by the command line
995 switches.  In Ada 83 mode, GNAT attempts to be as compatible with
996 the syntax and semantics of Ada 83, as defined in the original Ada
997 83 Reference Manual as possible.  In particular, the keywords added by Ada 95
998 and Ada 2005 are not recognized, optional package bodies are allowed,
999 and generics may name types with unknown discriminants without using
1000 the @code{(<>)} notation.  In addition, some but not all of the additional
1001 restrictions of Ada 83 are enforced.
1002
1003 Ada 83 mode is intended for two purposes.  Firstly, it allows existing
1004 Ada 83 code to be compiled and adapted to GNAT with less effort.
1005 Secondly, it aids in keeping code backwards compatible with Ada 83.
1006 However, there is no guarantee that code that is processed correctly
1007 by GNAT in Ada 83 mode will in fact compile and execute with an Ada
1008 83 compiler, since GNAT does not enforce all the additional checks
1009 required by Ada 83.
1010
1011 @node Pragma Ada_95
1012 @unnumberedsec Pragma Ada_95
1013 @findex Ada_95
1014 @noindent
1015 Syntax:
1016 @smallexample @c ada
1017 pragma Ada_95;
1018 @end smallexample
1019
1020 @noindent
1021 A configuration pragma that establishes Ada 95 mode for the unit to which
1022 it applies, regardless of the mode set by the command line switches.
1023 This mode is set automatically for the @code{Ada} and @code{System}
1024 packages and their children, so you need not specify it in these
1025 contexts.  This pragma is useful when writing a reusable component that
1026 itself uses Ada 95 features, but which is intended to be usable from
1027 either Ada 83 or Ada 95 programs.
1028
1029 @node Pragma Ada_05
1030 @unnumberedsec Pragma Ada_05
1031 @findex Ada_05
1032 @noindent
1033 Syntax:
1034 @smallexample @c ada
1035 pragma Ada_05;
1036 @end smallexample
1037
1038 @noindent
1039 A configuration pragma that establishes Ada 2005 mode for the unit to which
1040 it applies, regardless of the mode set by the command line switches.
1041 This pragma is useful when writing a reusable component that
1042 itself uses Ada 2005 features, but which is intended to be usable from
1043 either Ada 83 or Ada 95 programs.
1044
1045 @node Pragma Ada_2005
1046 @unnumberedsec Pragma Ada_2005
1047 @findex Ada_2005
1048 @noindent
1049 Syntax:
1050 @smallexample @c ada
1051 pragma Ada_2005;
1052 @end smallexample
1053
1054 @noindent
1055 This configuration pragma is a synonym for pragma Ada_05 and has the
1056 same syntax and effect.
1057
1058 @node Pragma Ada_12
1059 @unnumberedsec Pragma Ada_12
1060 @findex Ada_12
1061 @noindent
1062 Syntax:
1063 @smallexample @c ada
1064 pragma Ada_12;
1065 @end smallexample
1066
1067 @noindent
1068 A configuration pragma that establishes Ada 2012 mode for the unit to which
1069 it applies, regardless of the mode set by the command line switches.
1070 This mode is set automatically for the @code{Ada} and @code{System}
1071 packages and their children, so you need not specify it in these
1072 contexts.  This pragma is useful when writing a reusable component that
1073 itself uses Ada 2012 features, but which is intended to be usable from
1074 Ada 83, Ada 95, or Ada 2005 programs.
1075
1076 @node Pragma Ada_2012
1077 @unnumberedsec Pragma Ada_2012
1078 @findex Ada_2005
1079 @noindent
1080 Syntax:
1081 @smallexample @c ada
1082 pragma Ada_2012;
1083 @end smallexample
1084
1085 @noindent
1086 This configuration pragma is a synonym for pragma Ada_12 and has the
1087 same syntax and effect.
1088
1089 @node Pragma Annotate
1090 @unnumberedsec Pragma Annotate
1091 @findex Annotate
1092 @noindent
1093 Syntax:
1094 @smallexample @c ada
1095 pragma Annotate (IDENTIFIER [,IDENTIFIER @{, ARG@}]);
1096
1097 ARG ::= NAME | EXPRESSION
1098 @end smallexample
1099
1100 @noindent
1101 This pragma is used to annotate programs.  @var{identifier} identifies
1102 the type of annotation.  GNAT verifies that it is an identifier, but does
1103 not otherwise analyze it. The second optional identifier is also left
1104 unanalyzed, and by convention is used to control the action of the tool to
1105 which the annotation is addressed.  The remaining @var{arg} arguments
1106 can be either string literals or more generally expressions.
1107 String literals are assumed to be either of type
1108 @code{Standard.String} or else @code{Wide_String} or @code{Wide_Wide_String}
1109 depending on the character literals they contain.
1110 All other kinds of arguments are analyzed as expressions, and must be
1111 unambiguous.
1112
1113 The analyzed pragma is retained in the tree, but not otherwise processed
1114 by any part of the GNAT compiler, except to generate corresponding note
1115 lines in the generated ALI file. For the format of these note lines, see
1116 the compiler source file lib-writ.ads. This pragma is intended for use by
1117 external tools, including ASIS@. The use of pragma Annotate does not
1118 affect the compilation process in any way. This pragma may be used as
1119 a configuration pragma.
1120
1121 @node Pragma Assert
1122 @unnumberedsec Pragma Assert
1123 @findex Assert
1124 @noindent
1125 Syntax:
1126 @smallexample @c ada
1127 pragma Assert (
1128   boolean_EXPRESSION
1129   [, string_EXPRESSION]);
1130 @end smallexample
1131
1132 @noindent
1133 The effect of this pragma depends on whether the corresponding command
1134 line switch is set to activate assertions.  The pragma expands into code
1135 equivalent to the following:
1136
1137 @smallexample @c ada
1138 if assertions-enabled then
1139    if not boolean_EXPRESSION then
1140       System.Assertions.Raise_Assert_Failure
1141         (string_EXPRESSION);
1142    end if;
1143 end if;
1144 @end smallexample
1145
1146 @noindent
1147 The string argument, if given, is the message that will be associated
1148 with the exception occurrence if the exception is raised.  If no second
1149 argument is given, the default message is @samp{@var{file}:@var{nnn}},
1150 where @var{file} is the name of the source file containing the assert,
1151 and @var{nnn} is the line number of the assert.  A pragma is not a
1152 statement, so if a statement sequence contains nothing but a pragma
1153 assert, then a null statement is required in addition, as in:
1154
1155 @smallexample @c ada
1156 @dots{}
1157 if J > 3 then
1158    pragma Assert (K > 3, "Bad value for K");
1159    null;
1160 end if;
1161 @end smallexample
1162
1163 @noindent
1164 Note that, as with the @code{if} statement to which it is equivalent, the
1165 type of the expression is either @code{Standard.Boolean}, or any type derived
1166 from this standard type.
1167
1168 If assertions are disabled (switch @option{-gnata} not used), then there
1169 is no run-time effect (and in particular, any side effects from the
1170 expression will not occur at run time).  (The expression is still
1171 analyzed at compile time, and may cause types to be frozen if they are
1172 mentioned here for the first time).
1173
1174 If assertions are enabled, then the given expression is tested, and if
1175 it is @code{False} then @code{System.Assertions.Raise_Assert_Failure} is called
1176 which results in the raising of @code{Assert_Failure} with the given message.
1177
1178 You should generally avoid side effects in the expression arguments of
1179 this pragma, because these side effects will turn on and off with the
1180 setting of the assertions mode, resulting in assertions that have an
1181 effect on the program.  However, the expressions are analyzed for
1182 semantic correctness whether or not assertions are enabled, so turning
1183 assertions on and off cannot affect the legality of a program.
1184
1185 Note that the implementation defined policy @code{DISABLE}, given in a
1186 pragma Assertion_Policy, can be used to suppress this semantic analysis.
1187
1188 Note: this is a standard language-defined pragma in versions
1189 of Ada from 2005 on. In GNAT, it is implemented in all versions
1190 of Ada, and the DISABLE policy is an implementation-defined
1191 addition.
1192
1193
1194 @node Pragma Assertion_Policy
1195 @unnumberedsec Pragma Assertion_Policy
1196 @findex Debug_Policy
1197 @noindent
1198 Syntax:
1199
1200 @smallexample @c ada
1201 pragma Assertion_Policy (CHECK | DISABLE | IGNORE);
1202 @end smallexample
1203
1204 @noindent
1205 If the argument is @code{CHECK}, then pragma @code{Assert} is enabled.
1206 If the argument is @code{IGNORE}, then pragma @code{Assert} is ignored.
1207 This pragma overrides the effect of the @option{-gnata} switch on the
1208 command line.
1209
1210 The implementation defined policy @code{DISABLE} is like
1211 @code{IGNORE} except that it completely disables semantic
1212 checking of the argument to @code{pragma Assert}. This may
1213 be useful when the pragma argument references subprograms
1214 in a with'ed package which is replaced by a dummy package
1215 for the final build.
1216
1217 Note: this is a standard language-defined pragma in versions
1218 of Ada from 2005 on. In GNAT, it is implemented in all versions
1219 of Ada, and the DISABLE policy is an implementation-defined
1220 addition.
1221
1222 @node Pragma Assume_No_Invalid_Values
1223 @unnumberedsec Pragma Assume_No_Invalid_Values
1224 @findex Assume_No_Invalid_Values
1225 @cindex Invalid representations
1226 @cindex Invalid values
1227 @noindent
1228 Syntax:
1229 @smallexample @c ada
1230 pragma Assume_No_Invalid_Values (On | Off);
1231 @end smallexample
1232
1233 @noindent
1234 This is a configuration pragma that controls the assumptions made by the
1235 compiler about the occurrence of invalid representations (invalid values)
1236 in the code.
1237
1238 The default behavior (corresponding to an Off argument for this pragma), is
1239 to assume that values may in general be invalid unless the compiler can
1240 prove they are valid. Consider the following example:
1241
1242 @smallexample @c ada
1243 V1 : Integer range 1 .. 10;
1244 V2 : Integer range 11 .. 20;
1245 ...
1246 for J in V2 .. V1 loop
1247    ...
1248 end loop;
1249 @end smallexample
1250
1251 @noindent
1252 if V1 and V2 have valid values, then the loop is known at compile
1253 time not to execute since the lower bound must be greater than the
1254 upper bound. However in default mode, no such assumption is made,
1255 and the loop may execute. If @code{Assume_No_Invalid_Values (On)}
1256 is given, the compiler will assume that any occurrence of a variable
1257 other than in an explicit @code{'Valid} test always has a valid
1258 value, and the loop above will be optimized away.
1259
1260 The use of @code{Assume_No_Invalid_Values (On)} is appropriate if
1261 you know your code is free of uninitialized variables and other
1262 possible sources of invalid representations, and may result in
1263 more efficient code. A program that accesses an invalid representation
1264 with this pragma in effect is erroneous, so no guarantees can be made
1265 about its behavior.
1266
1267 It is peculiar though permissible to use this pragma in conjunction
1268 with validity checking (-gnatVa). In such cases, accessing invalid
1269 values will generally give an exception, though formally the program
1270 is erroneous so there are no guarantees that this will always be the
1271 case, and it is recommended that these two options not be used together.
1272
1273 @node Pragma Ast_Entry
1274 @unnumberedsec Pragma Ast_Entry
1275 @cindex OpenVMS
1276 @findex Ast_Entry
1277 @noindent
1278 Syntax:
1279 @smallexample @c ada
1280 pragma AST_Entry (entry_IDENTIFIER);
1281 @end smallexample
1282
1283 @noindent
1284 This pragma is implemented only in the OpenVMS implementation of GNAT@.  The
1285 argument is the simple name of a single entry; at most one @code{AST_Entry}
1286 pragma is allowed for any given entry.  This pragma must be used in
1287 conjunction with the @code{AST_Entry} attribute, and is only allowed after
1288 the entry declaration and in the same task type specification or single task
1289 as the entry to which it applies.  This pragma specifies that the given entry
1290 may be used to handle an OpenVMS asynchronous system trap (@code{AST})
1291 resulting from an OpenVMS system service call.  The pragma does not affect
1292 normal use of the entry.  For further details on this pragma, see the
1293 DEC Ada Language Reference Manual, section 9.12a.
1294
1295 @node Pragma C_Pass_By_Copy
1296 @unnumberedsec Pragma C_Pass_By_Copy
1297 @cindex Passing by copy
1298 @findex C_Pass_By_Copy
1299 @noindent
1300 Syntax:
1301 @smallexample @c ada
1302 pragma C_Pass_By_Copy
1303   ([Max_Size =>] static_integer_EXPRESSION);
1304 @end smallexample
1305
1306 @noindent
1307 Normally the default mechanism for passing C convention records to C
1308 convention subprograms is to pass them by reference, as suggested by RM
1309 B.3(69).  Use the configuration pragma @code{C_Pass_By_Copy} to change
1310 this default, by requiring that record formal parameters be passed by
1311 copy if all of the following conditions are met:
1312
1313 @itemize @bullet
1314 @item
1315 The size of the record type does not exceed the value specified for
1316 @code{Max_Size}.
1317 @item
1318 The record type has @code{Convention C}.
1319 @item
1320 The formal parameter has this record type, and the subprogram has a
1321 foreign (non-Ada) convention.
1322 @end itemize
1323
1324 @noindent
1325 If these conditions are met the argument is passed by copy, i.e.@: in a
1326 manner consistent with what C expects if the corresponding formal in the
1327 C prototype is a struct (rather than a pointer to a struct).
1328
1329 You can also pass records by copy by specifying the convention
1330 @code{C_Pass_By_Copy} for the record type, or by using the extended
1331 @code{Import} and @code{Export} pragmas, which allow specification of
1332 passing mechanisms on a parameter by parameter basis.
1333
1334 @node Pragma Check
1335 @unnumberedsec Pragma Check
1336 @cindex Assertions
1337 @cindex Named assertions
1338 @findex Check
1339 @noindent
1340 Syntax:
1341 @smallexample @c ada
1342 pragma Check (
1343      [Name    =>] Identifier,
1344      [Check   =>] Boolean_EXPRESSION
1345   [, [Message =>] string_EXPRESSION] );
1346 @end smallexample
1347
1348 @noindent
1349 This pragma is similar to the predefined pragma @code{Assert} except that an
1350 extra identifier argument is present. In conjunction with pragma
1351 @code{Check_Policy}, this can be used to define groups of assertions that can
1352 be independently controlled. The identifier @code{Assertion} is special, it
1353 refers to the normal set of pragma @code{Assert} statements. The identifiers
1354 @code{Precondition} and @code{Postcondition} correspond to the pragmas of these
1355 names, so these three names would normally not be used directly in a pragma
1356 @code{Check}.
1357
1358 Checks introduced by this pragma are normally deactivated by default. They can
1359 be activated either by the command line option @option{-gnata}, which turns on
1360 all checks, or individually controlled using pragma @code{Check_Policy}.
1361
1362 @node Pragma Check_Name
1363 @unnumberedsec Pragma Check_Name
1364 @cindex Defining check names
1365 @cindex Check names, defining
1366 @findex Check_Name
1367 @noindent
1368 Syntax:
1369 @smallexample @c ada
1370 pragma Check_Name (check_name_IDENTIFIER);
1371 @end smallexample
1372
1373 @noindent
1374 This is a configuration pragma that defines a new implementation
1375 defined check name (unless IDENTIFIER matches one of the predefined
1376 check names, in which case the pragma has no effect). Check names
1377 are global to a partition, so if two or more configuration pragmas
1378 are present in a partition mentioning the same name, only one new
1379 check name is introduced.
1380
1381 An implementation defined check name introduced with this pragma may
1382 be used in only three contexts: @code{pragma Suppress},
1383 @code{pragma Unsuppress},
1384 and as the prefix of a @code{Check_Name'Enabled} attribute reference. For
1385 any of these three cases, the check name must be visible. A check
1386 name is visible if it is in the configuration pragmas applying to
1387 the current unit, or if it appears at the start of any unit that
1388 is part of the dependency set of the current unit (e.g., units that
1389 are mentioned in @code{with} clauses).
1390
1391 @node Pragma Check_Policy
1392 @unnumberedsec Pragma Check_Policy
1393 @cindex Controlling assertions
1394 @cindex Assertions, control
1395 @cindex Check pragma control
1396 @cindex Named assertions
1397 @findex Check
1398 @noindent
1399 Syntax:
1400 @smallexample @c ada
1401 pragma Check_Policy
1402  ([Name   =>] Identifier,
1403   [Policy =>] POLICY_IDENTIFIER);
1404
1405 POLICY_IDENTIFIER ::= ON | OFF | CHECK | DISABLE | IGNORE
1406 @end smallexample
1407
1408 @noindent
1409 This pragma is similar to the predefined pragma @code{Assertion_Policy},
1410 except that it controls sets of named assertions introduced using the
1411 @code{Check} pragmas. It can be used as a configuration pragma or (unlike
1412 @code{Assertion_Policy}) can be used within a declarative part, in which case
1413 it controls the status to the end of the corresponding construct (in a manner
1414 identical to pragma @code{Suppress)}.
1415
1416 The identifier given as the first argument corresponds to a name used in
1417 associated @code{Check} pragmas. For example, if the pragma:
1418
1419 @smallexample @c ada
1420 pragma Check_Policy (Critical_Error, OFF);
1421 @end smallexample
1422
1423 @noindent
1424 is given, then subsequent @code{Check} pragmas whose first argument is also
1425 @code{Critical_Error} will be disabled. The special identifier @code{Assertion}
1426 controls the behavior of normal @code{Assert} pragmas (thus a pragma
1427 @code{Check_Policy} with this identifier is similar to the normal
1428 @code{Assertion_Policy} pragma except that it can appear within a
1429 declarative part).
1430
1431 The special identifiers @code{Precondition} and @code{Postcondition} control
1432 the status of preconditions and postconditions. If a @code{Precondition} pragma
1433 is encountered, it is ignored if turned off by a @code{Check_Policy} specifying
1434 that @code{Precondition} checks are @code{Off} or @code{Ignored}. Similarly use
1435 of the name @code{Postcondition} controls whether @code{Postcondition} pragmas
1436 are recognized.
1437
1438 The check policy is @code{OFF} to turn off corresponding checks, and @code{ON}
1439 to turn on corresponding checks. The default for a set of checks for which no
1440 @code{Check_Policy} is given is @code{OFF} unless the compiler switch
1441 @option{-gnata} is given, which turns on all checks by default.
1442
1443 The check policy settings @code{CHECK} and @code{IGNORE} are also recognized
1444 as synonyms for @code{ON} and @code{OFF}. These synonyms are provided for
1445 compatibility with the standard @code{Assertion_Policy} pragma.
1446
1447 The implementation defined policy @code{DISABLE} is like
1448 @code{OFF} except that it completely disables semantic
1449 checking of the argument to the corresponding class of
1450 pragmas. This may be useful when the pragma arguments reference
1451 subprograms in a with'ed package which is replaced by a dummy package
1452 for the final build.
1453
1454 @node Pragma Comment
1455 @unnumberedsec Pragma Comment
1456 @findex Comment
1457 @noindent
1458 Syntax:
1459
1460 @smallexample @c ada
1461 pragma Comment (static_string_EXPRESSION);
1462 @end smallexample
1463
1464 @noindent
1465 This is almost identical in effect to pragma @code{Ident}.  It allows the
1466 placement of a comment into the object file and hence into the
1467 executable file if the operating system permits such usage.  The
1468 difference is that @code{Comment}, unlike @code{Ident}, has
1469 no limitations on placement of the pragma (it can be placed
1470 anywhere in the main source unit), and if more than one pragma
1471 is used, all comments are retained.
1472
1473 @node Pragma Common_Object
1474 @unnumberedsec Pragma Common_Object
1475 @findex Common_Object
1476 @noindent
1477 Syntax:
1478
1479 @smallexample @c ada
1480 pragma Common_Object (
1481      [Internal =>] LOCAL_NAME
1482   [, [External =>] EXTERNAL_SYMBOL]
1483   [, [Size     =>] EXTERNAL_SYMBOL] );
1484
1485 EXTERNAL_SYMBOL ::=
1486   IDENTIFIER
1487 | static_string_EXPRESSION
1488 @end smallexample
1489
1490 @noindent
1491 This pragma enables the shared use of variables stored in overlaid
1492 linker areas corresponding to the use of @code{COMMON}
1493 in Fortran.  The single
1494 object @var{LOCAL_NAME} is assigned to the area designated by
1495 the @var{External} argument.
1496 You may define a record to correspond to a series
1497 of fields.  The @var{Size} argument
1498 is syntax checked in GNAT, but otherwise ignored.
1499
1500 @code{Common_Object} is not supported on all platforms.  If no
1501 support is available, then the code generator will issue a message
1502 indicating that the necessary attribute for implementation of this
1503 pragma is not available.
1504
1505 @node Pragma Compile_Time_Error
1506 @unnumberedsec Pragma Compile_Time_Error
1507 @findex Compile_Time_Error
1508 @noindent
1509 Syntax:
1510
1511 @smallexample @c ada
1512 pragma Compile_Time_Error
1513          (boolean_EXPRESSION, static_string_EXPRESSION);
1514 @end smallexample
1515
1516 @noindent
1517 This pragma can be used to generate additional compile time
1518 error messages. It
1519 is particularly useful in generics, where errors can be issued for
1520 specific problematic instantiations. The first parameter is a boolean
1521 expression. The pragma is effective only if the value of this expression
1522 is known at compile time, and has the value True. The set of expressions
1523 whose values are known at compile time includes all static boolean
1524 expressions, and also other values which the compiler can determine
1525 at compile time (e.g., the size of a record type set by an explicit
1526 size representation clause, or the value of a variable which was
1527 initialized to a constant and is known not to have been modified).
1528 If these conditions are met, an error message is generated using
1529 the value given as the second argument. This string value may contain
1530 embedded ASCII.LF characters to break the message into multiple lines.
1531
1532 @node Pragma Compile_Time_Warning
1533 @unnumberedsec Pragma Compile_Time_Warning
1534 @findex Compile_Time_Warning
1535 @noindent
1536 Syntax:
1537
1538 @smallexample @c ada
1539 pragma Compile_Time_Warning
1540          (boolean_EXPRESSION, static_string_EXPRESSION);
1541 @end smallexample
1542
1543 @noindent
1544 Same as pragma Compile_Time_Error, except a warning is issued instead
1545 of an error message. Note that if this pragma is used in a package that
1546 is with'ed by a client, the client will get the warning even though it
1547 is issued by a with'ed package (normally warnings in with'ed units are
1548 suppressed, but this is a special exception to that rule).
1549
1550 One typical use is within a generic where compile time known characteristics
1551 of formal parameters are tested, and warnings given appropriately. Another use
1552 with a first parameter of True is to warn a client about use of a package,
1553 for example that it is not fully implemented.
1554
1555 @node Pragma Compiler_Unit
1556 @unnumberedsec Pragma Compiler_Unit
1557 @findex Compiler_Unit
1558 @noindent
1559 Syntax:
1560
1561 @smallexample @c ada
1562 pragma Compiler_Unit;
1563 @end smallexample
1564
1565 @noindent
1566 This pragma is intended only for internal use in the GNAT run-time library.
1567 It indicates that the unit is used as part of the compiler build. The effect
1568 is to disallow constructs (raise with message, conditional expressions etc)
1569 that would cause trouble when bootstrapping using an older version of GNAT.
1570 For the exact list of restrictions, see the compiler sources and references
1571 to Is_Compiler_Unit.
1572
1573 @node Pragma Complete_Representation
1574 @unnumberedsec Pragma Complete_Representation
1575 @findex Complete_Representation
1576 @noindent
1577 Syntax:
1578
1579 @smallexample @c ada
1580 pragma Complete_Representation;
1581 @end smallexample
1582
1583 @noindent
1584 This pragma must appear immediately within a record representation
1585 clause. Typical placements are before the first component clause
1586 or after the last component clause. The effect is to give an error
1587 message if any component is missing a component clause. This pragma
1588 may be used to ensure that a record representation clause is
1589 complete, and that this invariant is maintained if fields are
1590 added to the record in the future.
1591
1592 @node Pragma Complex_Representation
1593 @unnumberedsec Pragma Complex_Representation
1594 @findex Complex_Representation
1595 @noindent
1596 Syntax:
1597
1598 @smallexample @c ada
1599 pragma Complex_Representation
1600         ([Entity =>] LOCAL_NAME);
1601 @end smallexample
1602
1603 @noindent
1604 The @var{Entity} argument must be the name of a record type which has
1605 two fields of the same floating-point type.  The effect of this pragma is
1606 to force gcc to use the special internal complex representation form for
1607 this record, which may be more efficient.  Note that this may result in
1608 the code for this type not conforming to standard ABI (application
1609 binary interface) requirements for the handling of record types.  For
1610 example, in some environments, there is a requirement for passing
1611 records by pointer, and the use of this pragma may result in passing
1612 this type in floating-point registers.
1613
1614 @node Pragma Component_Alignment
1615 @unnumberedsec Pragma Component_Alignment
1616 @cindex Alignments of components
1617 @findex Component_Alignment
1618 @noindent
1619 Syntax:
1620
1621 @smallexample @c ada
1622 pragma Component_Alignment (
1623      [Form =>] ALIGNMENT_CHOICE
1624   [, [Name =>] type_LOCAL_NAME]);
1625
1626 ALIGNMENT_CHOICE ::=
1627   Component_Size
1628 | Component_Size_4
1629 | Storage_Unit
1630 | Default
1631 @end smallexample
1632
1633 @noindent
1634 Specifies the alignment of components in array or record types.
1635 The meaning of the @var{Form} argument is as follows:
1636
1637 @table @code
1638 @findex Component_Size
1639 @item Component_Size
1640 Aligns scalar components and subcomponents of the array or record type
1641 on boundaries appropriate to their inherent size (naturally
1642 aligned).  For example, 1-byte components are aligned on byte boundaries,
1643 2-byte integer components are aligned on 2-byte boundaries, 4-byte
1644 integer components are aligned on 4-byte boundaries and so on.  These
1645 alignment rules correspond to the normal rules for C compilers on all
1646 machines except the VAX@.
1647
1648 @findex Component_Size_4
1649 @item Component_Size_4
1650 Naturally aligns components with a size of four or fewer
1651 bytes.  Components that are larger than 4 bytes are placed on the next
1652 4-byte boundary.
1653
1654 @findex Storage_Unit
1655 @item Storage_Unit
1656 Specifies that array or record components are byte aligned, i.e.@:
1657 aligned on boundaries determined by the value of the constant
1658 @code{System.Storage_Unit}.
1659
1660 @cindex OpenVMS
1661 @item Default
1662 Specifies that array or record components are aligned on default
1663 boundaries, appropriate to the underlying hardware or operating system or
1664 both.  For OpenVMS VAX systems, the @code{Default} choice is the same as
1665 the @code{Storage_Unit} choice (byte alignment).  For all other systems,
1666 the @code{Default} choice is the same as @code{Component_Size} (natural
1667 alignment).
1668 @end table
1669
1670 @noindent
1671 If the @code{Name} parameter is present, @var{type_LOCAL_NAME} must
1672 refer to a local record or array type, and the specified alignment
1673 choice applies to the specified type.  The use of
1674 @code{Component_Alignment} together with a pragma @code{Pack} causes the
1675 @code{Component_Alignment} pragma to be ignored.  The use of
1676 @code{Component_Alignment} together with a record representation clause
1677 is only effective for fields not specified by the representation clause.
1678
1679 If the @code{Name} parameter is absent, the pragma can be used as either
1680 a configuration pragma, in which case it applies to one or more units in
1681 accordance with the normal rules for configuration pragmas, or it can be
1682 used within a declarative part, in which case it applies to types that
1683 are declared within this declarative part, or within any nested scope
1684 within this declarative part.  In either case it specifies the alignment
1685 to be applied to any record or array type which has otherwise standard
1686 representation.
1687
1688 If the alignment for a record or array type is not specified (using
1689 pragma @code{Pack}, pragma @code{Component_Alignment}, or a record rep
1690 clause), the GNAT uses the default alignment as described previously.
1691
1692 @node Pragma Convention_Identifier
1693 @unnumberedsec Pragma Convention_Identifier
1694 @findex Convention_Identifier
1695 @cindex Conventions, synonyms
1696 @noindent
1697 Syntax:
1698
1699 @smallexample @c ada
1700 pragma Convention_Identifier (
1701          [Name =>]       IDENTIFIER,
1702          [Convention =>] convention_IDENTIFIER);
1703 @end smallexample
1704
1705 @noindent
1706 This pragma provides a mechanism for supplying synonyms for existing
1707 convention identifiers. The @code{Name} identifier can subsequently
1708 be used as a synonym for the given convention in other pragmas (including
1709 for example pragma @code{Import} or another @code{Convention_Identifier}
1710 pragma). As an example of the use of this, suppose you had legacy code
1711 which used Fortran77 as the identifier for Fortran. Then the pragma:
1712
1713 @smallexample @c ada
1714 pragma Convention_Identifier (Fortran77, Fortran);
1715 @end smallexample
1716
1717 @noindent
1718 would allow the use of the convention identifier @code{Fortran77} in
1719 subsequent code, avoiding the need to modify the sources. As another
1720 example, you could use this to parameterize convention requirements
1721 according to systems. Suppose you needed to use @code{Stdcall} on
1722 windows systems, and @code{C} on some other system, then you could
1723 define a convention identifier @code{Library} and use a single
1724 @code{Convention_Identifier} pragma to specify which convention
1725 would be used system-wide.
1726
1727 @node Pragma CPP_Class
1728 @unnumberedsec Pragma CPP_Class
1729 @findex CPP_Class
1730 @cindex Interfacing with C++
1731 @noindent
1732 Syntax:
1733
1734 @smallexample @c ada
1735 pragma CPP_Class ([Entity =>] LOCAL_NAME);
1736 @end smallexample
1737
1738 @noindent
1739 The argument denotes an entity in the current declarative region that is
1740 declared as a record type. It indicates that the type corresponds to an
1741 externally declared C++ class type, and is to be laid out the same way
1742 that C++ would lay out the type. If the C++ class has virtual primitives
1743 then the record must be declared as a tagged record type.
1744
1745 Types for which @code{CPP_Class} is specified do not have assignment or
1746 equality operators defined (such operations can be imported or declared
1747 as subprograms as required). Initialization is allowed only by constructor
1748 functions (see pragma @code{CPP_Constructor}). Such types are implicitly
1749 limited if not explicitly declared as limited or derived from a limited
1750 type, and an error is issued in that case.
1751
1752 Pragma @code{CPP_Class} is intended primarily for automatic generation
1753 using an automatic binding generator tool.
1754 See @ref{Interfacing to C++} for related information.
1755
1756 Note: Pragma @code{CPP_Class} is currently obsolete. It is supported
1757 for backward compatibility but its functionality is available
1758 using pragma @code{Import} with @code{Convention} = @code{CPP}.
1759
1760 @node Pragma CPP_Constructor
1761 @unnumberedsec Pragma CPP_Constructor
1762 @cindex Interfacing with C++
1763 @findex CPP_Constructor
1764 @noindent
1765 Syntax:
1766
1767 @smallexample @c ada
1768 pragma CPP_Constructor ([Entity =>] LOCAL_NAME
1769   [, [External_Name =>] static_string_EXPRESSION ]
1770   [, [Link_Name     =>] static_string_EXPRESSION ]);
1771 @end smallexample
1772
1773 @noindent
1774 This pragma identifies an imported function (imported in the usual way
1775 with pragma @code{Import}) as corresponding to a C++ constructor. If
1776 @code{External_Name} and @code{Link_Name} are not specified then the
1777 @code{Entity} argument is a name that must have been previously mentioned
1778 in a pragma @code{Import} with @code{Convention} = @code{CPP}. Such name
1779 must be of one of the following forms:
1780
1781 @itemize @bullet
1782 @item
1783 @code{function @var{Fname} return @var{T}}
1784
1785 @itemize @bullet
1786 @item
1787 @code{function @var{Fname} return @var{T}'Class}
1788
1789 @item
1790 @code{function @var{Fname} (@dots{}) return @var{T}}
1791 @end itemize
1792
1793 @item
1794 @code{function @var{Fname} (@dots{}) return @var{T}'Class}
1795 @end itemize
1796
1797 @noindent
1798 where @var{T} is a limited record type imported from C++ with pragma
1799 @code{Import} and @code{Convention} = @code{CPP}.
1800
1801 The first two forms import the default constructor, used when an object
1802 of type @var{T} is created on the Ada side with no explicit constructor.
1803 The latter two forms cover all the non-default constructors of the type.
1804 See the GNAT users guide for details.
1805
1806 If no constructors are imported, it is impossible to create any objects
1807 on the Ada side and the type is implicitly declared abstract.
1808
1809 Pragma @code{CPP_Constructor} is intended primarily for automatic generation
1810 using an automatic binding generator tool.
1811 See @ref{Interfacing to C++} for more related information.
1812
1813 Note: The use of functions returning class-wide types for constructors is
1814 currently obsolete. They are supported for backward compatibility. The
1815 use of functions returning the type T leave the Ada sources more clear
1816 because the imported C++ constructors always return an object of type T;
1817 that is, they never return an object whose type is a descendant of type T.
1818
1819 @node Pragma CPP_Virtual
1820 @unnumberedsec Pragma CPP_Virtual
1821 @cindex Interfacing to C++
1822 @findex CPP_Virtual
1823 @noindent
1824 This pragma is now obsolete has has no effect because GNAT generates
1825 the same object layout than the G++ compiler.
1826
1827 See @ref{Interfacing to C++} for related information.
1828
1829 @node Pragma CPP_Vtable
1830 @unnumberedsec Pragma CPP_Vtable
1831 @cindex Interfacing with C++
1832 @findex CPP_Vtable
1833 @noindent
1834 This pragma is now obsolete has has no effect because GNAT generates
1835 the same object layout than the G++ compiler.
1836
1837 See @ref{Interfacing to C++} for related information.
1838
1839 @node Pragma Debug
1840 @unnumberedsec Pragma Debug
1841 @findex Debug
1842 @noindent
1843 Syntax:
1844
1845 @smallexample @c ada
1846 pragma Debug ([CONDITION, ]PROCEDURE_CALL_WITHOUT_SEMICOLON);
1847
1848 PROCEDURE_CALL_WITHOUT_SEMICOLON ::=
1849   PROCEDURE_NAME
1850 | PROCEDURE_PREFIX ACTUAL_PARAMETER_PART
1851 @end smallexample
1852
1853 @noindent
1854 The procedure call argument has the syntactic form of an expression, meeting
1855 the syntactic requirements for pragmas.
1856
1857 If debug pragmas are not enabled or if the condition is present and evaluates
1858 to False, this pragma has no effect. If debug pragmas are enabled, the
1859 semantics of the pragma is exactly equivalent to the procedure call statement
1860 corresponding to the argument with a terminating semicolon. Pragmas are
1861 permitted in sequences of declarations, so you can use pragma @code{Debug} to
1862 intersperse calls to debug procedures in the middle of declarations. Debug
1863 pragmas can be enabled either by use of the command line switch @option{-gnata}
1864 or by use of the configuration pragma @code{Debug_Policy}.
1865
1866 @node Pragma Debug_Policy
1867 @unnumberedsec Pragma Debug_Policy
1868 @findex Debug_Policy
1869 @noindent
1870 Syntax:
1871
1872 @smallexample @c ada
1873 pragma Debug_Policy (CHECK | DISABLE | IGNORE);
1874 @end smallexample
1875
1876 @noindent
1877 If the argument is @code{CHECK}, then pragma @code{DEBUG} is enabled.
1878 If the argument is @code{IGNORE}, then pragma @code{DEBUG} is ignored.
1879 This pragma overrides the effect of the @option{-gnata} switch on the
1880 command line.
1881
1882 The implementation defined policy @code{DISABLE} is like
1883 @code{IGNORE} except that it completely disables semantic
1884 checking of the argument to @code{pragma Debug}. This may
1885 be useful when the pragma argument references subprograms
1886 in a with'ed package which is replaced by a dummy package
1887 for the final build.
1888
1889 @node Pragma Detect_Blocking
1890 @unnumberedsec Pragma Detect_Blocking
1891 @findex Detect_Blocking
1892 @noindent
1893 Syntax:
1894
1895 @smallexample @c ada
1896 pragma Detect_Blocking;
1897 @end smallexample
1898
1899 @noindent
1900 This is a configuration pragma that forces the detection of potentially
1901 blocking operations within a protected operation, and to raise Program_Error
1902 if that happens.
1903
1904 @node Pragma Elaboration_Checks
1905 @unnumberedsec Pragma Elaboration_Checks
1906 @cindex Elaboration control
1907 @findex Elaboration_Checks
1908 @noindent
1909 Syntax:
1910
1911 @smallexample @c ada
1912 pragma Elaboration_Checks (Dynamic | Static);
1913 @end smallexample
1914
1915 @noindent
1916 This is a configuration pragma that provides control over the
1917 elaboration model used by the compilation affected by the
1918 pragma.  If the parameter is @code{Dynamic},
1919 then the dynamic elaboration
1920 model described in the Ada Reference Manual is used, as though
1921 the @option{-gnatE} switch had been specified on the command
1922 line.  If the parameter is @code{Static}, then the default GNAT static
1923 model is used.  This configuration pragma overrides the setting
1924 of the command line.  For full details on the elaboration models
1925 used by the GNAT compiler, see @ref{Elaboration Order Handling in GNAT,,,
1926 gnat_ugn, @value{EDITION} User's Guide}.
1927
1928 @node Pragma Eliminate
1929 @unnumberedsec Pragma Eliminate
1930 @cindex Elimination of unused subprograms
1931 @findex Eliminate
1932 @noindent
1933 Syntax:
1934
1935 @smallexample @c ada
1936 pragma Eliminate ([Entity          =>] DEFINING_DESIGNATOR,
1937                   [Source_Location =>] STRING_LITERAL);
1938 @end smallexample
1939
1940 @noindent
1941 The string literal given for the source location is a string which
1942 specifies the line number of the occurrence of the entity, using
1943 the syntax for SOURCE_TRACE given below:
1944
1945 @smallexample @c ada
1946  SOURCE_TRACE     ::= SOURCE_REFERENCE [LBRACKET SOURCE_TRACE RBRACKET]
1947
1948  LBRACKET         ::= [
1949  RBRACKET         ::= ]
1950
1951  SOURCE_REFERENCE ::= FILE_NAME : LINE_NUMBER
1952
1953  LINE_NUMBER      ::= DIGIT @{DIGIT@}
1954 @end smallexample
1955
1956 @noindent
1957 Spaces around the colon in a @code{Source_Reference} are optional.
1958
1959 The @code{DEFINING_DESIGNATOR} matches the defining designator used in an
1960 explicit subprogram declaration, where the @code{entity} name in this
1961 designator appears on the source line specified by the source location.
1962
1963 The source trace that is given as the @code{Source_Location} shall obey the
1964 following rules. The @code{FILE_NAME} is the short name (with no directory
1965 information) of an Ada source file, given using exactly the required syntax
1966 for the underlying file system (e.g. case is important if the underlying
1967 operating system is case sensitive). @code{LINE_NUMBER} gives the line
1968 number of the occurrence of the @code{entity}
1969 as a decimal literal without an exponent or point. If an @code{entity} is not
1970 declared in a generic instantiation (this includes generic subprogram
1971 instances), the source trace includes only one source reference. If an entity
1972 is declared inside a generic instantiation, its source trace (when parsing
1973 from left to right) starts with the source location of the declaration of the
1974 entity in the generic unit and ends with the source location of the
1975 instantiation (it is given in square brackets). This approach is recursively
1976 used in case of nested instantiations: the rightmost (nested most deeply in
1977 square brackets) element of the source trace is the location of the outermost
1978 instantiation, the next to left element is the location of the next (first
1979 nested) instantiation in the code of the corresponding generic unit, and so
1980 on, and the leftmost element (that is out of any square brackets) is the
1981 location of the declaration of the entity to eliminate in a generic unit.
1982
1983 Note that the @code{Source_Location} argument specifies which of a set of
1984 similarly named entities is being eliminated, dealing both with overloading,
1985 and also appearence of the same entity name in different scopes.
1986
1987 This pragma indicates that the given entity is not used in the program to be
1988 compiled and built. The effect of the pragma is to allow the compiler to
1989 eliminate the code or data associated with the named entity. Any reference to
1990 an eliminated entity causes a compile-time or link-time error.
1991
1992 The intention of pragma @code{Eliminate} is to allow a program to be compiled
1993 in a system-independent manner, with unused entities eliminated, without
1994 needing to modify the source text. Normally the required set of
1995 @code{Eliminate} pragmas is constructed automatically using the gnatelim tool.
1996
1997 Any source file change that removes, splits, or
1998 adds lines may make the set of Eliminate pragmas invalid because their
1999 @code{Source_Location} argument values may get out of date.
2000
2001 Pragma @code{Eliminate} may be used where the referenced entity is a dispatching
2002 operation. In this case all the subprograms to which the given operation can
2003 dispatch are considered to be unused (are never called as a result of a direct
2004 or a dispatching call).
2005
2006 @node Pragma Export_Exception
2007 @unnumberedsec Pragma Export_Exception
2008 @cindex OpenVMS
2009 @findex Export_Exception
2010 @noindent
2011 Syntax:
2012
2013 @smallexample @c ada
2014 pragma Export_Exception (
2015      [Internal =>] LOCAL_NAME
2016   [, [External =>] EXTERNAL_SYMBOL]
2017   [, [Form     =>] Ada | VMS]
2018   [, [Code     =>] static_integer_EXPRESSION]);
2019
2020 EXTERNAL_SYMBOL ::=
2021   IDENTIFIER
2022 | static_string_EXPRESSION
2023 @end smallexample
2024
2025 @noindent
2026 This pragma is implemented only in the OpenVMS implementation of GNAT@.  It
2027 causes the specified exception to be propagated outside of the Ada program,
2028 so that it can be handled by programs written in other OpenVMS languages.
2029 This pragma establishes an external name for an Ada exception and makes the
2030 name available to the OpenVMS Linker as a global symbol.  For further details
2031 on this pragma, see the
2032 DEC Ada Language Reference Manual, section 13.9a3.2.
2033
2034 @node Pragma Export_Function
2035 @unnumberedsec Pragma Export_Function
2036 @cindex Argument passing mechanisms
2037 @findex Export_Function
2038
2039 @noindent
2040 Syntax:
2041
2042 @smallexample @c ada
2043 pragma Export_Function (
2044      [Internal         =>] LOCAL_NAME
2045   [, [External         =>] EXTERNAL_SYMBOL]
2046   [, [Parameter_Types  =>] PARAMETER_TYPES]
2047   [, [Result_Type      =>] result_SUBTYPE_MARK]
2048   [, [Mechanism        =>] MECHANISM]
2049   [, [Result_Mechanism =>] MECHANISM_NAME]);
2050
2051 EXTERNAL_SYMBOL ::=
2052   IDENTIFIER
2053 | static_string_EXPRESSION
2054 | ""
2055
2056 PARAMETER_TYPES ::=
2057   null
2058 | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
2059
2060 TYPE_DESIGNATOR ::=
2061   subtype_NAME
2062 | subtype_Name ' Access
2063
2064 MECHANISM ::=
2065   MECHANISM_NAME
2066 | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
2067
2068 MECHANISM_ASSOCIATION ::=
2069   [formal_parameter_NAME =>] MECHANISM_NAME
2070
2071 MECHANISM_NAME ::=
2072   Value
2073 | Reference
2074 | Descriptor [([Class =>] CLASS_NAME)]
2075 | Short_Descriptor [([Class =>] CLASS_NAME)]
2076
2077 CLASS_NAME ::= ubs | ubsb | uba | s | sb | a
2078 @end smallexample
2079
2080 @noindent
2081 Use this pragma to make a function externally callable and optionally
2082 provide information on mechanisms to be used for passing parameter and
2083 result values.  We recommend, for the purposes of improving portability,
2084 this pragma always be used in conjunction with a separate pragma
2085 @code{Export}, which must precede the pragma @code{Export_Function}.
2086 GNAT does not require a separate pragma @code{Export}, but if none is
2087 present, @code{Convention Ada} is assumed, which is usually
2088 not what is wanted, so it is usually appropriate to use this
2089 pragma in conjunction with a @code{Export} or @code{Convention}
2090 pragma that specifies the desired foreign convention.
2091 Pragma @code{Export_Function}
2092 (and @code{Export}, if present) must appear in the same declarative
2093 region as the function to which they apply.
2094
2095 @var{internal_name} must uniquely designate the function to which the
2096 pragma applies.  If more than one function name exists of this name in
2097 the declarative part you must use the @code{Parameter_Types} and
2098 @code{Result_Type} parameters is mandatory to achieve the required
2099 unique designation.  @var{subtype_mark}s in these parameters must
2100 exactly match the subtypes in the corresponding function specification,
2101 using positional notation to match parameters with subtype marks.
2102 The form with an @code{'Access} attribute can be used to match an
2103 anonymous access parameter.
2104
2105 @cindex OpenVMS
2106 @cindex Passing by descriptor
2107 Passing by descriptor is supported only on the OpenVMS ports of GNAT@.
2108 The default behavior for Export_Function is to accept either 64bit or
2109 32bit descriptors unless short_descriptor is specified, then only 32bit
2110 descriptors are accepted.
2111
2112 @cindex Suppressing external name
2113 Special treatment is given if the EXTERNAL is an explicit null
2114 string or a static string expressions that evaluates to the null
2115 string. In this case, no external name is generated. This form
2116 still allows the specification of parameter mechanisms.
2117
2118 @node Pragma Export_Object
2119 @unnumberedsec Pragma Export_Object
2120 @findex Export_Object
2121 @noindent
2122 Syntax:
2123
2124 @smallexample @c ada
2125 pragma Export_Object
2126       [Internal =>] LOCAL_NAME
2127    [, [External =>] EXTERNAL_SYMBOL]
2128    [, [Size     =>] EXTERNAL_SYMBOL]
2129
2130 EXTERNAL_SYMBOL ::=
2131   IDENTIFIER
2132 | static_string_EXPRESSION
2133 @end smallexample
2134
2135 @noindent
2136 This pragma designates an object as exported, and apart from the
2137 extended rules for external symbols, is identical in effect to the use of
2138 the normal @code{Export} pragma applied to an object.  You may use a
2139 separate Export pragma (and you probably should from the point of view
2140 of portability), but it is not required.  @var{Size} is syntax checked,
2141 but otherwise ignored by GNAT@.
2142
2143 @node Pragma Export_Procedure
2144 @unnumberedsec Pragma Export_Procedure
2145 @findex Export_Procedure
2146 @noindent
2147 Syntax:
2148
2149 @smallexample @c ada
2150 pragma Export_Procedure (
2151      [Internal        =>] LOCAL_NAME
2152   [, [External        =>] EXTERNAL_SYMBOL]
2153   [, [Parameter_Types =>] PARAMETER_TYPES]
2154   [, [Mechanism       =>] MECHANISM]);
2155
2156 EXTERNAL_SYMBOL ::=
2157   IDENTIFIER
2158 | static_string_EXPRESSION
2159 | ""
2160
2161 PARAMETER_TYPES ::=
2162   null
2163 | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
2164
2165 TYPE_DESIGNATOR ::=
2166   subtype_NAME
2167 | subtype_Name ' Access
2168
2169 MECHANISM ::=
2170   MECHANISM_NAME
2171 | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
2172
2173 MECHANISM_ASSOCIATION ::=
2174   [formal_parameter_NAME =>] MECHANISM_NAME
2175
2176 MECHANISM_NAME ::=
2177   Value
2178 | Reference
2179 | Descriptor [([Class =>] CLASS_NAME)]
2180 | Short_Descriptor [([Class =>] CLASS_NAME)]
2181
2182 CLASS_NAME ::= ubs | ubsb | uba | s | sb | a
2183 @end smallexample
2184
2185 @noindent
2186 This pragma is identical to @code{Export_Function} except that it
2187 applies to a procedure rather than a function and the parameters
2188 @code{Result_Type} and @code{Result_Mechanism} are not permitted.
2189 GNAT does not require a separate pragma @code{Export}, but if none is
2190 present, @code{Convention Ada} is assumed, which is usually
2191 not what is wanted, so it is usually appropriate to use this
2192 pragma in conjunction with a @code{Export} or @code{Convention}
2193 pragma that specifies the desired foreign convention.
2194
2195 @cindex OpenVMS
2196 @cindex Passing by descriptor
2197 Passing by descriptor is supported only on the OpenVMS ports of GNAT@.
2198 The default behavior for Export_Procedure is to accept either 64bit or
2199 32bit descriptors unless short_descriptor is specified, then only 32bit
2200 descriptors are accepted.
2201
2202 @cindex Suppressing external name
2203 Special treatment is given if the EXTERNAL is an explicit null
2204 string or a static string expressions that evaluates to the null
2205 string. In this case, no external name is generated. This form
2206 still allows the specification of parameter mechanisms.
2207
2208 @node Pragma Export_Value
2209 @unnumberedsec Pragma Export_Value
2210 @findex Export_Value
2211 @noindent
2212 Syntax:
2213
2214 @smallexample @c ada
2215 pragma Export_Value (
2216   [Value     =>] static_integer_EXPRESSION,
2217   [Link_Name =>] static_string_EXPRESSION);
2218 @end smallexample
2219
2220 @noindent
2221 This pragma serves to export a static integer value for external use.
2222 The first argument specifies the value to be exported. The Link_Name
2223 argument specifies the symbolic name to be associated with the integer
2224 value. This pragma is useful for defining a named static value in Ada
2225 that can be referenced in assembly language units to be linked with
2226 the application. This pragma is currently supported only for the
2227 AAMP target and is ignored for other targets.
2228
2229 @node Pragma Export_Valued_Procedure
2230 @unnumberedsec Pragma Export_Valued_Procedure
2231 @findex Export_Valued_Procedure
2232 @noindent
2233 Syntax:
2234
2235 @smallexample @c ada
2236 pragma Export_Valued_Procedure (
2237      [Internal        =>] LOCAL_NAME
2238   [, [External        =>] EXTERNAL_SYMBOL]
2239   [, [Parameter_Types =>] PARAMETER_TYPES]
2240   [, [Mechanism       =>] MECHANISM]);
2241
2242 EXTERNAL_SYMBOL ::=
2243   IDENTIFIER
2244 | static_string_EXPRESSION
2245 | ""
2246
2247 PARAMETER_TYPES ::=
2248   null
2249 | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
2250
2251 TYPE_DESIGNATOR ::=
2252   subtype_NAME
2253 | subtype_Name ' Access
2254
2255 MECHANISM ::=
2256   MECHANISM_NAME
2257 | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
2258
2259 MECHANISM_ASSOCIATION ::=
2260   [formal_parameter_NAME =>] MECHANISM_NAME
2261
2262 MECHANISM_NAME ::=
2263   Value
2264 | Reference
2265 | Descriptor [([Class =>] CLASS_NAME)]
2266 | Short_Descriptor [([Class =>] CLASS_NAME)]
2267
2268 CLASS_NAME ::= ubs | ubsb | uba | s | sb | a
2269 @end smallexample
2270
2271 @noindent
2272 This pragma is identical to @code{Export_Procedure} except that the
2273 first parameter of @var{LOCAL_NAME}, which must be present, must be of
2274 mode @code{OUT}, and externally the subprogram is treated as a function
2275 with this parameter as the result of the function.  GNAT provides for
2276 this capability to allow the use of @code{OUT} and @code{IN OUT}
2277 parameters in interfacing to external functions (which are not permitted
2278 in Ada functions).
2279 GNAT does not require a separate pragma @code{Export}, but if none is
2280 present, @code{Convention Ada} is assumed, which is almost certainly
2281 not what is wanted since the whole point of this pragma is to interface
2282 with foreign language functions, so it is usually appropriate to use this
2283 pragma in conjunction with a @code{Export} or @code{Convention}
2284 pragma that specifies the desired foreign convention.
2285
2286 @cindex OpenVMS
2287 @cindex Passing by descriptor
2288 Passing by descriptor is supported only on the OpenVMS ports of GNAT@.
2289 The default behavior for Export_Valued_Procedure is to accept either 64bit or
2290 32bit descriptors unless short_descriptor is specified, then only 32bit
2291 descriptors are accepted.
2292
2293 @cindex Suppressing external name
2294 Special treatment is given if the EXTERNAL is an explicit null
2295 string or a static string expressions that evaluates to the null
2296 string. In this case, no external name is generated. This form
2297 still allows the specification of parameter mechanisms.
2298
2299 @node Pragma Extend_System
2300 @unnumberedsec Pragma Extend_System
2301 @cindex @code{system}, extending
2302 @cindex Dec Ada 83
2303 @findex Extend_System
2304 @noindent
2305 Syntax:
2306
2307 @smallexample @c ada
2308 pragma Extend_System ([Name =>] IDENTIFIER);
2309 @end smallexample
2310
2311 @noindent
2312 This pragma is used to provide backwards compatibility with other
2313 implementations that extend the facilities of package @code{System}.  In
2314 GNAT, @code{System} contains only the definitions that are present in
2315 the Ada RM@.  However, other implementations, notably the DEC Ada 83
2316 implementation, provide many extensions to package @code{System}.
2317
2318 For each such implementation accommodated by this pragma, GNAT provides a
2319 package @code{Aux_@var{xxx}}, e.g.@: @code{Aux_DEC} for the DEC Ada 83
2320 implementation, which provides the required additional definitions.  You
2321 can use this package in two ways.  You can @code{with} it in the normal
2322 way and access entities either by selection or using a @code{use}
2323 clause.  In this case no special processing is required.
2324
2325 However, if existing code contains references such as
2326 @code{System.@var{xxx}} where @var{xxx} is an entity in the extended
2327 definitions provided in package @code{System}, you may use this pragma
2328 to extend visibility in @code{System} in a non-standard way that
2329 provides greater compatibility with the existing code.  Pragma
2330 @code{Extend_System} is a configuration pragma whose single argument is
2331 the name of the package containing the extended definition
2332 (e.g.@: @code{Aux_DEC} for the DEC Ada case).  A unit compiled under
2333 control of this pragma will be processed using special visibility
2334 processing that looks in package @code{System.Aux_@var{xxx}} where
2335 @code{Aux_@var{xxx}} is the pragma argument for any entity referenced in
2336 package @code{System}, but not found in package @code{System}.
2337
2338 You can use this pragma either to access a predefined @code{System}
2339 extension supplied with the compiler, for example @code{Aux_DEC} or
2340 you can construct your own extension unit following the above
2341 definition.  Note that such a package is a child of @code{System}
2342 and thus is considered part of the implementation.  To compile
2343 it you will have to use the appropriate switch for compiling
2344 system units.
2345 @xref{Top, @value{EDITION} User's Guide, About This Guide, gnat_ugn, @value{EDITION} User's Guide},
2346 for details.
2347
2348 @node Pragma Extensions_Allowed
2349 @unnumberedsec Pragma Extensions_Allowed
2350 @cindex Ada Extensions
2351 @cindex GNAT Extensions
2352 @findex Extensions_Allowed
2353 @noindent
2354 Syntax:
2355
2356 @smallexample @c ada
2357 pragma Extensions_Allowed (On | Off);
2358 @end smallexample
2359
2360 @noindent
2361 This configuration pragma enables or disables the implementation
2362 extension mode (the use of Off as a parameter cancels the effect
2363 of the @option{-gnatX} command switch).
2364
2365 In extension mode, the latest version of the Ada language is
2366 implemented (currently Ada 2012), and in addition a small number
2367 of GNAT specific extensions are recognized as follows:
2368
2369 @table @asis
2370 @item Constrained attribute for generic objects
2371 The @code{Constrained} attribute is permitted for objects of
2372 generic types. The result indicates if the corresponding actual
2373 is constrained.
2374
2375 @end table
2376
2377 @node Pragma External
2378 @unnumberedsec Pragma External
2379 @findex External
2380 @noindent
2381 Syntax:
2382
2383 @smallexample @c ada
2384 pragma External (
2385   [   Convention    =>] convention_IDENTIFIER,
2386   [   Entity        =>] LOCAL_NAME
2387   [, [External_Name =>] static_string_EXPRESSION ]
2388   [, [Link_Name     =>] static_string_EXPRESSION ]);
2389 @end smallexample
2390
2391 @noindent
2392 This pragma is identical in syntax and semantics to pragma
2393 @code{Export} as defined in the Ada Reference Manual.  It is
2394 provided for compatibility with some Ada 83 compilers that
2395 used this pragma for exactly the same purposes as pragma
2396 @code{Export} before the latter was standardized.
2397
2398 @node Pragma External_Name_Casing
2399 @unnumberedsec Pragma External_Name_Casing
2400 @cindex Dec Ada 83 casing compatibility
2401 @cindex External Names, casing
2402 @cindex Casing of External names
2403 @findex External_Name_Casing
2404 @noindent
2405 Syntax:
2406
2407 @smallexample @c ada
2408 pragma External_Name_Casing (
2409   Uppercase | Lowercase
2410   [, Uppercase | Lowercase | As_Is]);
2411 @end smallexample
2412
2413 @noindent
2414 This pragma provides control over the casing of external names associated
2415 with Import and Export pragmas.  There are two cases to consider:
2416
2417 @table @asis
2418 @item Implicit external names
2419 Implicit external names are derived from identifiers.  The most common case
2420 arises when a standard Ada Import or Export pragma is used with only two
2421 arguments, as in:
2422
2423 @smallexample @c ada
2424    pragma Import (C, C_Routine);
2425 @end smallexample
2426
2427 @noindent
2428 Since Ada is a case-insensitive language, the spelling of the identifier in
2429 the Ada source program does not provide any information on the desired
2430 casing of the external name, and so a convention is needed.  In GNAT the
2431 default treatment is that such names are converted to all lower case
2432 letters.  This corresponds to the normal C style in many environments.
2433 The first argument of pragma @code{External_Name_Casing} can be used to
2434 control this treatment.  If @code{Uppercase} is specified, then the name
2435 will be forced to all uppercase letters.  If @code{Lowercase} is specified,
2436 then the normal default of all lower case letters will be used.
2437
2438 This same implicit treatment is also used in the case of extended DEC Ada 83
2439 compatible Import and Export pragmas where an external name is explicitly
2440 specified using an identifier rather than a string.
2441
2442 @item Explicit external names
2443 Explicit external names are given as string literals.  The most common case
2444 arises when a standard Ada Import or Export pragma is used with three
2445 arguments, as in:
2446
2447 @smallexample @c ada
2448 pragma Import (C, C_Routine, "C_routine");
2449 @end smallexample
2450
2451 @noindent
2452 In this case, the string literal normally provides the exact casing required
2453 for the external name.  The second argument of pragma
2454 @code{External_Name_Casing} may be used to modify this behavior.
2455 If @code{Uppercase} is specified, then the name
2456 will be forced to all uppercase letters.  If @code{Lowercase} is specified,
2457 then the name will be forced to all lowercase letters.  A specification of
2458 @code{As_Is} provides the normal default behavior in which the casing is
2459 taken from the string provided.
2460 @end table
2461
2462 @noindent
2463 This pragma may appear anywhere that a pragma is valid.  In particular, it
2464 can be used as a configuration pragma in the @file{gnat.adc} file, in which
2465 case it applies to all subsequent compilations, or it can be used as a program
2466 unit pragma, in which case it only applies to the current unit, or it can
2467 be used more locally to control individual Import/Export pragmas.
2468
2469 It is primarily intended for use with OpenVMS systems, where many
2470 compilers convert all symbols to upper case by default.  For interfacing to
2471 such compilers (e.g.@: the DEC C compiler), it may be convenient to use
2472 the pragma:
2473
2474 @smallexample @c ada
2475 pragma External_Name_Casing (Uppercase, Uppercase);
2476 @end smallexample
2477
2478 @noindent
2479 to enforce the upper casing of all external symbols.
2480
2481 @node Pragma Fast_Math
2482 @unnumberedsec Pragma Fast_Math
2483 @findex Fast_Math
2484 @noindent
2485 Syntax:
2486
2487 @smallexample @c ada
2488 pragma Fast_Math;
2489 @end smallexample
2490
2491 @noindent
2492 This is a configuration pragma which activates a mode in which speed is
2493 considered more important for floating-point operations than absolutely
2494 accurate adherence to the requirements of the standard. Currently the
2495 following operations are affected:
2496
2497 @table @asis
2498 @item Complex Multiplication
2499 The normal simple formula for complex multiplication can result in intermediate
2500 overflows for numbers near the end of the range. The Ada standard requires that
2501 this situation be detected and corrected by scaling, but in Fast_Math mode such
2502 cases will simply result in overflow. Note that to take advantage of this you
2503 must instantiate your own version of @code{Ada.Numerics.Generic_Complex_Types}
2504 under control of the pragma, rather than use the preinstantiated versions.
2505 @end table
2506
2507 @node Pragma Favor_Top_Level
2508 @unnumberedsec Pragma Favor_Top_Level
2509 @findex Favor_Top_Level
2510 @noindent
2511 Syntax:
2512
2513 @smallexample @c ada
2514 pragma Favor_Top_Level (type_NAME);
2515 @end smallexample
2516
2517 @noindent
2518 The named type must be an access-to-subprogram type. This pragma is an
2519 efficiency hint to the compiler, regarding the use of 'Access or
2520 'Unrestricted_Access on nested (non-library-level) subprograms. The
2521 pragma means that nested subprograms are not used with this type, or
2522 are rare, so that the generated code should be efficient in the
2523 top-level case. When this pragma is used, dynamically generated
2524 trampolines may be used on some targets for nested subprograms.
2525 See also the No_Implicit_Dynamic_Code restriction.
2526
2527 @node Pragma Finalize_Storage_Only
2528 @unnumberedsec Pragma Finalize_Storage_Only
2529 @findex Finalize_Storage_Only
2530 @noindent
2531 Syntax:
2532
2533 @smallexample @c ada
2534 pragma Finalize_Storage_Only (first_subtype_LOCAL_NAME);
2535 @end smallexample
2536
2537 @noindent
2538 This pragma allows the compiler not to emit a Finalize call for objects
2539 defined at the library level.  This is mostly useful for types where
2540 finalization is only used to deal with storage reclamation since in most
2541 environments it is not necessary to reclaim memory just before terminating
2542 execution, hence the name.
2543
2544 @node Pragma Float_Representation
2545 @unnumberedsec Pragma Float_Representation
2546 @cindex OpenVMS
2547 @findex Float_Representation
2548 @noindent
2549 Syntax:
2550
2551 @smallexample @c ada
2552 pragma Float_Representation (FLOAT_REP[, float_type_LOCAL_NAME]);
2553
2554 FLOAT_REP ::= VAX_Float | IEEE_Float
2555 @end smallexample
2556
2557 @noindent
2558 In the one argument form, this pragma is a configuration pragma which
2559 allows control over the internal representation chosen for the predefined
2560 floating point types declared in the packages @code{Standard} and
2561 @code{System}. On all systems other than OpenVMS, the argument must
2562 be @code{IEEE_Float} and the pragma has no effect. On OpenVMS, the
2563 argument may be @code{VAX_Float} to specify the use of the VAX float
2564 format for the floating-point types in Standard. This requires that
2565 the standard runtime libraries be recompiled.
2566
2567 The two argument form specifies the representation to be used for
2568 the specified floating-point type. On all systems other than OpenVMS,
2569 the argument must
2570 be @code{IEEE_Float} and the pragma has no effect. On OpenVMS, the
2571 argument may be @code{VAX_Float} to specify the use of the VAX float
2572 format, as follows:
2573
2574 @itemize @bullet
2575 @item
2576 For digits values up to 6, F float format will be used.
2577 @item
2578 For digits values from 7 to 9, D float format will be used.
2579 @item
2580 For digits values from 10 to 15, G float format will be used.
2581 @item
2582 Digits values above 15 are not allowed.
2583 @end itemize
2584
2585 @node Pragma Ident
2586 @unnumberedsec Pragma Ident
2587 @findex Ident
2588 @noindent
2589 Syntax:
2590
2591 @smallexample @c ada
2592 pragma Ident (static_string_EXPRESSION);
2593 @end smallexample
2594
2595 @noindent
2596 This pragma provides a string identification in the generated object file,
2597 if the system supports the concept of this kind of identification string.
2598 This pragma is allowed only in the outermost declarative part or
2599 declarative items of a compilation unit. If more than one @code{Ident}
2600 pragma is given, only the last one processed is effective.
2601 @cindex OpenVMS
2602 On OpenVMS systems, the effect of the pragma is identical to the effect of
2603 the DEC Ada 83 pragma of the same name. Note that in DEC Ada 83, the
2604 maximum allowed length is 31 characters, so if it is important to
2605 maintain compatibility with this compiler, you should obey this length
2606 limit.
2607
2608 @node Pragma Implemented
2609 @unnumberedsec Pragma Implemented
2610 @findex Implemented
2611 @noindent
2612 Syntax:
2613
2614 @smallexample @c ada
2615 pragma Implemented (procedure_LOCAL_NAME, implementation_kind);
2616
2617 implementation_kind ::= By_Entry | By_Protected_Procedure | By_Any
2618 @end smallexample
2619
2620 @noindent
2621 This is an Ada 2012 representation pragma which applies to protected, task
2622 and synchronized interface primitives. The use of pragma Implemented provides
2623 a way to impose a static requirement on the overriding operation by adhering
2624 to one of the three implementation kids: entry, protected procedure or any of
2625 the above.
2626
2627 @smallexample @c ada
2628 type Synch_Iface is synchronized interface;
2629 procedure Prim_Op (Obj : in out Iface) is abstract;
2630 pragma Implemented (Prim_Op, By_Protected_Procedure);
2631
2632 protected type Prot_1 is new Synch_Iface with
2633    procedure Prim_Op;  --  Legal
2634 end Prot_1;
2635
2636 protected type Prot_2 is new Synch_Iface with
2637    entry Prim_Op;      --  Illegal
2638 end Prot_2;
2639
2640 task type Task_Typ is new Synch_Iface with
2641    entry Prim_Op;      --  Illegal
2642 end Task_Typ;
2643 @end smallexample
2644
2645 @noindent
2646 When applied to the procedure_or_entry_NAME of a requeue statement, pragma
2647 Implemented determines the runtime behavior of the requeue. Implementation kind
2648 By_Entry guarantees that the action of requeueing will proceed from an entry to
2649 another entry. Implementation kind By_Protected_Procedure transforms the
2650 requeue into a dispatching call, thus eliminating the chance of blocking. Kind
2651 By_Any shares the behavior of By_Entry and By_Protected_Procedure depending on
2652 the target's overriding subprogram kind.
2653
2654 @node Pragma Implicit_Packing
2655 @unnumberedsec Pragma Implicit_Packing
2656 @findex Implicit_Packing
2657 @noindent
2658 Syntax:
2659
2660 @smallexample @c ada
2661 pragma Implicit_Packing;
2662 @end smallexample
2663
2664 @noindent
2665 This is a configuration pragma that requests implicit packing for packed
2666 arrays for which a size clause is given but no explicit pragma Pack or
2667 specification of Component_Size is present. It also applies to records
2668 where no record representation clause is present. Consider this example:
2669
2670 @smallexample @c ada
2671 type R is array (0 .. 7) of Boolean;
2672 for R'Size use 8;
2673 @end smallexample
2674
2675 @noindent
2676 In accordance with the recommendation in the RM (RM 13.3(53)), a Size clause
2677 does not change the layout of a composite object. So the Size clause in the
2678 above example is normally rejected, since the default layout of the array uses
2679 8-bit components, and thus the array requires a minimum of 64 bits.
2680
2681 If this declaration is compiled in a region of code covered by an occurrence
2682 of the configuration pragma Implicit_Packing, then the Size clause in this
2683 and similar examples will cause implicit packing and thus be accepted. For
2684 this implicit packing to occur, the type in question must be an array of small
2685 components whose size is known at compile time, and the Size clause must
2686 specify the exact size that corresponds to the length of the array multiplied
2687 by the size in bits of the component type.
2688 @cindex Array packing
2689
2690 Similarly, the following example shows the use in the record case
2691
2692 @smallexample @c ada
2693 type r is record
2694    a, b, c, d, e, f, g, h : boolean;
2695    chr                    : character;
2696 end record;
2697 for r'size use 16;
2698 @end smallexample
2699
2700 @noindent
2701 Without a pragma Pack, each Boolean field requires 8 bits, so the
2702 minimum size is 72 bits, but with a pragma Pack, 16 bits would be
2703 sufficient. The use of pragma Implicit_Packing allows this record
2704 declaration to compile without an explicit pragma Pack.
2705 @node Pragma Import_Exception
2706 @unnumberedsec Pragma Import_Exception
2707 @cindex OpenVMS
2708 @findex Import_Exception
2709 @noindent
2710 Syntax:
2711
2712 @smallexample @c ada
2713 pragma Import_Exception (
2714      [Internal =>] LOCAL_NAME
2715   [, [External =>] EXTERNAL_SYMBOL]
2716   [, [Form     =>] Ada | VMS]
2717   [, [Code     =>] static_integer_EXPRESSION]);
2718
2719 EXTERNAL_SYMBOL ::=
2720   IDENTIFIER
2721 | static_string_EXPRESSION
2722 @end smallexample
2723
2724 @noindent
2725 This pragma is implemented only in the OpenVMS implementation of GNAT@.
2726 It allows OpenVMS conditions (for example, from OpenVMS system services or
2727 other OpenVMS languages) to be propagated to Ada programs as Ada exceptions.
2728 The pragma specifies that the exception associated with an exception
2729 declaration in an Ada program be defined externally (in non-Ada code).
2730 For further details on this pragma, see the
2731 DEC Ada Language Reference Manual, section 13.9a.3.1.
2732
2733 @node Pragma Import_Function
2734 @unnumberedsec Pragma Import_Function
2735 @findex Import_Function
2736 @noindent
2737 Syntax:
2738
2739 @smallexample @c ada
2740 pragma Import_Function (
2741      [Internal                 =>] LOCAL_NAME,
2742   [, [External                 =>] EXTERNAL_SYMBOL]
2743   [, [Parameter_Types          =>] PARAMETER_TYPES]
2744   [, [Result_Type              =>] SUBTYPE_MARK]
2745   [, [Mechanism                =>] MECHANISM]
2746   [, [Result_Mechanism         =>] MECHANISM_NAME]
2747   [, [First_Optional_Parameter =>] IDENTIFIER]);
2748
2749 EXTERNAL_SYMBOL ::=
2750   IDENTIFIER
2751 | static_string_EXPRESSION
2752
2753 PARAMETER_TYPES ::=
2754   null
2755 | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
2756
2757 TYPE_DESIGNATOR ::=
2758   subtype_NAME
2759 | subtype_Name ' Access
2760
2761 MECHANISM ::=
2762   MECHANISM_NAME
2763 | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
2764
2765 MECHANISM_ASSOCIATION ::=
2766   [formal_parameter_NAME =>] MECHANISM_NAME
2767
2768 MECHANISM_NAME ::=
2769   Value
2770 | Reference
2771 | Descriptor [([Class =>] CLASS_NAME)]
2772 | Short_Descriptor [([Class =>] CLASS_NAME)]
2773
2774 CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
2775 @end smallexample
2776
2777 @noindent
2778 This pragma is used in conjunction with a pragma @code{Import} to
2779 specify additional information for an imported function.  The pragma
2780 @code{Import} (or equivalent pragma @code{Interface}) must precede the
2781 @code{Import_Function} pragma and both must appear in the same
2782 declarative part as the function specification.
2783
2784 The @var{Internal} argument must uniquely designate
2785 the function to which the
2786 pragma applies.  If more than one function name exists of this name in
2787 the declarative part you must use the @code{Parameter_Types} and
2788 @var{Result_Type} parameters to achieve the required unique
2789 designation.  Subtype marks in these parameters must exactly match the
2790 subtypes in the corresponding function specification, using positional
2791 notation to match parameters with subtype marks.
2792 The form with an @code{'Access} attribute can be used to match an
2793 anonymous access parameter.
2794
2795 You may optionally use the @var{Mechanism} and @var{Result_Mechanism}
2796 parameters to specify passing mechanisms for the
2797 parameters and result.  If you specify a single mechanism name, it
2798 applies to all parameters.  Otherwise you may specify a mechanism on a
2799 parameter by parameter basis using either positional or named
2800 notation.  If the mechanism is not specified, the default mechanism
2801 is used.
2802
2803 @cindex OpenVMS
2804 @cindex Passing by descriptor
2805 Passing by descriptor is supported only on the OpenVMS ports of GNAT@.
2806 The default behavior for Import_Function is to pass a 64bit descriptor
2807 unless short_descriptor is specified, then a 32bit descriptor is passed.
2808
2809 @code{First_Optional_Parameter} applies only to OpenVMS ports of GNAT@.
2810 It specifies that the designated parameter and all following parameters
2811 are optional, meaning that they are not passed at the generated code
2812 level (this is distinct from the notion of optional parameters in Ada
2813 where the parameters are passed anyway with the designated optional
2814 parameters).  All optional parameters must be of mode @code{IN} and have
2815 default parameter values that are either known at compile time
2816 expressions, or uses of the @code{'Null_Parameter} attribute.
2817
2818 @node Pragma Import_Object
2819 @unnumberedsec Pragma Import_Object
2820 @findex Import_Object
2821 @noindent
2822 Syntax:
2823
2824 @smallexample @c ada
2825 pragma Import_Object
2826      [Internal =>] LOCAL_NAME
2827   [, [External =>] EXTERNAL_SYMBOL]
2828   [, [Size     =>] EXTERNAL_SYMBOL]);
2829
2830 EXTERNAL_SYMBOL ::=
2831   IDENTIFIER
2832 | static_string_EXPRESSION
2833 @end smallexample
2834
2835 @noindent
2836 This pragma designates an object as imported, and apart from the
2837 extended rules for external symbols, is identical in effect to the use of
2838 the normal @code{Import} pragma applied to an object.  Unlike the
2839 subprogram case, you need not use a separate @code{Import} pragma,
2840 although you may do so (and probably should do so from a portability
2841 point of view).  @var{size} is syntax checked, but otherwise ignored by
2842 GNAT@.
2843
2844 @node Pragma Import_Procedure
2845 @unnumberedsec Pragma Import_Procedure
2846 @findex Import_Procedure
2847 @noindent
2848 Syntax:
2849
2850 @smallexample @c ada
2851 pragma Import_Procedure (
2852      [Internal                 =>] LOCAL_NAME
2853   [, [External                 =>] EXTERNAL_SYMBOL]
2854   [, [Parameter_Types          =>] PARAMETER_TYPES]
2855   [, [Mechanism                =>] MECHANISM]
2856   [, [First_Optional_Parameter =>] IDENTIFIER]);
2857
2858 EXTERNAL_SYMBOL ::=
2859   IDENTIFIER
2860 | static_string_EXPRESSION
2861
2862 PARAMETER_TYPES ::=
2863   null
2864 | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
2865
2866 TYPE_DESIGNATOR ::=
2867   subtype_NAME
2868 | subtype_Name ' Access
2869
2870 MECHANISM ::=
2871   MECHANISM_NAME
2872 | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
2873
2874 MECHANISM_ASSOCIATION ::=
2875   [formal_parameter_NAME =>] MECHANISM_NAME
2876
2877 MECHANISM_NAME ::=
2878   Value
2879 | Reference
2880 | Descriptor [([Class =>] CLASS_NAME)]
2881 | Short_Descriptor [([Class =>] CLASS_NAME)]
2882
2883 CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
2884 @end smallexample
2885
2886 @noindent
2887 This pragma is identical to @code{Import_Function} except that it
2888 applies to a procedure rather than a function and the parameters
2889 @code{Result_Type} and @code{Result_Mechanism} are not permitted.
2890
2891 @node Pragma Import_Valued_Procedure
2892 @unnumberedsec Pragma Import_Valued_Procedure
2893 @findex Import_Valued_Procedure
2894 @noindent
2895 Syntax:
2896
2897 @smallexample @c ada
2898 pragma Import_Valued_Procedure (
2899      [Internal                 =>] LOCAL_NAME
2900   [, [External                 =>] EXTERNAL_SYMBOL]
2901   [, [Parameter_Types          =>] PARAMETER_TYPES]
2902   [, [Mechanism                =>] MECHANISM]
2903   [, [First_Optional_Parameter =>] IDENTIFIER]);
2904
2905 EXTERNAL_SYMBOL ::=
2906   IDENTIFIER
2907 | static_string_EXPRESSION
2908
2909 PARAMETER_TYPES ::=
2910   null
2911 | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
2912
2913 TYPE_DESIGNATOR ::=
2914   subtype_NAME
2915 | subtype_Name ' Access
2916
2917 MECHANISM ::=
2918   MECHANISM_NAME
2919 | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
2920
2921 MECHANISM_ASSOCIATION ::=
2922   [formal_parameter_NAME =>] MECHANISM_NAME
2923
2924 MECHANISM_NAME ::=
2925   Value
2926 | Reference
2927 | Descriptor [([Class =>] CLASS_NAME)]
2928 | Short_Descriptor [([Class =>] CLASS_NAME)]
2929
2930 CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
2931 @end smallexample
2932
2933 @noindent
2934 This pragma is identical to @code{Import_Procedure} except that the
2935 first parameter of @var{LOCAL_NAME}, which must be present, must be of
2936 mode @code{OUT}, and externally the subprogram is treated as a function
2937 with this parameter as the result of the function.  The purpose of this
2938 capability is to allow the use of @code{OUT} and @code{IN OUT}
2939 parameters in interfacing to external functions (which are not permitted
2940 in Ada functions).  You may optionally use the @code{Mechanism}
2941 parameters to specify passing mechanisms for the parameters.
2942 If you specify a single mechanism name, it applies to all parameters.
2943 Otherwise you may specify a mechanism on a parameter by parameter
2944 basis using either positional or named notation.  If the mechanism is not
2945 specified, the default mechanism is used.
2946
2947 Note that it is important to use this pragma in conjunction with a separate
2948 pragma Import that specifies the desired convention, since otherwise the
2949 default convention is Ada, which is almost certainly not what is required.
2950
2951 @node Pragma Initialize_Scalars
2952 @unnumberedsec Pragma Initialize_Scalars
2953 @findex Initialize_Scalars
2954 @cindex debugging with Initialize_Scalars
2955 @noindent
2956 Syntax:
2957
2958 @smallexample @c ada
2959 pragma Initialize_Scalars;
2960 @end smallexample
2961
2962 @noindent
2963 This pragma is similar to @code{Normalize_Scalars} conceptually but has
2964 two important differences.  First, there is no requirement for the pragma
2965 to be used uniformly in all units of a partition, in particular, it is fine
2966 to use this just for some or all of the application units of a partition,
2967 without needing to recompile the run-time library.
2968
2969 In the case where some units are compiled with the pragma, and some without,
2970 then a declaration of a variable where the type is defined in package
2971 Standard or is locally declared will always be subject to initialization,
2972 as will any declaration of a scalar variable.  For composite variables,
2973 whether the variable is initialized may also depend on whether the package
2974 in which the type of the variable is declared is compiled with the pragma.
2975
2976 The other important difference is that you can control the value used
2977 for initializing scalar objects.  At bind time, you can select several
2978 options for initialization. You can
2979 initialize with invalid values (similar to Normalize_Scalars, though for
2980 Initialize_Scalars it is not always possible to determine the invalid
2981 values in complex cases like signed component fields with non-standard
2982 sizes). You can also initialize with high or
2983 low values, or with a specified bit pattern.  See the users guide for binder
2984 options for specifying these cases.
2985
2986 This means that you can compile a program, and then without having to
2987 recompile the program, you can run it with different values being used
2988 for initializing otherwise uninitialized values, to test if your program
2989 behavior depends on the choice.  Of course the behavior should not change,
2990 and if it does, then most likely you have an erroneous reference to an
2991 uninitialized value.
2992
2993 It is even possible to change the value at execution time eliminating even
2994 the need to rebind with a different switch using an environment variable.
2995 See the GNAT users guide for details.
2996
2997 Note that pragma @code{Initialize_Scalars} is particularly useful in
2998 conjunction with the enhanced validity checking that is now provided
2999 in GNAT, which checks for invalid values under more conditions.
3000 Using this feature (see description of the @option{-gnatV} flag in the
3001 users guide) in conjunction with pragma @code{Initialize_Scalars}
3002 provides a powerful new tool to assist in the detection of problems
3003 caused by uninitialized variables.
3004
3005 Note: the use of @code{Initialize_Scalars} has a fairly extensive
3006 effect on the generated code. This may cause your code to be
3007 substantially larger. It may also cause an increase in the amount
3008 of stack required, so it is probably a good idea to turn on stack
3009 checking (see description of stack checking in the GNAT users guide)
3010 when using this pragma.
3011
3012 @node Pragma Inline_Always
3013 @unnumberedsec Pragma Inline_Always
3014 @findex Inline_Always
3015 @noindent
3016 Syntax:
3017
3018 @smallexample @c ada
3019 pragma Inline_Always (NAME [, NAME]);
3020 @end smallexample
3021
3022 @noindent
3023 Similar to pragma @code{Inline} except that inlining is not subject to
3024 the use of option @option{-gnatn} and the inlining happens regardless of
3025 whether this option is used.
3026
3027 @node Pragma Inline_Generic
3028 @unnumberedsec Pragma Inline_Generic
3029 @findex Inline_Generic
3030 @noindent
3031 Syntax:
3032
3033 @smallexample @c ada
3034 pragma Inline_Generic (generic_package_NAME);
3035 @end smallexample
3036
3037 @noindent
3038 This is implemented for compatibility with DEC Ada 83 and is recognized,
3039 but otherwise ignored, by GNAT@.  All generic instantiations are inlined
3040 by default when using GNAT@.
3041
3042 @node Pragma Interface
3043 @unnumberedsec Pragma Interface
3044 @findex Interface
3045 @noindent
3046 Syntax:
3047
3048 @smallexample @c ada
3049 pragma Interface (
3050      [Convention    =>] convention_identifier,
3051      [Entity        =>] local_NAME
3052   [, [External_Name =>] static_string_expression]
3053   [, [Link_Name     =>] static_string_expression]);
3054 @end smallexample
3055
3056 @noindent
3057 This pragma is identical in syntax and semantics to
3058 the standard Ada pragma @code{Import}.  It is provided for compatibility
3059 with Ada 83.  The definition is upwards compatible both with pragma
3060 @code{Interface} as defined in the Ada 83 Reference Manual, and also
3061 with some extended implementations of this pragma in certain Ada 83
3062 implementations.  The only difference between pragma @code{Interface}
3063 and pragma @code{Import} is that there is special circuitry to allow
3064 both pragmas to appear for the same subprogram entity (normally it
3065 is illegal to have multiple @code{Import} pragmas. This is useful in
3066 maintaining Ada 83/Ada 95 compatibility and is compatible with other
3067 Ada 83 compilers.
3068
3069 @node Pragma Interface_Name
3070 @unnumberedsec Pragma Interface_Name
3071 @findex Interface_Name
3072 @noindent
3073 Syntax:
3074
3075 @smallexample @c ada
3076 pragma Interface_Name (
3077      [Entity        =>] LOCAL_NAME
3078   [, [External_Name =>] static_string_EXPRESSION]
3079   [, [Link_Name     =>] static_string_EXPRESSION]);
3080 @end smallexample
3081
3082 @noindent
3083 This pragma provides an alternative way of specifying the interface name
3084 for an interfaced subprogram, and is provided for compatibility with Ada
3085 83 compilers that use the pragma for this purpose.  You must provide at
3086 least one of @var{External_Name} or @var{Link_Name}.
3087
3088 @node Pragma Interrupt_Handler
3089 @unnumberedsec Pragma Interrupt_Handler
3090 @findex Interrupt_Handler
3091 @noindent
3092 Syntax:
3093
3094 @smallexample @c ada
3095 pragma Interrupt_Handler (procedure_LOCAL_NAME);
3096 @end smallexample
3097
3098 @noindent
3099 This program unit pragma is supported for parameterless protected procedures
3100 as described in Annex C of the Ada Reference Manual. On the AAMP target
3101 the pragma can also be specified for nonprotected parameterless procedures
3102 that are declared at the library level (which includes procedures
3103 declared at the top level of a library package). In the case of AAMP,
3104 when this pragma is applied to a nonprotected procedure, the instruction
3105 @code{IERET} is generated for returns from the procedure, enabling
3106 maskable interrupts, in place of the normal return instruction.
3107
3108 @node Pragma Interrupt_State
3109 @unnumberedsec Pragma Interrupt_State
3110 @findex Interrupt_State
3111 @noindent
3112 Syntax:
3113
3114 @smallexample @c ada
3115 pragma Interrupt_State
3116  ([Name  =>] value,
3117   [State =>] SYSTEM | RUNTIME | USER);
3118 @end smallexample
3119
3120 @noindent
3121 Normally certain interrupts are reserved to the implementation.  Any attempt
3122 to attach an interrupt causes Program_Error to be raised, as described in
3123 RM C.3.2(22).  A typical example is the @code{SIGINT} interrupt used in
3124 many systems for an @kbd{Ctrl-C} interrupt.  Normally this interrupt is
3125 reserved to the implementation, so that @kbd{Ctrl-C} can be used to
3126 interrupt execution.  Additionally, signals such as @code{SIGSEGV},
3127 @code{SIGABRT}, @code{SIGFPE} and @code{SIGILL} are often mapped to specific
3128 Ada exceptions, or used to implement run-time functions such as the
3129 @code{abort} statement and stack overflow checking.
3130
3131 Pragma @code{Interrupt_State} provides a general mechanism for overriding
3132 such uses of interrupts.  It subsumes the functionality of pragma
3133 @code{Unreserve_All_Interrupts}.  Pragma @code{Interrupt_State} is not
3134 available on Windows or VMS.  On all other platforms than VxWorks,
3135 it applies to signals; on VxWorks, it applies to vectored hardware interrupts
3136 and may be used to mark interrupts required by the board support package
3137 as reserved.
3138
3139 Interrupts can be in one of three states:
3140 @itemize @bullet
3141 @item System
3142
3143 The interrupt is reserved (no Ada handler can be installed), and the
3144 Ada run-time may not install a handler. As a result you are guaranteed
3145 standard system default action if this interrupt is raised.
3146
3147 @item Runtime
3148
3149 The interrupt is reserved (no Ada handler can be installed). The run time
3150 is allowed to install a handler for internal control purposes, but is
3151 not required to do so.
3152
3153 @item User
3154
3155 The interrupt is unreserved.  The user may install a handler to provide
3156 some other action.
3157 @end itemize
3158
3159 @noindent
3160 These states are the allowed values of the @code{State} parameter of the
3161 pragma.  The @code{Name} parameter is a value of the type
3162 @code{Ada.Interrupts.Interrupt_ID}.  Typically, it is a name declared in
3163 @code{Ada.Interrupts.Names}.
3164
3165 This is a configuration pragma, and the binder will check that there
3166 are no inconsistencies between different units in a partition in how a
3167 given interrupt is specified. It may appear anywhere a pragma is legal.
3168
3169 The effect is to move the interrupt to the specified state.
3170
3171 By declaring interrupts to be SYSTEM, you guarantee the standard system
3172 action, such as a core dump.
3173
3174 By declaring interrupts to be USER, you guarantee that you can install
3175 a handler.
3176
3177 Note that certain signals on many operating systems cannot be caught and
3178 handled by applications.  In such cases, the pragma is ignored.  See the
3179 operating system documentation, or the value of the array @code{Reserved}
3180 declared in the spec of package @code{System.OS_Interface}.
3181
3182 Overriding the default state of signals used by the Ada runtime may interfere
3183 with an application's runtime behavior in the cases of the synchronous signals,
3184 and in the case of the signal used to implement the @code{abort} statement.
3185
3186 @node Pragma Invariant
3187 @unnumberedsec Pragma Invariant
3188 @findex Invariant
3189 @noindent
3190 Syntax:
3191
3192 @smallexample @c ada
3193 pragma Invariant
3194   ([Entity =>]    private_type_LOCAL_NAME,
3195    [Check  =>]    EXPRESSION
3196    [,[Message =>] String_Expression]);
3197 @end smallexample
3198
3199 @noindent
3200 This pragma provides exactly the same capabilities as the Invariant aspect
3201 defined in AI05-0146-1, and in the Ada 2012 Reference Manual. The Invariant
3202 aspect is fully implemented in Ada 2012 mode, but since it requires the use
3203 of the aspect syntax, which is not available exception in 2012 mode, it is
3204 not possible to use the Invariant aspect in earlier versions of Ada. However
3205 the Invariant pragma may be used in any version of Ada.
3206
3207 The pragma must appear within the visible part of the package specification,
3208 after the type to which its Entity argument appears. As with the Invariant
3209 aspect, the Check expression is not analyzed until the end of the visible
3210 part of the package, so it may contain forward references. The Message
3211 argument, if present, provides the exception message used if the invariant
3212 is violated. If no Message parameter is provided, a default message that
3213 identifies the line on which the pragma appears is used.
3214
3215 It is permissible to have multiple Invariants for the same type entity, in
3216 which case they are and'ed together. It is permissible to use this pragma
3217 in Ada 2012 mode, but you cannot have both an invariant aspect and an
3218 invariant pragma for the same entity.
3219
3220 For further details on the use of this pragma, see the Ada 2012 documentation
3221 of the Invariant aspect.
3222
3223 @node Pragma Keep_Names
3224 @unnumberedsec Pragma Keep_Names
3225 @findex Keep_Names
3226 @noindent
3227 Syntax:
3228
3229 @smallexample @c ada
3230 pragma Keep_Names ([On =>] enumeration_first_subtype_LOCAL_NAME);
3231 @end smallexample
3232
3233 @noindent
3234 The @var{LOCAL_NAME} argument
3235 must refer to an enumeration first subtype
3236 in the current declarative part. The effect is to retain the enumeration
3237 literal names for use by @code{Image} and @code{Value} even if a global
3238 @code{Discard_Names} pragma applies. This is useful when you want to
3239 generally suppress enumeration literal names and for example you therefore
3240 use a @code{Discard_Names} pragma in the @file{gnat.adc} file, but you
3241 want to retain the names for specific enumeration types.
3242
3243 @node Pragma License
3244 @unnumberedsec Pragma License
3245 @findex License
3246 @cindex License checking
3247 @noindent
3248 Syntax:
3249
3250 @smallexample @c ada
3251 pragma License (Unrestricted | GPL | Modified_GPL | Restricted);
3252 @end smallexample
3253
3254 @noindent
3255 This pragma is provided to allow automated checking for appropriate license
3256 conditions with respect to the standard and modified GPL@.  A pragma
3257 @code{License}, which is a configuration pragma that typically appears at
3258 the start of a source file or in a separate @file{gnat.adc} file, specifies
3259 the licensing conditions of a unit as follows:
3260
3261 @itemize @bullet
3262 @item Unrestricted
3263 This is used for a unit that can be freely used with no license restrictions.
3264 Examples of such units are public domain units, and units from the Ada
3265 Reference Manual.
3266
3267 @item GPL
3268 This is used for a unit that is licensed under the unmodified GPL, and which
3269 therefore cannot be @code{with}'ed by a restricted unit.
3270
3271 @item Modified_GPL
3272 This is used for a unit licensed under the GNAT modified GPL that includes
3273 a special exception paragraph that specifically permits the inclusion of
3274 the unit in programs without requiring the entire program to be released
3275 under the GPL@.
3276
3277 @item Restricted
3278 This is used for a unit that is restricted in that it is not permitted to
3279 depend on units that are licensed under the GPL@.  Typical examples are
3280 proprietary code that is to be released under more restrictive license
3281 conditions.  Note that restricted units are permitted to @code{with} units
3282 which are licensed under the modified GPL (this is the whole point of the
3283 modified GPL).
3284
3285 @end itemize
3286
3287 @noindent
3288 Normally a unit with no @code{License} pragma is considered to have an
3289 unknown license, and no checking is done.  However, standard GNAT headers
3290 are recognized, and license information is derived from them as follows.
3291
3292 @itemize @bullet
3293
3294 A GNAT license header starts with a line containing 78 hyphens.  The following
3295 comment text is searched for the appearance of any of the following strings.
3296
3297 If the string ``GNU General Public License'' is found, then the unit is assumed
3298 to have GPL license, unless the string ``As a special exception'' follows, in
3299 which case the license is assumed to be modified GPL@.
3300
3301 If one of the strings
3302 ``This specification is adapted from the Ada Semantic Interface'' or
3303 ``This specification is derived from the Ada Reference Manual'' is found
3304 then the unit is assumed to be unrestricted.
3305 @end itemize
3306
3307 @noindent
3308 These default actions means that a program with a restricted license pragma
3309 will automatically get warnings if a GPL unit is inappropriately
3310 @code{with}'ed.  For example, the program:
3311
3312 @smallexample @c ada
3313 with Sem_Ch3;
3314 with GNAT.Sockets;
3315 procedure Secret_Stuff is
3316   @dots{}
3317 end Secret_Stuff
3318 @end smallexample
3319
3320 @noindent
3321 if compiled with pragma @code{License} (@code{Restricted}) in a
3322 @file{gnat.adc} file will generate the warning:
3323
3324 @smallexample
3325 1.  with Sem_Ch3;
3326         |
3327    >>> license of withed unit "Sem_Ch3" is incompatible
3328
3329 2.  with GNAT.Sockets;
3330 3.  procedure Secret_Stuff is
3331 @end smallexample
3332
3333 @noindent
3334 Here we get a warning on @code{Sem_Ch3} since it is part of the GNAT
3335 compiler and is licensed under the
3336 GPL, but no warning for @code{GNAT.Sockets} which is part of the GNAT
3337 run time, and is therefore licensed under the modified GPL@.
3338
3339 @node Pragma Link_With
3340 @unnumberedsec Pragma Link_With
3341 @findex Link_With
3342 @noindent
3343 Syntax:
3344
3345 @smallexample @c ada
3346 pragma Link_With (static_string_EXPRESSION @{,static_string_EXPRESSION@});
3347 @end smallexample
3348
3349 @noindent
3350 This pragma is provided for compatibility with certain Ada 83 compilers.
3351 It has exactly the same effect as pragma @code{Linker_Options} except
3352 that spaces occurring within one of the string expressions are treated
3353 as separators. For example, in the following case:
3354
3355 @smallexample @c ada
3356 pragma Link_With ("-labc -ldef");
3357 @end smallexample
3358
3359 @noindent
3360 results in passing the strings @code{-labc} and @code{-ldef} as two
3361 separate arguments to the linker. In addition pragma Link_With allows
3362 multiple arguments, with the same effect as successive pragmas.
3363
3364 @node Pragma Linker_Alias
3365 @unnumberedsec Pragma Linker_Alias
3366 @findex Linker_Alias
3367 @noindent
3368 Syntax:
3369
3370 @smallexample @c ada
3371 pragma Linker_Alias (
3372   [Entity =>] LOCAL_NAME,
3373   [Target =>] static_string_EXPRESSION);
3374 @end smallexample
3375
3376 @noindent
3377 @var{LOCAL_NAME} must refer to an object that is declared at the library
3378 level. This pragma establishes the given entity as a linker alias for the
3379 given target. It is equivalent to @code{__attribute__((alias))} in GNU C
3380 and causes @var{LOCAL_NAME} to be emitted as an alias for the symbol
3381 @var{static_string_EXPRESSION} in the object file, that is to say no space
3382 is reserved for @var{LOCAL_NAME} by the assembler and it will be resolved
3383 to the same address as @var{static_string_EXPRESSION} by the linker.
3384
3385 The actual linker name for the target must be used (e.g.@: the fully
3386 encoded name with qualification in Ada, or the mangled name in C++),
3387 or it must be declared using the C convention with @code{pragma Import}
3388 or @code{pragma Export}.
3389
3390 Not all target machines support this pragma. On some of them it is accepted
3391 only if @code{pragma Weak_External} has been applied to @var{LOCAL_NAME}.
3392
3393 @smallexample @c ada
3394 --  Example of the use of pragma Linker_Alias
3395
3396 package p is
3397   i : Integer := 1;
3398   pragma Export (C, i);
3399
3400   new_name_for_i : Integer;
3401   pragma Linker_Alias (new_name_for_i, "i");
3402 end p;
3403 @end smallexample
3404
3405 @node Pragma Linker_Constructor
3406 @unnumberedsec Pragma Linker_Constructor
3407 @findex Linker_Constructor
3408 @noindent
3409 Syntax:
3410
3411 @smallexample @c ada
3412 pragma Linker_Constructor (procedure_LOCAL_NAME);
3413 @end smallexample
3414
3415 @noindent
3416 @var{procedure_LOCAL_NAME} must refer to a parameterless procedure that
3417 is declared at the library level. A procedure to which this pragma is
3418 applied will be treated as an initialization routine by the linker.
3419 It is equivalent to @code{__attribute__((constructor))} in GNU C and
3420 causes @var{procedure_LOCAL_NAME} to be invoked before the entry point
3421 of the executable is called (or immediately after the shared library is
3422 loaded if the procedure is linked in a shared library), in particular
3423 before the Ada run-time environment is set up.
3424
3425 Because of these specific contexts, the set of operations such a procedure
3426 can perform is very limited and the type of objects it can manipulate is
3427 essentially restricted to the elementary types. In particular, it must only
3428 contain code to which pragma Restrictions (No_Elaboration_Code) applies.
3429
3430 This pragma is used by GNAT to implement auto-initialization of shared Stand
3431 Alone Libraries, which provides a related capability without the restrictions
3432 listed above. Where possible, the use of Stand Alone Libraries is preferable
3433 to the use of this pragma.
3434
3435 @node Pragma Linker_Destructor
3436 @unnumberedsec Pragma Linker_Destructor
3437 @findex Linker_Destructor
3438 @noindent
3439 Syntax:
3440
3441 @smallexample @c ada
3442 pragma Linker_Destructor (procedure_LOCAL_NAME);
3443 @end smallexample
3444
3445 @noindent
3446 @var{procedure_LOCAL_NAME} must refer to a parameterless procedure that
3447 is declared at the library level. A procedure to which this pragma is
3448 applied will be treated as a finalization routine by the linker.
3449 It is equivalent to @code{__attribute__((destructor))} in GNU C and
3450 causes @var{procedure_LOCAL_NAME} to be invoked after the entry point
3451 of the executable has exited (or immediately before the shared library
3452 is unloaded if the procedure is linked in a shared library), in particular
3453 after the Ada run-time environment is shut down.
3454
3455 See @code{pragma Linker_Constructor} for the set of restrictions that apply
3456 because of these specific contexts.
3457
3458 @node Pragma Linker_Section
3459 @unnumberedsec Pragma Linker_Section
3460 @findex Linker_Section
3461 @noindent
3462 Syntax:
3463
3464 @smallexample @c ada
3465 pragma Linker_Section (
3466   [Entity  =>] LOCAL_NAME,
3467   [Section =>] static_string_EXPRESSION);
3468 @end smallexample
3469
3470 @noindent
3471 @var{LOCAL_NAME} must refer to an object that is declared at the library
3472 level. This pragma specifies the name of the linker section for the given
3473 entity. It is equivalent to @code{__attribute__((section))} in GNU C and
3474 causes @var{LOCAL_NAME} to be placed in the @var{static_string_EXPRESSION}
3475 section of the executable (assuming the linker doesn't rename the section).
3476
3477 The compiler normally places library-level objects in standard sections
3478 depending on their type: procedures and functions generally go in the
3479 @code{.text} section, initialized variables in the @code{.data} section
3480 and uninitialized variables in the @code{.bss} section.
3481
3482 Other, special sections may exist on given target machines to map special
3483 hardware, for example I/O ports or flash memory. This pragma is a means to
3484 defer the final layout of the executable to the linker, thus fully working
3485 at the symbolic level with the compiler.
3486
3487 Some file formats do not support arbitrary sections so not all target
3488 machines support this pragma. The use of this pragma may cause a program
3489 execution to be erroneous if it is used to place an entity into an
3490 inappropriate section (e.g.@: a modified variable into the @code{.text}
3491 section). See also @code{pragma Persistent_BSS}.
3492
3493 @smallexample @c ada
3494 --  Example of the use of pragma Linker_Section
3495
3496 package IO_Card is
3497   Port_A : Integer;
3498   pragma Volatile (Port_A);
3499   pragma Linker_Section (Port_A, ".bss.port_a");
3500
3501   Port_B : Integer;
3502   pragma Volatile (Port_B);
3503   pragma Linker_Section (Port_B, ".bss.port_b");
3504 end IO_Card;
3505 @end smallexample
3506
3507 @node Pragma Long_Float
3508 @unnumberedsec Pragma Long_Float
3509 @cindex OpenVMS
3510 @findex Long_Float
3511 @noindent
3512 Syntax:
3513
3514 @smallexample @c ada
3515 pragma Long_Float (FLOAT_FORMAT);
3516
3517 FLOAT_FORMAT ::= D_Float | G_Float
3518 @end smallexample
3519
3520 @noindent
3521 This pragma is implemented only in the OpenVMS implementation of GNAT@.
3522 It allows control over the internal representation chosen for the predefined
3523 type @code{Long_Float} and for floating point type representations with
3524 @code{digits} specified in the range 7 through 15.
3525 For further details on this pragma, see the
3526 @cite{DEC Ada Language Reference Manual}, section 3.5.7b.  Note that to use
3527 this pragma, the standard runtime libraries must be recompiled.
3528
3529 @node Pragma Machine_Attribute
3530 @unnumberedsec Pragma Machine_Attribute
3531 @findex Machine_Attribute
3532 @noindent
3533 Syntax:
3534
3535 @smallexample @c ada
3536 pragma Machine_Attribute (
3537      [Entity         =>] LOCAL_NAME,
3538      [Attribute_Name =>] static_string_EXPRESSION
3539   [, [Info           =>] static_EXPRESSION] );
3540 @end smallexample
3541
3542 @noindent
3543 Machine-dependent attributes can be specified for types and/or
3544 declarations.  This pragma is semantically equivalent to
3545 @code{__attribute__((@var{attribute_name}))} (if @var{info} is not
3546 specified) or @code{__attribute__((@var{attribute_name}(@var{info})))}
3547 in GNU C, where @code{@var{attribute_name}} is recognized by the
3548 compiler middle-end or the @code{TARGET_ATTRIBUTE_TABLE} machine
3549 specific macro.  A string literal for the optional parameter @var{info}
3550 is transformed into an identifier, which may make this pragma unusable
3551 for some attributes.  @xref{Target Attributes,, Defining target-specific
3552 uses of @code{__attribute__}, gccint, GNU Compiler Collection (GCC)
3553 Internals}, further information.
3554
3555 @node Pragma Main
3556 @unnumberedsec Pragma Main
3557 @cindex OpenVMS
3558 @findex Main
3559 @noindent
3560 Syntax:
3561
3562 @smallexample @c ada
3563 pragma Main
3564  (MAIN_OPTION [, MAIN_OPTION]);
3565
3566 MAIN_OPTION ::=
3567   [Stack_Size              =>] static_integer_EXPRESSION
3568 | [Task_Stack_Size_Default =>] static_integer_EXPRESSION
3569 | [Time_Slicing_Enabled    =>] static_boolean_EXPRESSION
3570 @end smallexample
3571
3572 @noindent
3573 This pragma is provided for compatibility with OpenVMS VAX Systems.  It has
3574 no effect in GNAT, other than being syntax checked.
3575
3576 @node Pragma Main_Storage
3577 @unnumberedsec Pragma Main_Storage
3578 @cindex OpenVMS
3579 @findex Main_Storage
3580 @noindent
3581 Syntax:
3582
3583 @smallexample @c ada
3584 pragma Main_Storage
3585   (MAIN_STORAGE_OPTION [, MAIN_STORAGE_OPTION]);
3586
3587 MAIN_STORAGE_OPTION ::=
3588   [WORKING_STORAGE =>] static_SIMPLE_EXPRESSION
3589 | [TOP_GUARD       =>] static_SIMPLE_EXPRESSION
3590 @end smallexample
3591
3592 @noindent
3593 This pragma is provided for compatibility with OpenVMS VAX Systems.  It has
3594 no effect in GNAT, other than being syntax checked.  Note that the pragma
3595 also has no effect in DEC Ada 83 for OpenVMS Alpha Systems.
3596
3597 @node Pragma No_Body
3598 @unnumberedsec Pragma No_Body
3599 @findex No_Body
3600 @noindent
3601 Syntax:
3602
3603 @smallexample @c ada
3604 pragma No_Body;
3605 @end smallexample
3606
3607 @noindent
3608 There are a number of cases in which a package spec does not require a body,
3609 and in fact a body is not permitted. GNAT will not permit the spec to be
3610 compiled if there is a body around. The pragma No_Body allows you to provide
3611 a body file, even in a case where no body is allowed. The body file must
3612 contain only comments and a single No_Body pragma. This is recognized by
3613 the compiler as indicating that no body is logically present.
3614
3615 This is particularly useful during maintenance when a package is modified in
3616 such a way that a body needed before is no longer needed. The provision of a
3617 dummy body with a No_Body pragma ensures that there is no interference from
3618 earlier versions of the package body.
3619
3620 @node Pragma No_Return
3621 @unnumberedsec Pragma No_Return
3622 @findex No_Return
3623 @noindent
3624 Syntax:
3625
3626 @smallexample @c ada
3627 pragma No_Return (procedure_LOCAL_NAME @{, procedure_LOCAL_NAME@});
3628 @end smallexample
3629
3630 @noindent
3631 Each @var{procedure_LOCAL_NAME} argument must refer to one or more procedure
3632 declarations in the current declarative part.  A procedure to which this
3633 pragma is applied may not contain any explicit @code{return} statements.
3634 In addition, if the procedure contains any implicit returns from falling
3635 off the end of a statement sequence, then execution of that implicit
3636 return will cause Program_Error to be raised.
3637
3638 One use of this pragma is to identify procedures whose only purpose is to raise
3639 an exception. Another use of this pragma is to suppress incorrect warnings
3640 about missing returns in functions, where the last statement of a function
3641 statement sequence is a call to such a procedure.
3642
3643 Note that in Ada 2005 mode, this pragma is part of the language, and is
3644 identical in effect to the pragma as implemented in Ada 95 mode.
3645
3646 @node Pragma No_Strict_Aliasing
3647 @unnumberedsec Pragma No_Strict_Aliasing
3648 @findex No_Strict_Aliasing
3649 @noindent
3650 Syntax:
3651
3652 @smallexample @c ada
3653 pragma No_Strict_Aliasing [([Entity =>] type_LOCAL_NAME)];
3654 @end smallexample
3655
3656 @noindent
3657 @var{type_LOCAL_NAME} must refer to an access type
3658 declaration in the current declarative part.  The effect is to inhibit
3659 strict aliasing optimization for the given type.  The form with no
3660 arguments is a configuration pragma which applies to all access types
3661 declared in units to which the pragma applies. For a detailed
3662 description of the strict aliasing optimization, and the situations
3663 in which it must be suppressed, see @ref{Optimization and Strict
3664 Aliasing,,, gnat_ugn, @value{EDITION} User's Guide}.
3665
3666 This pragma currently has no effects on access to unconstrained array types.
3667
3668 @node Pragma Normalize_Scalars
3669 @unnumberedsec Pragma Normalize_Scalars
3670 @findex Normalize_Scalars
3671 @noindent
3672 Syntax:
3673
3674 @smallexample @c ada
3675 pragma Normalize_Scalars;
3676 @end smallexample
3677
3678 @noindent
3679 This is a language defined pragma which is fully implemented in GNAT@.  The
3680 effect is to cause all scalar objects that are not otherwise initialized
3681 to be initialized.  The initial values are implementation dependent and
3682 are as follows:
3683
3684 @table @code
3685 @item Standard.Character
3686 @noindent
3687 Objects whose root type is Standard.Character are initialized to
3688 Character'Last unless the subtype range excludes NUL (in which case
3689 NUL is used). This choice will always generate an invalid value if
3690 one exists.
3691
3692 @item Standard.Wide_Character
3693 @noindent
3694 Objects whose root type is Standard.Wide_Character are initialized to
3695 Wide_Character'Last unless the subtype range excludes NUL (in which case
3696 NUL is used). This choice will always generate an invalid value if
3697 one exists.
3698
3699 @item Standard.Wide_Wide_Character
3700 @noindent
3701 Objects whose root type is Standard.Wide_Wide_Character are initialized to
3702 the invalid value 16#FFFF_FFFF# unless the subtype range excludes NUL (in
3703 which case NUL is used). This choice will always generate an invalid value if
3704 one exists.
3705
3706 @item Integer types
3707 @noindent
3708 Objects of an integer type are treated differently depending on whether
3709 negative values are present in the subtype. If no negative values are
3710 present, then all one bits is used as the initial value except in the
3711 special case where zero is excluded from the subtype, in which case
3712 all zero bits are used. This choice will always generate an invalid
3713 value if one exists.
3714
3715 For subtypes with negative values present, the largest negative number
3716 is used, except in the unusual case where this largest negative number
3717 is in the subtype, and the largest positive number is not, in which case
3718 the largest positive value is used. This choice will always generate
3719 an invalid value if one exists.
3720
3721 @item Floating-Point Types
3722 Objects of all floating-point types are initialized to all 1-bits. For
3723 standard IEEE format, this corresponds to a NaN (not a number) which is
3724 indeed an invalid value.
3725
3726 @item Fixed-Point Types
3727 Objects of all fixed-point types are treated as described above for integers,
3728 with the rules applying to the underlying integer value used to represent
3729 the fixed-point value.
3730
3731 @item Modular types
3732 Objects of a modular type are initialized to all one bits, except in
3733 the special case where zero is excluded from the subtype, in which
3734 case all zero bits are used. This choice will always generate an
3735 invalid value if one exists.
3736
3737 @item Enumeration types
3738 Objects of an enumeration type are initialized to all one-bits, i.e.@: to
3739 the value @code{2 ** typ'Size - 1} unless the subtype excludes the literal
3740 whose Pos value is zero, in which case a code of zero is used. This choice
3741 will always generate an invalid value if one exists.
3742
3743 @end table
3744
3745 @node Pragma Obsolescent
3746 @unnumberedsec Pragma Obsolescent
3747 @findex Obsolescent
3748 @noindent
3749 Syntax:
3750
3751 @smallexample @c ada
3752 pragma Obsolescent;
3753
3754 pragma Obsolescent (
3755   [Message =>] static_string_EXPRESSION
3756 [,[Version =>] Ada_05]]);
3757
3758 pragma Obsolescent (
3759   [Entity  =>] NAME
3760 [,[Message =>] static_string_EXPRESSION
3761 [,[Version =>] Ada_05]] );
3762 @end smallexample
3763
3764 @noindent
3765 This pragma can occur immediately following a declaration of an entity,
3766 including the case of a record component. If no Entity argument is present,
3767 then this declaration is the one to which the pragma applies. If an Entity
3768 parameter is present, it must either match the name of the entity in this
3769 declaration, or alternatively, the pragma can immediately follow an enumeration
3770 type declaration, where the Entity argument names one of the enumeration
3771 literals.
3772
3773 This pragma is used to indicate that the named entity
3774 is considered obsolescent and should not be used. Typically this is
3775 used when an API must be modified by eventually removing or modifying
3776 existing subprograms or other entities. The pragma can be used at an
3777 intermediate stage when the entity is still present, but will be
3778 removed later.
3779
3780 The effect of this pragma is to output a warning message on a reference to
3781 an entity thus marked that the subprogram is obsolescent if the appropriate
3782 warning option in the compiler is activated. If the Message parameter is
3783 present, then a second warning message is given containing this text. In
3784 addition, a reference to the entity is considered to be a violation of pragma
3785 Restrictions (No_Obsolescent_Features).
3786
3787 This pragma can also be used as a program unit pragma for a package,
3788 in which case the entity name is the name of the package, and the
3789 pragma indicates that the entire package is considered
3790 obsolescent. In this case a client @code{with}'ing such a package
3791 violates the restriction, and the @code{with} statement is
3792 flagged with warnings if the warning option is set.
3793
3794 If the Version parameter is present (which must be exactly
3795 the identifier Ada_05, no other argument is allowed), then the
3796 indication of obsolescence applies only when compiling in Ada 2005
3797 mode. This is primarily intended for dealing with the situations
3798 in the predefined library where subprograms or packages
3799 have become defined as obsolescent in Ada 2005
3800 (e.g.@: in Ada.Characters.Handling), but may be used anywhere.
3801
3802 The following examples show typical uses of this pragma:
3803
3804 @smallexample @c ada
3805 package p is
3806    pragma Obsolescent (p, Message => "use pp instead of p");
3807 end p;
3808
3809 package q is
3810    procedure q2;
3811    pragma Obsolescent ("use q2new instead");
3812
3813    type R is new integer;
3814    pragma Obsolescent
3815      (Entity  => R,
3816       Message => "use RR in Ada 2005",
3817       Version => Ada_05);
3818
3819    type M is record
3820       F1 : Integer;
3821       F2 : Integer;
3822       pragma Obsolescent;
3823       F3 : Integer;
3824    end record;
3825
3826    type E is (a, bc, 'd', quack);
3827    pragma Obsolescent (Entity => bc)
3828    pragma Obsolescent (Entity => 'd')
3829
3830    function "+"
3831      (a, b : character) return character;
3832    pragma Obsolescent (Entity => "+");
3833 end;
3834 @end smallexample
3835
3836 @noindent
3837 Note that, as for all pragmas, if you use a pragma argument identifier,
3838 then all subsequent parameters must also use a pragma argument identifier.
3839 So if you specify "Entity =>" for the Entity argument, and a Message
3840 argument is present, it must be preceded by "Message =>".
3841
3842 @node Pragma Optimize_Alignment
3843 @unnumberedsec Pragma Optimize_Alignment
3844 @findex Optimize_Alignment
3845 @cindex Alignment, default settings
3846 @noindent
3847 Syntax:
3848
3849 @smallexample @c ada
3850 pragma Optimize_Alignment (TIME | SPACE | OFF);
3851 @end smallexample
3852
3853 @noindent
3854 This is a configuration pragma which affects the choice of default alignments
3855 for types where no alignment is explicitly specified. There is a time/space
3856 trade-off in the selection of these values. Large alignments result in more
3857 efficient code, at the expense of larger data space, since sizes have to be
3858 increased to match these alignments. Smaller alignments save space, but the
3859 access code is slower. The normal choice of default alignments (which is what
3860 you get if you do not use this pragma, or if you use an argument of OFF),
3861 tries to balance these two requirements.
3862
3863 Specifying SPACE causes smaller default alignments to be chosen in two cases.
3864 First any packed record is given an alignment of 1. Second, if a size is given
3865 for the type, then the alignment is chosen to avoid increasing this size. For
3866 example, consider:
3867
3868 @smallexample @c ada
3869    type R is record
3870       X : Integer;
3871       Y : Character;
3872    end record;
3873
3874    for R'Size use 5*8;
3875 @end smallexample
3876
3877 @noindent
3878 In the default mode, this type gets an alignment of 4, so that access to the
3879 Integer field X are efficient. But this means that objects of the type end up
3880 with a size of 8 bytes. This is a valid choice, since sizes of objects are
3881 allowed to be bigger than the size of the type, but it can waste space if for
3882 example fields of type R appear in an enclosing record. If the above type is
3883 compiled in @code{Optimize_Alignment (Space)} mode, the alignment is set to 1.
3884
3885 Specifying TIME causes larger default alignments to be chosen in the case of
3886 small types with sizes that are not a power of 2. For example, consider:
3887
3888 @smallexample @c ada
3889    type R is record
3890       A : Character;
3891       B : Character;
3892       C : Boolean;
3893    end record;
3894
3895    pragma Pack (R);
3896    for R'Size use 17;
3897 @end smallexample
3898
3899 @noindent
3900 The default alignment for this record is normally 1, but if this type is
3901 compiled in @code{Optimize_Alignment (Time)} mode, then the alignment is set
3902 to 4, which wastes space for objects of the type, since they are now 4 bytes
3903 long, but results in more efficient access when the whole record is referenced.
3904
3905 As noted above, this is a configuration pragma, and there is a requirement
3906 that all units in a partition be compiled with a consistent setting of the
3907 optimization setting. This would normally be achieved by use of a configuration
3908 pragma file containing the appropriate setting. The exception to this rule is
3909 that units with an explicit configuration pragma in the same file as the source
3910 unit are excluded from the consistency check, as are all predefined units. The
3911 latter are compiled by default in pragma Optimize_Alignment (Off) mode if no
3912 pragma appears at the start of the file.
3913
3914 @node Pragma Ordered
3915 @unnumberedsec Pragma Ordered
3916 @findex Ordered
3917 @findex pragma @code{Ordered}
3918 @noindent
3919 Syntax:
3920
3921 @smallexample @c ada
3922 pragma Ordered (enumeration_first_subtype_LOCAL_NAME);
3923 @end smallexample
3924
3925 @noindent
3926 Most enumeration types are from a conceptual point of view unordered.
3927 For example, consider:
3928
3929 @smallexample @c ada
3930 type Color is (Red, Blue, Green, Yellow);
3931 @end smallexample
3932
3933 @noindent
3934 By Ada semantics @code{Blue > Red} and @code{Green > Blue},
3935 but really these relations make no sense; the enumeration type merely
3936 specifies a set of possible colors, and the order is unimportant.
3937
3938 For unordered enumeration types, it is generally a good idea if
3939 clients avoid comparisons (other than equality or inequality) and
3940 explicit ranges. (A @emph{client} is a unit where the type is referenced,
3941 other than the unit where the type is declared, its body, and its subunits.)
3942 For example, if code buried in some client says:
3943
3944 @smallexample @c ada
3945 if Current_Color < Yellow then ...
3946 if Current_Color in Blue .. Green then ...
3947 @end smallexample
3948
3949 @noindent
3950 then the client code is relying on the order, which is undesirable.
3951 It makes the code hard to read and creates maintenance difficulties if
3952 entries have to be added to the enumeration type. Instead,
3953 the code in the client should list the possibilities, or an
3954 appropriate subtype should be declared in the unit that declares
3955 the original enumeration type. E.g., the following subtype could
3956 be declared along with the type @code{Color}:
3957
3958 @smallexample @c ada
3959 subtype RBG is Color range Red .. Green;
3960 @end smallexample
3961
3962 @noindent
3963 and then the client could write:
3964
3965 @smallexample @c ada
3966 if Current_Color in RBG then ...
3967 if Current_Color = Blue or Current_Color = Green then ...
3968 @end smallexample
3969
3970 @noindent
3971 However, some enumeration types are legitimately ordered from a conceptual
3972 point of view. For example, if you declare:
3973
3974 @smallexample @c ada
3975 type Day is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
3976 @end smallexample
3977
3978 @noindent
3979 then the ordering imposed by the language is reasonable, and
3980 clients can depend on it, writing for example:
3981
3982 @smallexample @c ada
3983 if D in Mon .. Fri then ...
3984 if D < Wed then ...
3985 @end smallexample
3986
3987 @noindent
3988 The pragma @option{Ordered} is provided to mark enumeration types that
3989 are conceptually ordered, alerting the reader that clients may depend
3990 on the ordering. GNAT provides a pragma to mark enumerations as ordered
3991 rather than one to mark them as unordered, since in our experience,
3992 the great majority of enumeration types are conceptually unordered.
3993
3994 The types @code{Boolean}, @code{Character}, @code{Wide_Character},
3995 and @code{Wide_Wide_Character}
3996 are considered to be ordered types, so each is declared with a
3997 pragma @code{Ordered} in package @code{Standard}.
3998
3999 Normally pragma @code{Ordered} serves only as documentation and a guide for
4000 coding standards, but GNAT provides a warning switch @option{-gnatw.u} that
4001 requests warnings for inappropriate uses (comparisons and explicit
4002 subranges) for unordered types. If this switch is used, then any
4003 enumeration type not marked with pragma @code{Ordered} will be considered
4004 as unordered, and will generate warnings for inappropriate uses.
4005
4006 For additional information please refer to the description of the
4007 @option{-gnatw.u} switch in the @value{EDITION} User's Guide.
4008
4009 @node Pragma Passive
4010 @unnumberedsec Pragma Passive
4011 @findex Passive
4012 @noindent
4013 Syntax:
4014
4015 @smallexample @c ada
4016 pragma Passive [(Semaphore | No)];
4017 @end smallexample
4018
4019 @noindent
4020 Syntax checked, but otherwise ignored by GNAT@.  This is recognized for
4021 compatibility with DEC Ada 83 implementations, where it is used within a
4022 task definition to request that a task be made passive.  If the argument
4023 @code{Semaphore} is present, or the argument is omitted, then DEC Ada 83
4024 treats the pragma as an assertion that the containing task is passive
4025 and that optimization of context switch with this task is permitted and
4026 desired.  If the argument @code{No} is present, the task must not be
4027 optimized.  GNAT does not attempt to optimize any tasks in this manner
4028 (since protected objects are available in place of passive tasks).
4029
4030 @node Pragma Persistent_BSS
4031 @unnumberedsec Pragma Persistent_BSS
4032 @findex Persistent_BSS
4033 @noindent
4034 Syntax:
4035
4036 @smallexample @c ada
4037 pragma Persistent_BSS [(LOCAL_NAME)]
4038 @end smallexample
4039
4040 @noindent
4041 This pragma allows selected objects to be placed in the @code{.persistent_bss}
4042 section. On some targets the linker and loader provide for special
4043 treatment of this section, allowing a program to be reloaded without
4044 affecting the contents of this data (hence the name persistent).
4045
4046 There are two forms of usage. If an argument is given, it must be the
4047 local name of a library level object, with no explicit initialization
4048 and whose type is potentially persistent. If no argument is given, then
4049 the pragma is a configuration pragma, and applies to all library level
4050 objects with no explicit initialization of potentially persistent types.
4051
4052 A potentially persistent type is a scalar type, or a non-tagged,
4053 non-discriminated record, all of whose components have no explicit
4054 initialization and are themselves of a potentially persistent type,
4055 or an array, all of whose constraints are static, and whose component
4056 type is potentially persistent.
4057
4058 If this pragma is used on a target where this feature is not supported,
4059 then the pragma will be ignored. See also @code{pragma Linker_Section}.
4060
4061 @node Pragma Polling
4062 @unnumberedsec Pragma Polling
4063 @findex Polling
4064 @noindent
4065 Syntax:
4066
4067 @smallexample @c ada
4068 pragma Polling (ON | OFF);
4069 @end smallexample
4070
4071 @noindent
4072 This pragma controls the generation of polling code.  This is normally off.
4073 If @code{pragma Polling (ON)} is used then periodic calls are generated to
4074 the routine @code{Ada.Exceptions.Poll}.  This routine is a separate unit in the
4075 runtime library, and can be found in file @file{a-excpol.adb}.
4076
4077 Pragma @code{Polling} can appear as a configuration pragma (for example it
4078 can be placed in the @file{gnat.adc} file) to enable polling globally, or it
4079 can be used in the statement or declaration sequence to control polling
4080 more locally.
4081
4082 A call to the polling routine is generated at the start of every loop and
4083 at the start of every subprogram call.  This guarantees that the @code{Poll}
4084 routine is called frequently, and places an upper bound (determined by
4085 the complexity of the code) on the period between two @code{Poll} calls.
4086
4087 The primary purpose of the polling interface is to enable asynchronous
4088 aborts on targets that cannot otherwise support it (for example Windows
4089 NT), but it may be used for any other purpose requiring periodic polling.
4090 The standard version is null, and can be replaced by a user program.  This
4091 will require re-compilation of the @code{Ada.Exceptions} package that can
4092 be found in files @file{a-except.ads} and @file{a-except.adb}.
4093
4094 A standard alternative unit (in file @file{4wexcpol.adb} in the standard GNAT
4095 distribution) is used to enable the asynchronous abort capability on
4096 targets that do not normally support the capability.  The version of
4097 @code{Poll} in this file makes a call to the appropriate runtime routine
4098 to test for an abort condition.
4099
4100 Note that polling can also be enabled by use of the @option{-gnatP} switch.
4101 @xref{Switches for gcc,,, gnat_ugn, @value{EDITION} User's Guide}, for
4102 details.
4103
4104 @node Pragma Postcondition
4105 @unnumberedsec Pragma Postcondition
4106 @cindex Postconditions
4107 @cindex Checks, postconditions
4108 @findex Postconditions
4109 @noindent
4110 Syntax:
4111
4112 @smallexample @c ada
4113 pragma Postcondition (
4114    [Check   =>] Boolean_Expression
4115  [,[Message =>] String_Expression]);
4116 @end smallexample
4117
4118 @noindent
4119 The @code{Postcondition} pragma allows specification of automatic
4120 postcondition checks for subprograms. These checks are similar to
4121 assertions, but are automatically inserted just prior to the return
4122 statements of the subprogram with which they are associated (including
4123 implicit returns at the end of procedure bodies and associated
4124 exception handlers).
4125
4126 In addition, the boolean expression which is the condition which
4127 must be true may contain references to function'Result in the case
4128 of a function to refer to the returned value.
4129
4130 @code{Postcondition} pragmas may appear either immediately following the
4131 (separate) declaration of a subprogram, or at the start of the
4132 declarations of a subprogram body. Only other pragmas may intervene
4133 (that is appear between the subprogram declaration and its
4134 postconditions, or appear before the postcondition in the
4135 declaration sequence in a subprogram body). In the case of a
4136 postcondition appearing after a subprogram declaration, the
4137 formal arguments of the subprogram are visible, and can be
4138 referenced in the postcondition expressions.
4139
4140 The postconditions are collected and automatically tested just
4141 before any return (implicit or explicit) in the subprogram body.
4142 A postcondition is only recognized if postconditions are active
4143 at the time the pragma is encountered. The compiler switch @option{gnata}
4144 turns on all postconditions by default, and pragma @code{Check_Policy}
4145 with an identifier of @code{Postcondition} can also be used to
4146 control whether postconditions are active.
4147
4148 The general approach is that postconditions are placed in the spec
4149 if they represent functional aspects which make sense to the client.
4150 For example we might have:
4151
4152 @smallexample @c ada
4153    function Direction return Integer;
4154    pragma Postcondition
4155     (Direction'Result = +1
4156        or else
4157      Direction'Result = -1);
4158 @end smallexample
4159
4160 @noindent
4161 which serves to document that the result must be +1 or -1, and
4162 will test that this is the case at run time if postcondition
4163 checking is active.
4164
4165 Postconditions within the subprogram body can be used to
4166 check that some internal aspect of the implementation,
4167 not visible to the client, is operating as expected.
4168 For instance if a square root routine keeps an internal
4169 counter of the number of times it is called, then we
4170 might have the following postcondition:
4171
4172 @smallexample @c ada
4173    Sqrt_Calls : Natural := 0;
4174
4175    function Sqrt (Arg : Float) return Float is
4176      pragma Postcondition
4177        (Sqrt_Calls = Sqrt_Calls'Old + 1);
4178      ...
4179    end Sqrt
4180 @end smallexample
4181
4182 @noindent
4183 As this example, shows, the use of the @code{Old} attribute
4184 is often useful in postconditions to refer to the state on
4185 entry to the subprogram.
4186
4187 Note that postconditions are only checked on normal returns
4188 from the subprogram. If an abnormal return results from
4189 raising an exception, then the postconditions are not checked.
4190
4191 If a postcondition fails, then the exception
4192 @code{System.Assertions.Assert_Failure} is raised. If
4193 a message argument was supplied, then the given string
4194 will be used as the exception message. If no message
4195 argument was supplied, then the default message has
4196 the form "Postcondition failed at file:line". The
4197 exception is raised in the context of the subprogram
4198 body, so it is possible to catch postcondition failures
4199 within the subprogram body itself.
4200
4201 Within a package spec, normal visibility rules
4202 in Ada would prevent forward references within a
4203 postcondition pragma to functions defined later in
4204 the same package. This would introduce undesirable
4205 ordering constraints. To avoid this problem, all
4206 postcondition pragmas are analyzed at the end of
4207 the package spec, allowing forward references.
4208
4209 The following example shows that this even allows
4210 mutually recursive postconditions as in:
4211
4212 @smallexample @c ada
4213 package Parity_Functions is
4214    function Odd  (X : Natural) return Boolean;
4215    pragma Postcondition
4216      (Odd'Result =
4217         (x = 1
4218           or else
4219         (x /= 0 and then Even (X - 1))));
4220
4221    function Even (X : Natural) return Boolean;
4222    pragma Postcondition
4223      (Even'Result =
4224         (x = 0
4225           or else
4226         (x /= 1 and then Odd (X - 1))));
4227
4228 end Parity_Functions;
4229 @end smallexample
4230
4231 @noindent
4232 There are no restrictions on the complexity or form of
4233 conditions used within @code{Postcondition} pragmas.
4234 The following example shows that it is even possible
4235 to verify performance behavior.
4236
4237 @smallexample @c ada
4238 package Sort is
4239
4240    Performance : constant Float;
4241    --  Performance constant set by implementation
4242    --  to match target architecture behavior.
4243
4244    procedure Treesort (Arg : String);
4245    --  Sorts characters of argument using N*logN sort
4246    pragma Postcondition
4247      (Float (Clock - Clock'Old) <=
4248         Float (Arg'Length) *
4249         log (Float (Arg'Length)) *
4250         Performance);
4251 end Sort;
4252 @end smallexample
4253
4254 @noindent
4255 Note: postcondition pragmas associated with subprograms that are
4256 marked as Inline_Always, or those marked as Inline with front-end
4257 inlining (-gnatN option set) are accepted and legality-checked
4258 by the compiler, but are ignored at run-time even if postcondition
4259 checking is enabled.
4260
4261 @node Pragma Precondition
4262 @unnumberedsec Pragma Precondition
4263 @cindex Preconditions
4264 @cindex Checks, preconditions
4265 @findex Preconditions
4266 @noindent
4267 Syntax:
4268
4269 @smallexample @c ada
4270 pragma Precondition (
4271    [Check   =>] Boolean_Expression
4272  [,[Message =>] String_Expression]);
4273 @end smallexample
4274
4275 @noindent
4276 The @code{Precondition} pragma is similar to @code{Postcondition}
4277 except that the corresponding checks take place immediately upon
4278 entry to the subprogram, and if a precondition fails, the exception
4279 is raised in the context of the caller, and the attribute 'Result
4280 cannot be used within the precondition expression.
4281
4282 Otherwise, the placement and visibility rules are identical to those
4283 described for postconditions. The following is an example of use
4284 within a package spec:
4285
4286 @smallexample @c ada
4287 package Math_Functions is
4288    ...
4289    function Sqrt (Arg : Float) return Float;
4290    pragma Precondition (Arg >= 0.0)
4291    ...
4292 end Math_Functions;
4293 @end smallexample
4294
4295 @noindent
4296 @code{Precondition} pragmas may appear either immediately following the
4297 (separate) declaration of a subprogram, or at the start of the
4298 declarations of a subprogram body. Only other pragmas may intervene
4299 (that is appear between the subprogram declaration and its
4300 postconditions, or appear before the postcondition in the
4301 declaration sequence in a subprogram body).
4302
4303 Note: postcondition pragmas associated with subprograms that are
4304 marked as Inline_Always, or those marked as Inline with front-end
4305 inlining (-gnatN option set) are accepted and legality-checked
4306 by the compiler, but are ignored at run-time even if postcondition
4307 checking is enabled.
4308
4309 @node Pragma Profile (Ravenscar)
4310 @unnumberedsec Pragma Profile (Ravenscar)
4311 @findex Ravenscar
4312 @noindent
4313 Syntax:
4314
4315 @smallexample @c ada
4316 pragma Profile (Ravenscar);
4317 @end smallexample
4318
4319 @noindent
4320 A configuration pragma that establishes the following set of configuration
4321 pragmas:
4322
4323 @table @code
4324 @item Task_Dispatching_Policy (FIFO_Within_Priorities)
4325 [RM D.2.2] Tasks are dispatched following a preemptive
4326 priority-ordered scheduling policy.
4327
4328 @item Locking_Policy (Ceiling_Locking)
4329 [RM D.3] While tasks and interrupts execute a protected action, they inherit
4330 the ceiling priority of the corresponding protected object.
4331 @c
4332 @c @item Detect_Blocking
4333 @c This pragma forces the detection of potentially blocking operations within a
4334 @c protected operation, and to raise Program_Error if that happens.
4335 @end table
4336 @noindent
4337
4338 plus the following set of restrictions:
4339
4340 @table @code
4341 @item Max_Entry_Queue_Length => 1
4342 No task can be queued on a protected entry.
4343 @item Max_Protected_Entries => 1
4344 @item Max_Task_Entries => 0
4345 No rendezvous statements are allowed.
4346 @item No_Abort_Statements
4347 @item No_Dynamic_Attachment
4348 @item No_Dynamic_Priorities
4349 @item No_Implicit_Heap_Allocations
4350 @item No_Local_Protected_Objects
4351 @item No_Local_Timing_Events
4352 @item No_Protected_Type_Allocators
4353 @item No_Relative_Delay
4354 @item No_Requeue_Statements
4355 @item No_Select_Statements
4356 @item No_Specific_Termination_Handlers
4357 @item No_Task_Allocators
4358 @item No_Task_Hierarchy
4359 @item No_Task_Termination
4360 @item Simple_Barriers
4361 @end table
4362 @noindent
4363
4364 The Ravenscar profile also includes the following restrictions that specify
4365 that there are no semantic dependences on the corresponding predefined
4366 packages:
4367
4368 @table @code
4369 @item No_Dependence => Ada.Asynchronous_Task_Control
4370 @item No_Dependence => Ada.Calendar
4371 @item No_Dependence => Ada.Execution_Time.Group_Budget
4372 @item No_Dependence => Ada.Execution_Time.Timers
4373 @item No_Dependence => Ada.Task_Attributes
4374 @item No_Dependence => System.Multiprocessors.Dispatching_Domains
4375 @end table
4376
4377 @noindent
4378
4379 This set of configuration pragmas and restrictions correspond to the
4380 definition of the ``Ravenscar Profile'' for limited tasking, devised and
4381 published by the @cite{International Real-Time Ada Workshop}, 1997,
4382 and whose most recent description is available at
4383 @url{http://www-users.cs.york.ac.uk/~burns/ravenscar.ps}.
4384
4385 The original definition of the profile was revised at subsequent IRTAW
4386 meetings. It has been included in the ISO
4387 @cite{Guide for the Use of the Ada Programming Language in High
4388 Integrity Systems}, and has been approved by ISO/IEC/SC22/WG9 for inclusion in
4389 the next revision of the standard. The formal definition given by
4390 the Ada Rapporteur Group (ARG) can be found in two Ada Issues (AI-249 and
4391 AI-305) available at
4392 @url{http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00249.txt} and
4393 @url{http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00305.txt}.
4394
4395 The above set is a superset of the restrictions provided by pragma
4396 @code{Profile (Restricted)}, it includes six additional restrictions
4397 (@code{Simple_Barriers}, @code{No_Select_Statements},
4398 @code{No_Calendar}, @code{No_Implicit_Heap_Allocations},
4399 @code{No_Relative_Delay} and @code{No_Task_Termination}).  This means
4400 that pragma @code{Profile (Ravenscar)}, like the pragma
4401 @code{Profile (Restricted)},
4402 automatically causes the use of a simplified,
4403 more efficient version of the tasking run-time system.
4404
4405 @node Pragma Profile (Restricted)
4406 @unnumberedsec Pragma Profile (Restricted)
4407 @findex Restricted Run Time
4408 @noindent
4409 Syntax:
4410
4411 @smallexample @c ada
4412 pragma Profile (Restricted);
4413 @end smallexample
4414
4415 @noindent
4416 A configuration pragma that establishes the following set of restrictions:
4417
4418 @itemize @bullet
4419 @item No_Abort_Statements
4420 @item No_Entry_Queue
4421 @item No_Task_Hierarchy
4422 @item No_Task_Allocators
4423 @item No_Dynamic_Priorities
4424 @item No_Terminate_Alternatives
4425 @item No_Dynamic_Attachment
4426 @item No_Protected_Type_Allocators
4427 @item No_Local_Protected_Objects
4428 @item No_Requeue_Statements
4429 @item No_Task_Attributes_Package
4430 @item Max_Asynchronous_Select_Nesting =  0
4431 @item Max_Task_Entries =  0
4432 @item Max_Protected_Entries = 1
4433 @item Max_Select_Alternatives = 0
4434 @end itemize
4435
4436 @noindent
4437 This set of restrictions causes the automatic selection of a simplified
4438 version of the run time that provides improved performance for the
4439 limited set of tasking functionality permitted by this set of restrictions.
4440
4441 @node Pragma Psect_Object
4442 @unnumberedsec Pragma Psect_Object
4443 @findex Psect_Object
4444 @noindent
4445 Syntax:
4446
4447 @smallexample @c ada
4448 pragma Psect_Object (
4449      [Internal =>] LOCAL_NAME,
4450   [, [External =>] EXTERNAL_SYMBOL]
4451   [, [Size     =>] EXTERNAL_SYMBOL]);
4452
4453 EXTERNAL_SYMBOL ::=
4454   IDENTIFIER
4455 | static_string_EXPRESSION
4456 @end smallexample
4457
4458 @noindent
4459 This pragma is identical in effect to pragma @code{Common_Object}.
4460
4461 @node Pragma Pure_Function
4462 @unnumberedsec Pragma Pure_Function
4463 @findex Pure_Function
4464 @noindent
4465 Syntax:
4466
4467 @smallexample @c ada
4468 pragma Pure_Function ([Entity =>] function_LOCAL_NAME);
4469 @end smallexample
4470
4471 @noindent
4472 This pragma appears in the same declarative part as a function
4473 declaration (or a set of function declarations if more than one
4474 overloaded declaration exists, in which case the pragma applies
4475 to all entities).  It specifies that the function @code{Entity} is
4476 to be considered pure for the purposes of code generation.  This means
4477 that the compiler can assume that there are no side effects, and
4478 in particular that two calls with identical arguments produce the
4479 same result.  It also means that the function can be used in an
4480 address clause.
4481
4482 Note that, quite deliberately, there are no static checks to try
4483 to ensure that this promise is met, so @code{Pure_Function} can be used
4484 with functions that are conceptually pure, even if they do modify
4485 global variables.  For example, a square root function that is
4486 instrumented to count the number of times it is called is still
4487 conceptually pure, and can still be optimized, even though it
4488 modifies a global variable (the count).  Memo functions are another
4489 example (where a table of previous calls is kept and consulted to
4490 avoid re-computation).
4491
4492 Note also that the normal rules excluding optimization of subprograms
4493 in pure units (when parameter types are descended from System.Address,
4494 or when the full view of a parameter type is limited), do not apply
4495 for the Pure_Function case. If you explicitly specify Pure_Function,
4496 the compiler may optimize away calls with identical arguments, and
4497 if that results in unexpected behavior, the proper action is not to
4498 use the pragma for subprograms that are not (conceptually) pure.
4499
4500 @findex Pure
4501 Note: Most functions in a @code{Pure} package are automatically pure, and
4502 there is no need to use pragma @code{Pure_Function} for such functions.  One
4503 exception is any function that has at least one formal of type
4504 @code{System.Address} or a type derived from it.  Such functions are not
4505 considered pure by default, since the compiler assumes that the
4506 @code{Address} parameter may be functioning as a pointer and that the
4507 referenced data may change even if the address value does not.
4508 Similarly, imported functions are not considered to be pure by default,
4509 since there is no way of checking that they are in fact pure.  The use
4510 of pragma @code{Pure_Function} for such a function will override these default
4511 assumption, and cause the compiler to treat a designated subprogram as pure
4512 in these cases.
4513
4514 Note: If pragma @code{Pure_Function} is applied to a renamed function, it
4515 applies to the underlying renamed function.  This can be used to
4516 disambiguate cases of overloading where some but not all functions
4517 in a set of overloaded functions are to be designated as pure.
4518
4519 If pragma @code{Pure_Function} is applied to a library level function, the
4520 function is also considered pure from an optimization point of view, but the
4521 unit is not a Pure unit in the categorization sense. So for example, a function
4522 thus marked is free to @code{with} non-pure units.
4523
4524 @node Pragma Remote_Access_Type
4525 @unnumberedsec Pragma Remote_Access_Type
4526 @findex Remote_Access_Type
4527 @noindent
4528 Syntax:
4529
4530 @smallexample @c ada
4531 pragma Remote_Access_Type ([Entity =>] formal_access_type_LOCAL_NAME);
4532 @end smallexample
4533
4534 @noindent
4535 This pragma appears in the formal part of a generic declaration.
4536 It specifies an exception to the RM rule from E.2.2(17/2), which forbids
4537 the use of a remote access to class-wide type as actual for a formal
4538 access type.
4539
4540 When this pragma applies to a formal access type @code{Entity}, that
4541 type is treated as a remote access to class-wide type in the generic.
4542 It must be a formal general access type, and its designated type must
4543 be the class-wide type of a formal tagged limited private type from the
4544 same generic declaration.
4545
4546 In the generic unit, the formal type is subject to all restrictions
4547 pertaining to remote access to class-wide types. At instantiation, the
4548 actual type must be a remote access to class-wide type.
4549
4550 @node Pragma Restriction_Warnings
4551 @unnumberedsec Pragma Restriction_Warnings
4552 @findex Restriction_Warnings
4553 @noindent
4554 Syntax:
4555
4556 @smallexample @c ada
4557 pragma Restriction_Warnings
4558   (restriction_IDENTIFIER @{, restriction_IDENTIFIER@});
4559 @end smallexample
4560
4561 @noindent
4562 This pragma allows a series of restriction identifiers to be
4563 specified (the list of allowed identifiers is the same as for
4564 pragma @code{Restrictions}). For each of these identifiers
4565 the compiler checks for violations of the restriction, but
4566 generates a warning message rather than an error message
4567 if the restriction is violated.
4568
4569 @node Pragma Shared
4570 @unnumberedsec Pragma Shared
4571 @findex Shared
4572
4573 @noindent
4574 This pragma is provided for compatibility with Ada 83. The syntax and
4575 semantics are identical to pragma Atomic.
4576
4577 @node Pragma Short_Circuit_And_Or
4578 @unnumberedsec Pragma Short_Circuit_And_Or
4579 @findex Short_Circuit_And_Or
4580
4581 @noindent
4582 This configuration pragma causes any occurrence of the AND operator applied to
4583 operands of type Standard.Boolean to be short-circuited (i.e. the AND operator
4584 is treated as if it were AND THEN). Or is similarly treated as OR ELSE. This
4585 may be useful in the context of certification protocols requiring the use of
4586 short-circuited logical operators. If this configuration pragma occurs locally
4587 within the file being compiled, it applies only to the file being compiled.
4588 There is no requirement that all units in a partition use this option.
4589
4590 @node Pragma Short_Descriptors
4591 @unnumberedsec Pragma Short_Descriptors
4592 @findex Short_Descriptors
4593 @noindent
4594 Syntax:
4595
4596 @smallexample @c ada
4597 pragma Short_Descriptors
4598 @end smallexample
4599
4600 @noindent
4601 In VMS versions of the compiler, this configuration pragma causes all
4602 occurrences of the mechanism types Descriptor[_xxx] to be treated as
4603 Short_Descriptor[_xxx]. This is helpful in porting legacy applications from a
4604 32-bit environment to a 64-bit environment. This pragma is ignored for non-VMS
4605 versions.
4606
4607 @node Pragma Simple_Storage_Pool_Type
4608 @unnumberedsec Pragma Simple_Storage_Pool_Type
4609 @findex Simple_Storage_Pool_Type
4610 @cindex Storage pool, simple
4611 @cindex Simple storage pool
4612 @noindent
4613 Syntax:
4614
4615 @smallexample @c ada
4616 pragma Simple_Storage_Pool_Type (type_LOCAL_NAME);
4617 @end smallexample
4618
4619 @noindent
4620 A type can be established as a ``simple storage pool type'' by applying
4621 the representation pragma @code{Simple_Storage_Pool_Type} to the type.
4622 A type named in the pragma must be a library-level immutably limited record
4623 type or limited tagged type declared immediately within a package declaration.
4624 The type can also be a limited private type whose full type is allowed as
4625 a simple storage pool type.
4626
4627 For a simple storage pool type @var{SSP}, nonabstract primitive subprograms
4628 @code{Allocate}, @code{Deallocate}, and @code{Storage_Size} can be declared that
4629 are subtype conformant with the following subprogram declarations:
4630
4631 @smallexample @c ada
4632 procedure Allocate
4633   (Pool                     : in out SSP;
4634    Storage_Address          : out System.Address;
4635    Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
4636    Alignment                : System.Storage_Elements.Storage_Count);
4637
4638 procedure Deallocate
4639   (Pool : in out SSP;
4640    Storage_Address          : System.Address;
4641    Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
4642    Alignment                : System.Storage_Elements.Storage_Count);
4643
4644 function Storage_Size (Pool : SSP)
4645   return System.Storage_Elements.Storage_Count;
4646 @end smallexample
4647
4648 @noindent
4649 Procedure @code{Allocate} must be declared, whereas @code{Deallocate} and
4650 @code{Storage_Size} are optional. If @code{Deallocate} is not declared, then
4651 applying an unchecked deallocation has no effect other than to set its actual
4652 parameter to null. If @code{Storage_Size} is not declared, then the
4653 @code{Storage_Size} attribute applied to an access type associated with
4654 a pool object of type SSP returns zero. Additional operations can be declared
4655 for a simple storage pool type (such as for supporting a mark/release
4656 storage-management discipline).
4657
4658 An object of a simple storage pool type can be associated with an access
4659 type by specifying the attribute @code{Simple_Storage_Pool}. For example:
4660
4661 @smallexample @c ada
4662
4663 My_Pool : My_Simple_Storage_Pool_Type;
4664
4665 type Acc is access My_Data_Type;
4666
4667 for Acc'Simple_Storage_Pool use My_Pool;
4668
4669 @end smallexample
4670
4671 @noindent
4672 See attribute @code{Simple_Storage_Pool} for further details.
4673
4674 @node Pragma Source_File_Name
4675 @unnumberedsec Pragma Source_File_Name
4676 @findex Source_File_Name
4677 @noindent
4678 Syntax:
4679
4680 @smallexample @c ada
4681 pragma Source_File_Name (
4682   [Unit_Name   =>] unit_NAME,
4683   Spec_File_Name =>  STRING_LITERAL,
4684   [Index => INTEGER_LITERAL]);
4685
4686 pragma Source_File_Name (
4687   [Unit_Name   =>] unit_NAME,
4688   Body_File_Name =>  STRING_LITERAL,
4689   [Index => INTEGER_LITERAL]);
4690 @end smallexample
4691
4692 @noindent
4693 Use this to override the normal naming convention.  It is a configuration
4694 pragma, and so has the usual applicability of configuration pragmas
4695 (i.e.@: it applies to either an entire partition, or to all units in a
4696 compilation, or to a single unit, depending on how it is used.
4697 @var{unit_name} is mapped to @var{file_name_literal}.  The identifier for
4698 the second argument is required, and indicates whether this is the file
4699 name for the spec or for the body.
4700
4701 The optional Index argument should be used when a file contains multiple
4702 units, and when you do not want to use @code{gnatchop} to separate then
4703 into multiple files (which is the recommended procedure to limit the
4704 number of recompilations that are needed when some sources change).
4705 For instance, if the source file @file{source.ada} contains
4706
4707 @smallexample @c ada
4708 package B is
4709 ...
4710 end B;
4711
4712 with B;
4713 procedure A is
4714 begin
4715    ..
4716 end A;
4717 @end smallexample
4718
4719 you could use the following configuration pragmas:
4720
4721 @smallexample @c ada
4722 pragma Source_File_Name
4723   (B, Spec_File_Name => "source.ada", Index => 1);
4724 pragma Source_File_Name
4725   (A, Body_File_Name => "source.ada", Index => 2);
4726 @end smallexample
4727
4728 Note that the @code{gnatname} utility can also be used to generate those
4729 configuration pragmas.
4730
4731 Another form of the @code{Source_File_Name} pragma allows
4732 the specification of patterns defining alternative file naming schemes
4733 to apply to all files.
4734
4735 @smallexample @c ada
4736 pragma Source_File_Name
4737   (  [Spec_File_Name  =>] STRING_LITERAL
4738    [,[Casing          =>] CASING_SPEC]
4739    [,[Dot_Replacement =>] STRING_LITERAL]);
4740
4741 pragma Source_File_Name
4742   (  [Body_File_Name  =>] STRING_LITERAL
4743    [,[Casing          =>] CASING_SPEC]
4744    [,[Dot_Replacement =>] STRING_LITERAL]);
4745
4746 pragma Source_File_Name
4747   (  [Subunit_File_Name =>] STRING_LITERAL
4748    [,[Casing            =>] CASING_SPEC]
4749    [,[Dot_Replacement   =>] STRING_LITERAL]);
4750
4751 CASING_SPEC ::= Lowercase | Uppercase | Mixedcase
4752 @end smallexample
4753
4754 @noindent
4755 The first argument is a pattern that contains a single asterisk indicating
4756 the point at which the unit name is to be inserted in the pattern string
4757 to form the file name.  The second argument is optional.  If present it
4758 specifies the casing of the unit name in the resulting file name string.
4759 The default is lower case.  Finally the third argument allows for systematic
4760 replacement of any dots in the unit name by the specified string literal.
4761
4762 Note that Source_File_Name pragmas should not be used if you are using
4763 project files. The reason for this rule is that the project manager is not
4764 aware of these pragmas, and so other tools that use the projet file would not
4765 be aware of the intended naming conventions. If you are using project files,
4766 file naming is controlled by Source_File_Name_Project pragmas, which are
4767 usually supplied automatically by the project manager. A pragma
4768 Source_File_Name cannot appear after a @ref{Pragma Source_File_Name_Project}.
4769
4770 For more details on the use of the @code{Source_File_Name} pragma,
4771 @xref{Using Other File Names,,, gnat_ugn, @value{EDITION} User's Guide},
4772 and @ref{Alternative File Naming Schemes,,, gnat_ugn, @value{EDITION}
4773 User's Guide}.
4774
4775 @node Pragma Source_File_Name_Project
4776 @unnumberedsec Pragma Source_File_Name_Project
4777 @findex Source_File_Name_Project
4778 @noindent
4779
4780 This pragma has the same syntax and semantics as pragma Source_File_Name.
4781 It is only allowed as a stand alone configuration pragma.
4782 It cannot appear after a @ref{Pragma Source_File_Name}, and
4783 most importantly, once pragma Source_File_Name_Project appears,
4784 no further Source_File_Name pragmas are allowed.
4785
4786 The intention is that Source_File_Name_Project pragmas are always
4787 generated by the Project Manager in a manner consistent with the naming
4788 specified in a project file, and when naming is controlled in this manner,
4789 it is not permissible to attempt to modify this naming scheme using
4790 Source_File_Name or Source_File_Name_Project pragmas (which would not be
4791 known to the project manager).
4792
4793 @node Pragma Source_Reference
4794 @unnumberedsec Pragma Source_Reference
4795 @findex Source_Reference
4796 @noindent
4797 Syntax:
4798
4799 @smallexample @c ada
4800 pragma Source_Reference (INTEGER_LITERAL, STRING_LITERAL);
4801 @end smallexample
4802
4803 @noindent
4804 This pragma must appear as the first line of a source file.
4805 @var{integer_literal} is the logical line number of the line following
4806 the pragma line (for use in error messages and debugging
4807 information).  @var{string_literal} is a static string constant that
4808 specifies the file name to be used in error messages and debugging
4809 information.  This is most notably used for the output of @code{gnatchop}
4810 with the @option{-r} switch, to make sure that the original unchopped
4811 source file is the one referred to.
4812
4813 The second argument must be a string literal, it cannot be a static
4814 string expression other than a string literal.  This is because its value
4815 is needed for error messages issued by all phases of the compiler.
4816
4817 @node Pragma Static_Elaboration_Desired
4818 @unnumberedsec Pragma Static_Elaboration_Desired
4819 @findex Static_Elaboration_Desired
4820 @noindent
4821 Syntax:
4822
4823 @smallexample @c ada
4824 pragma Static_Elaboration_Desired;
4825 @end smallexample
4826
4827 @noindent
4828 This pragma is used to indicate that the compiler should attempt to initialize
4829 statically the objects declared in the library unit to which the pragma applies,
4830 when these objects are initialized (explicitly or implicitly) by an aggregate.
4831 In the absence of this pragma, aggregates in object declarations are expanded
4832 into assignments and loops, even when the aggregate components are static
4833 constants. When the aggregate is present the compiler builds a static expression
4834 that requires no run-time code, so that the initialized object can be placed in
4835 read-only data space. If the components are not static, or the aggregate has
4836 more that 100 components, the compiler emits a warning that the pragma cannot
4837 be obeyed. (See also the restriction No_Implicit_Loops, which supports static
4838 construction of larger aggregates with static components that include an others
4839 choice.)
4840
4841 @node Pragma Stream_Convert
4842 @unnumberedsec Pragma Stream_Convert
4843 @findex Stream_Convert
4844 @noindent
4845 Syntax:
4846
4847 @smallexample @c ada
4848 pragma Stream_Convert (
4849   [Entity =>] type_LOCAL_NAME,
4850   [Read   =>] function_NAME,
4851   [Write  =>] function_NAME);
4852 @end smallexample
4853
4854 @noindent
4855 This pragma provides an efficient way of providing stream functions for
4856 types defined in packages.  Not only is it simpler to use than declaring
4857 the necessary functions with attribute representation clauses, but more
4858 significantly, it allows the declaration to made in such a way that the
4859 stream packages are not loaded unless they are needed.  The use of
4860 the Stream_Convert pragma adds no overhead at all, unless the stream
4861 attributes are actually used on the designated type.
4862
4863 The first argument specifies the type for which stream functions are
4864 provided.  The second parameter provides a function used to read values
4865 of this type.  It must name a function whose argument type may be any
4866 subtype, and whose returned type must be the type given as the first
4867 argument to the pragma.
4868
4869 The meaning of the @var{Read}
4870 parameter is that if a stream attribute directly
4871 or indirectly specifies reading of the type given as the first parameter,
4872 then a value of the type given as the argument to the Read function is
4873 read from the stream, and then the Read function is used to convert this
4874 to the required target type.
4875
4876 Similarly the @var{Write} parameter specifies how to treat write attributes
4877 that directly or indirectly apply to the type given as the first parameter.
4878 It must have an input parameter of the type specified by the first parameter,
4879 and the return type must be the same as the input type of the Read function.
4880 The effect is to first call the Write function to convert to the given stream
4881 type, and then write the result type to the stream.
4882
4883 The Read and Write functions must not be overloaded subprograms.  If necessary
4884 renamings can be supplied to meet this requirement.
4885 The usage of this attribute is best illustrated by a simple example, taken
4886 from the GNAT implementation of package Ada.Strings.Unbounded:
4887
4888 @smallexample @c ada
4889 function To_Unbounded (S : String)
4890            return Unbounded_String
4891   renames To_Unbounded_String;
4892
4893 pragma Stream_Convert
4894   (Unbounded_String, To_Unbounded, To_String);
4895 @end smallexample
4896
4897 @noindent
4898 The specifications of the referenced functions, as given in the Ada
4899 Reference Manual are:
4900
4901 @smallexample @c ada
4902 function To_Unbounded_String (Source : String)
4903   return Unbounded_String;
4904
4905 function To_String (Source : Unbounded_String)
4906   return String;
4907 @end smallexample
4908
4909 @noindent
4910 The effect is that if the value of an unbounded string is written to a stream,
4911 then the representation of the item in the stream is in the same format that
4912 would be used for @code{Standard.String'Output}, and this same representation
4913 is expected when a value of this type is read from the stream. Note that the
4914 value written always includes the bounds, even for Unbounded_String'Write,
4915 since Unbounded_String is not an array type.
4916
4917 @node Pragma Style_Checks
4918 @unnumberedsec Pragma Style_Checks
4919 @findex Style_Checks
4920 @noindent
4921 Syntax:
4922
4923 @smallexample @c ada
4924 pragma Style_Checks (string_LITERAL | ALL_CHECKS |
4925                      On | Off [, LOCAL_NAME]);
4926 @end smallexample
4927
4928 @noindent
4929 This pragma is used in conjunction with compiler switches to control the
4930 built in style checking provided by GNAT@.  The compiler switches, if set,
4931 provide an initial setting for the switches, and this pragma may be used
4932 to modify these settings, or the settings may be provided entirely by
4933 the use of the pragma.  This pragma can be used anywhere that a pragma
4934 is legal, including use as a configuration pragma (including use in
4935 the @file{gnat.adc} file).
4936
4937 The form with a string literal specifies which style options are to be
4938 activated.  These are additive, so they apply in addition to any previously
4939 set style check options.  The codes for the options are the same as those
4940 used in the @option{-gnaty} switch to @command{gcc} or @command{gnatmake}.
4941 For example the following two methods can be used to enable
4942 layout checking:
4943
4944 @itemize @bullet
4945 @item
4946 @smallexample @c ada
4947 pragma Style_Checks ("l");
4948 @end smallexample
4949
4950 @item
4951 @smallexample
4952 gcc -c -gnatyl @dots{}
4953 @end smallexample
4954 @end itemize
4955
4956 @noindent
4957 The form ALL_CHECKS activates all standard checks (its use is equivalent
4958 to the use of the @code{gnaty} switch with no options.  @xref{Top,
4959 @value{EDITION} User's Guide, About This Guide, gnat_ugn,
4960 @value{EDITION} User's Guide}, for details.)
4961
4962 Note: the behavior is slightly different in GNAT mode (@option{-gnatg} used).
4963 In this case, ALL_CHECKS implies the standard set of GNAT mode style check
4964 options (i.e. equivalent to -gnatyg).
4965
4966 The forms with @code{Off} and @code{On}
4967 can be used to temporarily disable style checks
4968 as shown in the following example:
4969
4970 @smallexample @c ada
4971 @iftex
4972 @leftskip=0cm
4973 @end iftex
4974 pragma Style_Checks ("k"); -- requires keywords in lower case
4975 pragma Style_Checks (Off); -- turn off style checks
4976 NULL;                      -- this will not generate an error message
4977 pragma Style_Checks (On);  -- turn style checks back on
4978 NULL;                      -- this will generate an error message
4979 @end smallexample
4980
4981 @noindent
4982 Finally the two argument form is allowed only if the first argument is
4983 @code{On} or @code{Off}.  The effect is to turn of semantic style checks
4984 for the specified entity, as shown in the following example:
4985
4986 @smallexample @c ada
4987 @iftex
4988 @leftskip=0cm
4989 @end iftex
4990 pragma Style_Checks ("r"); -- require consistency of identifier casing
4991 Arg : Integer;
4992 Rf1 : Integer := ARG;      -- incorrect, wrong case
4993 pragma Style_Checks (Off, Arg);
4994 Rf2 : Integer := ARG;      -- OK, no error
4995 @end smallexample
4996
4997 @node Pragma Subtitle
4998 @unnumberedsec Pragma Subtitle
4999 @findex Subtitle
5000 @noindent
5001 Syntax:
5002
5003 @smallexample @c ada
5004 pragma Subtitle ([Subtitle =>] STRING_LITERAL);
5005 @end smallexample
5006
5007 @noindent
5008 This pragma is recognized for compatibility with other Ada compilers
5009 but is ignored by GNAT@.
5010
5011 @node Pragma Suppress
5012 @unnumberedsec Pragma Suppress
5013 @findex Suppress
5014 @noindent
5015 Syntax:
5016
5017 @smallexample @c ada
5018 pragma Suppress (Identifier [, [On =>] Name]);
5019 @end smallexample
5020
5021 @noindent
5022 This is a standard pragma, and supports all the check names required in
5023 the RM. It is included here because GNAT recognizes one additional check
5024 name: @code{Alignment_Check} which can be used to suppress alignment checks
5025 on addresses used in address clauses. Such checks can also be suppressed
5026 by suppressing range checks, but the specific use of @code{Alignment_Check}
5027 allows suppression of alignment checks without suppressing other range checks.
5028
5029 Note that pragma Suppress gives the compiler permission to omit
5030 checks, but does not require the compiler to omit checks. The compiler
5031 will generate checks if they are essentially free, even when they are
5032 suppressed. In particular, if the compiler can prove that a certain
5033 check will necessarily fail, it will generate code to do an
5034 unconditional ``raise'', even if checks are suppressed. The compiler
5035 warns in this case.
5036
5037 Of course, run-time checks are omitted whenever the compiler can prove
5038 that they will not fail, whether or not checks are suppressed.
5039
5040 @node Pragma Suppress_All
5041 @unnumberedsec Pragma Suppress_All
5042 @findex Suppress_All
5043 @noindent
5044 Syntax:
5045
5046 @smallexample @c ada
5047 pragma Suppress_All;
5048 @end smallexample
5049
5050 @noindent
5051 This pragma can appear anywhere within a unit.
5052 The effect is to apply @code{Suppress (All_Checks)} to the unit
5053 in which it appears.  This pragma is implemented for compatibility with DEC
5054 Ada 83 usage where it appears at the end of a unit, and for compatibility
5055 with Rational Ada, where it appears as a program unit pragma.
5056 The use of the standard Ada pragma @code{Suppress (All_Checks)}
5057 as a normal configuration pragma is the preferred usage in GNAT@.
5058
5059 @node Pragma Suppress_Exception_Locations
5060 @unnumberedsec Pragma Suppress_Exception_Locations
5061 @findex Suppress_Exception_Locations
5062 @noindent
5063 Syntax:
5064
5065 @smallexample @c ada
5066 pragma Suppress_Exception_Locations;
5067 @end smallexample
5068
5069 @noindent
5070 In normal mode, a raise statement for an exception by default generates
5071 an exception message giving the file name and line number for the location
5072 of the raise. This is useful for debugging and logging purposes, but this
5073 entails extra space for the strings for the messages. The configuration
5074 pragma @code{Suppress_Exception_Locations} can be used to suppress the
5075 generation of these strings, with the result that space is saved, but the
5076 exception message for such raises is null. This configuration pragma may
5077 appear in a global configuration pragma file, or in a specific unit as
5078 usual. It is not required that this pragma be used consistently within
5079 a partition, so it is fine to have some units within a partition compiled
5080 with this pragma and others compiled in normal mode without it.
5081
5082 @node Pragma Suppress_Initialization
5083 @unnumberedsec Pragma Suppress_Initialization
5084 @findex Suppress_Initialization
5085 @cindex Suppressing initialization
5086 @cindex Initialization, suppression of
5087 @noindent
5088 Syntax:
5089
5090 @smallexample @c ada
5091 pragma Suppress_Initialization ([Entity =>] subtype_Name);
5092 @end smallexample
5093
5094 @noindent
5095 Here subtype_Name is the name introduced by a type declaration
5096 or subtype declaration.
5097 This pragma suppresses any implicit or explicit initialization
5098 for all variables of the given type or subtype,
5099 including initialization resulting from the use of pragmas
5100 Normalize_Scalars or Initialize_Scalars.
5101
5102 This is considered a representation item, so it cannot be given after
5103 the type is frozen. It applies to all subsequent object declarations,
5104 and also any allocator that creates objects of the type.
5105
5106 If the pragma is given for the first subtype, then it is considered
5107 to apply to the base type and all its subtypes. If the pragma is given
5108 for other than a first subtype, then it applies only to the given subtype.
5109 The pragma may not be given after the type is frozen.
5110
5111 @node Pragma Task_Info
5112 @unnumberedsec Pragma Task_Info
5113 @findex Task_Info
5114 @noindent
5115 Syntax
5116
5117 @smallexample @c ada
5118 pragma Task_Info (EXPRESSION);
5119 @end smallexample
5120
5121 @noindent
5122 This pragma appears within a task definition (like pragma
5123 @code{Priority}) and applies to the task in which it appears.  The
5124 argument must be of type @code{System.Task_Info.Task_Info_Type}.
5125 The @code{Task_Info} pragma provides system dependent control over
5126 aspects of tasking implementation, for example, the ability to map
5127 tasks to specific processors.  For details on the facilities available
5128 for the version of GNAT that you are using, see the documentation
5129 in the spec of package System.Task_Info in the runtime
5130 library.
5131
5132 @node Pragma Task_Name
5133 @unnumberedsec Pragma Task_Name
5134 @findex Task_Name
5135 @noindent
5136 Syntax
5137
5138 @smallexample @c ada
5139 pragma Task_Name (string_EXPRESSION);
5140 @end smallexample
5141
5142 @noindent
5143 This pragma appears within a task definition (like pragma
5144 @code{Priority}) and applies to the task in which it appears.  The
5145 argument must be of type String, and provides a name to be used for
5146 the task instance when the task is created.  Note that this expression
5147 is not required to be static, and in particular, it can contain
5148 references to task discriminants.  This facility can be used to
5149 provide different names for different tasks as they are created,
5150 as illustrated in the example below.
5151
5152 The task name is recorded internally in the run-time structures
5153 and is accessible to tools like the debugger.  In addition the
5154 routine @code{Ada.Task_Identification.Image} will return this
5155 string, with a unique task address appended.
5156
5157 @smallexample @c ada
5158 --  Example of the use of pragma Task_Name
5159
5160 with Ada.Task_Identification;
5161 use Ada.Task_Identification;
5162 with Text_IO; use Text_IO;
5163 procedure t3 is
5164
5165    type Astring is access String;
5166
5167    task type Task_Typ (Name : access String) is
5168       pragma Task_Name (Name.all);
5169    end Task_Typ;
5170
5171    task body Task_Typ is
5172       Nam : constant String := Image (Current_Task);
5173    begin
5174       Put_Line ("-->" & Nam (1 .. 14) & "<--");
5175    end Task_Typ;
5176
5177    type Ptr_Task is access Task_Typ;
5178    Task_Var : Ptr_Task;
5179
5180 begin
5181    Task_Var :=
5182      new Task_Typ (new String'("This is task 1"));
5183    Task_Var :=
5184      new Task_Typ (new String'("This is task 2"));
5185 end;
5186 @end smallexample
5187
5188 @node Pragma Task_Storage
5189 @unnumberedsec Pragma Task_Storage
5190 @findex Task_Storage
5191 Syntax:
5192
5193 @smallexample @c ada
5194 pragma Task_Storage (
5195   [Task_Type =>] LOCAL_NAME,
5196   [Top_Guard =>] static_integer_EXPRESSION);
5197 @end smallexample
5198
5199 @noindent
5200 This pragma specifies the length of the guard area for tasks.  The guard
5201 area is an additional storage area allocated to a task.  A value of zero
5202 means that either no guard area is created or a minimal guard area is
5203 created, depending on the target.  This pragma can appear anywhere a
5204 @code{Storage_Size} attribute definition clause is allowed for a task
5205 type.
5206
5207 @node Pragma Test_Case
5208 @unnumberedsec Pragma Test_Case
5209 @cindex Test cases
5210 @findex Test_Case
5211 @noindent
5212 Syntax:
5213
5214 @smallexample @c ada
5215 pragma Test_Case (
5216    [Name     =>] static_string_Expression
5217   ,[Mode     =>] (Nominal | Robustness)
5218  [, Requires =>  Boolean_Expression]
5219  [, Ensures  =>  Boolean_Expression]);
5220 @end smallexample
5221
5222 @noindent
5223 The @code{Test_Case} pragma allows defining fine-grain specifications
5224 for use by testing and verification tools. The compiler checks its
5225 validity but the presence of pragma @code{Test_Case} does not lead to
5226 any modification of the code generated by the compiler.
5227
5228 @code{Test_Case} pragmas may only appear immediately following the
5229 (separate) declaration of a subprogram in a package declaration, inside
5230 a package spec unit. Only other pragmas may intervene (that is appear
5231 between the subprogram declaration and a test case).
5232
5233 The compiler checks that boolean expressions given in @code{Requires} and
5234 @code{Ensures} are valid, where the rules for @code{Requires} are the
5235 same as the rule for an expression in @code{Precondition} and the rules
5236 for @code{Ensures} are the same as the rule for an expression in
5237 @code{Postcondition}. In particular, attributes @code{'Old} and
5238 @code{'Result} can only be used within the @code{Ensures}
5239 expression. The following is an example of use within a package spec:
5240
5241 @smallexample @c ada
5242 package Math_Functions is
5243    ...
5244    function Sqrt (Arg : Float) return Float;
5245    pragma Test_Case (Name     => "Test 1",
5246                      Mode     => Nominal,
5247                      Requires => Arg < 100,
5248                      Ensures  => Sqrt'Result < 10);
5249    ...
5250 end Math_Functions;
5251 @end smallexample
5252
5253 @noindent
5254 The meaning of a test case is that, if the associated subprogram is
5255 executed in a context where @code{Requires} holds, then @code{Ensures}
5256 should hold when the subprogram returns. Mode @code{Nominal} indicates
5257 that the input context should satisfy the precondition of the
5258 subprogram, and the output context should then satisfy its
5259 postcondition. More @code{Robustness} indicates that the pre- and
5260 postcondition of the subprogram should be ignored for this test case.
5261
5262 @node Pragma Thread_Local_Storage
5263 @unnumberedsec Pragma Thread_Local_Storage
5264 @findex Thread_Local_Storage
5265 @cindex Task specific storage
5266 @cindex TLS (Thread Local Storage)
5267 Syntax:
5268
5269 @smallexample @c ada
5270 pragma Thread_Local_Storage ([Entity =>] LOCAL_NAME);
5271 @end smallexample
5272
5273 @noindent
5274 This pragma specifies that the specified entity, which must be
5275 a variable declared in a library level package, is to be marked as
5276 "Thread Local Storage" (@code{TLS}). On systems supporting this (which
5277 include Solaris, GNU/Linux and VxWorks 6), this causes each thread
5278 (and hence each Ada task) to see a distinct copy of the variable.
5279
5280 The variable may not have default initialization, and if there is
5281 an explicit initialization, it must be either @code{null} for an
5282 access variable, or a static expression for a scalar variable.
5283 This provides a low level mechanism similar to that provided by
5284 the @code{Ada.Task_Attributes} package, but much more efficient
5285 and is also useful in writing interface code that will interact
5286 with foreign threads.
5287
5288 If this pragma is used on a system where @code{TLS} is not supported,
5289 then an error message will be generated and the program will be rejected.
5290
5291 @node Pragma Time_Slice
5292 @unnumberedsec Pragma Time_Slice
5293 @findex Time_Slice
5294 @noindent
5295 Syntax:
5296
5297 @smallexample @c ada
5298 pragma Time_Slice (static_duration_EXPRESSION);
5299 @end smallexample
5300
5301 @noindent
5302 For implementations of GNAT on operating systems where it is possible
5303 to supply a time slice value, this pragma may be used for this purpose.
5304 It is ignored if it is used in a system that does not allow this control,
5305 or if it appears in other than the main program unit.
5306 @cindex OpenVMS
5307 Note that the effect of this pragma is identical to the effect of the
5308 DEC Ada 83 pragma of the same name when operating under OpenVMS systems.
5309
5310 @node Pragma Title
5311 @unnumberedsec Pragma Title
5312 @findex Title
5313 @noindent
5314 Syntax:
5315
5316 @smallexample @c ada
5317 pragma Title (TITLING_OPTION [, TITLING OPTION]);
5318
5319 TITLING_OPTION ::=
5320   [Title    =>] STRING_LITERAL,
5321 | [Subtitle =>] STRING_LITERAL
5322 @end smallexample
5323
5324 @noindent
5325 Syntax checked but otherwise ignored by GNAT@.  This is a listing control
5326 pragma used in DEC Ada 83 implementations to provide a title and/or
5327 subtitle for the program listing.  The program listing generated by GNAT
5328 does not have titles or subtitles.
5329
5330 Unlike other pragmas, the full flexibility of named notation is allowed
5331 for this pragma, i.e.@: the parameters may be given in any order if named
5332 notation is used, and named and positional notation can be mixed
5333 following the normal rules for procedure calls in Ada.
5334
5335 @node Pragma Unchecked_Union
5336 @unnumberedsec Pragma Unchecked_Union
5337 @cindex Unions in C
5338 @findex Unchecked_Union
5339 @noindent
5340 Syntax:
5341
5342 @smallexample @c ada
5343 pragma Unchecked_Union (first_subtype_LOCAL_NAME);
5344 @end smallexample
5345
5346 @noindent
5347 This pragma is used to specify a representation of a record type that is
5348 equivalent to a C union. It was introduced as a GNAT implementation defined
5349 pragma in the GNAT Ada 95 mode. Ada 2005 includes an extended version of this
5350 pragma, making it language defined, and GNAT fully implements this extended
5351 version in all language modes (Ada 83, Ada 95, and Ada 2005). For full
5352 details, consult the Ada 2005 Reference Manual, section B.3.3.
5353
5354 @node Pragma Unimplemented_Unit
5355 @unnumberedsec Pragma Unimplemented_Unit
5356 @findex Unimplemented_Unit
5357 @noindent
5358 Syntax:
5359
5360 @smallexample @c ada
5361 pragma Unimplemented_Unit;
5362 @end smallexample
5363
5364 @noindent
5365 If this pragma occurs in a unit that is processed by the compiler, GNAT
5366 aborts with the message @samp{@var{xxx} not implemented}, where
5367 @var{xxx} is the name of the current compilation unit.  This pragma is
5368 intended to allow the compiler to handle unimplemented library units in
5369 a clean manner.
5370
5371 The abort only happens if code is being generated.  Thus you can use
5372 specs of unimplemented packages in syntax or semantic checking mode.
5373
5374 @node Pragma Universal_Aliasing
5375 @unnumberedsec Pragma Universal_Aliasing
5376 @findex Universal_Aliasing
5377 @noindent
5378 Syntax:
5379
5380 @smallexample @c ada
5381 pragma Universal_Aliasing [([Entity =>] type_LOCAL_NAME)];
5382 @end smallexample
5383
5384 @noindent
5385 @var{type_LOCAL_NAME} must refer to a type declaration in the current
5386 declarative part.  The effect is to inhibit strict type-based aliasing
5387 optimization for the given type.  In other words, the effect is as though
5388 access types designating this type were subject to pragma No_Strict_Aliasing.
5389 For a detailed description of the strict aliasing optimization, and the
5390 situations in which it must be suppressed, @xref{Optimization and Strict
5391 Aliasing,,, gnat_ugn, @value{EDITION} User's Guide}.
5392
5393 @node Pragma Universal_Data
5394 @unnumberedsec Pragma Universal_Data
5395 @findex Universal_Data
5396 @noindent
5397 Syntax:
5398
5399 @smallexample @c ada
5400 pragma Universal_Data [(library_unit_Name)];
5401 @end smallexample
5402
5403 @noindent
5404 This pragma is supported only for the AAMP target and is ignored for
5405 other targets. The pragma specifies that all library-level objects
5406 (Counter 0 data) associated with the library unit are to be accessed
5407 and updated using universal addressing (24-bit addresses for AAMP5)
5408 rather than the default of 16-bit Data Environment (DENV) addressing.
5409 Use of this pragma will generally result in less efficient code for
5410 references to global data associated with the library unit, but
5411 allows such data to be located anywhere in memory. This pragma is
5412 a library unit pragma, but can also be used as a configuration pragma
5413 (including use in the @file{gnat.adc} file). The functionality
5414 of this pragma is also available by applying the -univ switch on the
5415 compilations of units where universal addressing of the data is desired.
5416
5417 @node Pragma Unmodified
5418 @unnumberedsec Pragma Unmodified
5419 @findex Unmodified
5420 @cindex Warnings, unmodified
5421 @noindent
5422 Syntax:
5423
5424 @smallexample @c ada
5425 pragma Unmodified (LOCAL_NAME @{, LOCAL_NAME@});
5426 @end smallexample
5427
5428 @noindent
5429 This pragma signals that the assignable entities (variables,
5430 @code{out} parameters, @code{in out} parameters) whose names are listed are
5431 deliberately not assigned in the current source unit. This
5432 suppresses warnings about the
5433 entities being referenced but not assigned, and in addition a warning will be
5434 generated if one of these entities is in fact assigned in the
5435 same unit as the pragma (or in the corresponding body, or one
5436 of its subunits).
5437
5438 This is particularly useful for clearly signaling that a particular
5439 parameter is not modified, even though the spec suggests that it might
5440 be.
5441
5442 @node Pragma Unreferenced
5443 @unnumberedsec Pragma Unreferenced
5444 @findex Unreferenced
5445 @cindex Warnings, unreferenced
5446 @noindent
5447 Syntax:
5448
5449 @smallexample @c ada
5450 pragma Unreferenced (LOCAL_NAME @{, LOCAL_NAME@});
5451 pragma Unreferenced (library_unit_NAME @{, library_unit_NAME@});
5452 @end smallexample
5453
5454 @noindent
5455 This pragma signals that the entities whose names are listed are
5456 deliberately not referenced in the current source unit. This
5457 suppresses warnings about the
5458 entities being unreferenced, and in addition a warning will be
5459 generated if one of these entities is in fact subsequently referenced in the
5460 same unit as the pragma (or in the corresponding body, or one
5461 of its subunits).
5462
5463 This is particularly useful for clearly signaling that a particular
5464 parameter is not referenced in some particular subprogram implementation
5465 and that this is deliberate. It can also be useful in the case of
5466 objects declared only for their initialization or finalization side
5467 effects.
5468
5469 If @code{LOCAL_NAME} identifies more than one matching homonym in the
5470 current scope, then the entity most recently declared is the one to which
5471 the pragma applies. Note that in the case of accept formals, the pragma
5472 Unreferenced may appear immediately after the keyword @code{do} which
5473 allows the indication of whether or not accept formals are referenced
5474 or not to be given individually for each accept statement.
5475
5476 The left hand side of an assignment does not count as a reference for the
5477 purpose of this pragma. Thus it is fine to assign to an entity for which
5478 pragma Unreferenced is given.
5479
5480 Note that if a warning is desired for all calls to a given subprogram,
5481 regardless of whether they occur in the same unit as the subprogram
5482 declaration, then this pragma should not be used (calls from another
5483 unit would not be flagged); pragma Obsolescent can be used instead
5484 for this purpose, see @xref{Pragma Obsolescent}.
5485
5486 The second form of pragma @code{Unreferenced} is used within a context
5487 clause. In this case the arguments must be unit names of units previously
5488 mentioned in @code{with} clauses (similar to the usage of pragma
5489 @code{Elaborate_All}. The effect is to suppress warnings about unreferenced
5490 units and unreferenced entities within these units.
5491
5492 @node Pragma Unreferenced_Objects
5493 @unnumberedsec Pragma Unreferenced_Objects
5494 @findex Unreferenced_Objects
5495 @cindex Warnings, unreferenced
5496 @noindent
5497 Syntax:
5498
5499 @smallexample @c ada
5500 pragma Unreferenced_Objects (local_subtype_NAME @{, local_subtype_NAME@});
5501 @end smallexample
5502
5503 @noindent
5504 This pragma signals that for the types or subtypes whose names are
5505 listed, objects which are declared with one of these types or subtypes may
5506 not be referenced, and if no references appear, no warnings are given.
5507
5508 This is particularly useful for objects which are declared solely for their
5509 initialization and finalization effect. Such variables are sometimes referred
5510 to as RAII variables (Resource Acquisition Is Initialization). Using this
5511 pragma on the relevant type (most typically a limited controlled type), the
5512 compiler will automatically suppress unwanted warnings about these variables
5513 not being referenced.
5514
5515 @node Pragma Unreserve_All_Interrupts
5516 @unnumberedsec Pragma Unreserve_All_Interrupts
5517 @findex Unreserve_All_Interrupts
5518 @noindent
5519 Syntax:
5520
5521 @smallexample @c ada
5522 pragma Unreserve_All_Interrupts;
5523 @end smallexample
5524
5525 @noindent
5526 Normally certain interrupts are reserved to the implementation.  Any attempt
5527 to attach an interrupt causes Program_Error to be raised, as described in
5528 RM C.3.2(22).  A typical example is the @code{SIGINT} interrupt used in
5529 many systems for a @kbd{Ctrl-C} interrupt.  Normally this interrupt is
5530 reserved to the implementation, so that @kbd{Ctrl-C} can be used to
5531 interrupt execution.
5532
5533 If the pragma @code{Unreserve_All_Interrupts} appears anywhere in any unit in
5534 a program, then all such interrupts are unreserved.  This allows the
5535 program to handle these interrupts, but disables their standard
5536 functions.  For example, if this pragma is used, then pressing
5537 @kbd{Ctrl-C} will not automatically interrupt execution.  However,
5538 a program can then handle the @code{SIGINT} interrupt as it chooses.
5539
5540 For a full list of the interrupts handled in a specific implementation,
5541 see the source code for the spec of @code{Ada.Interrupts.Names} in
5542 file @file{a-intnam.ads}.  This is a target dependent file that contains the
5543 list of interrupts recognized for a given target.  The documentation in
5544 this file also specifies what interrupts are affected by the use of
5545 the @code{Unreserve_All_Interrupts} pragma.
5546
5547 For a more general facility for controlling what interrupts can be
5548 handled, see pragma @code{Interrupt_State}, which subsumes the functionality
5549 of the @code{Unreserve_All_Interrupts} pragma.
5550
5551 @node Pragma Unsuppress
5552 @unnumberedsec Pragma Unsuppress
5553 @findex Unsuppress
5554 @noindent
5555 Syntax:
5556
5557 @smallexample @c ada
5558 pragma Unsuppress (IDENTIFIER [, [On =>] NAME]);
5559 @end smallexample
5560
5561 @noindent
5562 This pragma undoes the effect of a previous pragma @code{Suppress}.  If
5563 there is no corresponding pragma @code{Suppress} in effect, it has no
5564 effect.  The range of the effect is the same as for pragma
5565 @code{Suppress}.  The meaning of the arguments is identical to that used
5566 in pragma @code{Suppress}.
5567
5568 One important application is to ensure that checks are on in cases where
5569 code depends on the checks for its correct functioning, so that the code
5570 will compile correctly even if the compiler switches are set to suppress
5571 checks.
5572
5573 @node Pragma Use_VADS_Size
5574 @unnumberedsec Pragma Use_VADS_Size
5575 @cindex @code{Size}, VADS compatibility
5576 @findex Use_VADS_Size
5577 @noindent
5578 Syntax:
5579
5580 @smallexample @c ada
5581 pragma Use_VADS_Size;
5582 @end smallexample
5583
5584 @noindent
5585 This is a configuration pragma.  In a unit to which it applies, any use
5586 of the 'Size attribute is automatically interpreted as a use of the
5587 'VADS_Size attribute.  Note that this may result in incorrect semantic
5588 processing of valid Ada 95 or Ada 2005 programs.  This is intended to aid in
5589 the handling of existing code which depends on the interpretation of Size
5590 as implemented in the VADS compiler.  See description of the VADS_Size
5591 attribute for further details.
5592
5593 @node Pragma Validity_Checks
5594 @unnumberedsec Pragma Validity_Checks
5595 @findex Validity_Checks
5596 @noindent
5597 Syntax:
5598
5599 @smallexample @c ada
5600 pragma Validity_Checks (string_LITERAL | ALL_CHECKS | On | Off);
5601 @end smallexample
5602
5603 @noindent
5604 This pragma is used in conjunction with compiler switches to control the
5605 built-in validity checking provided by GNAT@.  The compiler switches, if set
5606 provide an initial setting for the switches, and this pragma may be used
5607 to modify these settings, or the settings may be provided entirely by
5608 the use of the pragma.  This pragma can be used anywhere that a pragma
5609 is legal, including use as a configuration pragma (including use in
5610 the @file{gnat.adc} file).
5611
5612 The form with a string literal specifies which validity options are to be
5613 activated.  The validity checks are first set to include only the default
5614 reference manual settings, and then a string of letters in the string
5615 specifies the exact set of options required.  The form of this string
5616 is exactly as described for the @option{-gnatVx} compiler switch (see the
5617 GNAT users guide for details).  For example the following two methods
5618 can be used to enable validity checking for mode @code{in} and
5619 @code{in out} subprogram parameters:
5620
5621 @itemize @bullet
5622 @item
5623 @smallexample @c ada
5624 pragma Validity_Checks ("im");
5625 @end smallexample
5626
5627 @item
5628 @smallexample
5629 gcc -c -gnatVim @dots{}
5630 @end smallexample
5631 @end itemize
5632
5633 @noindent
5634 The form ALL_CHECKS activates all standard checks (its use is equivalent
5635 to the use of the @code{gnatva} switch.
5636
5637 The forms with @code{Off} and @code{On}
5638 can be used to temporarily disable validity checks
5639 as shown in the following example:
5640
5641 @smallexample @c ada
5642 @iftex
5643 @leftskip=0cm
5644 @end iftex
5645 pragma Validity_Checks ("c"); -- validity checks for copies
5646 pragma Validity_Checks (Off); -- turn off validity checks
5647 A := B;                       -- B will not be validity checked
5648 pragma Validity_Checks (On);  -- turn validity checks back on
5649 A := C;                       -- C will be validity checked
5650 @end smallexample
5651
5652 @node Pragma Volatile
5653 @unnumberedsec Pragma Volatile
5654 @findex Volatile
5655 @noindent
5656 Syntax:
5657
5658 @smallexample @c ada
5659 pragma Volatile (LOCAL_NAME);
5660 @end smallexample
5661
5662 @noindent
5663 This pragma is defined by the Ada Reference Manual, and the GNAT
5664 implementation is fully conformant with this definition.  The reason it
5665 is mentioned in this section is that a pragma of the same name was supplied
5666 in some Ada 83 compilers, including DEC Ada 83.  The Ada 95 / Ada 2005
5667 implementation of pragma Volatile is upwards compatible with the
5668 implementation in DEC Ada 83.
5669
5670 @node Pragma Warnings
5671 @unnumberedsec Pragma Warnings
5672 @findex Warnings
5673 @noindent
5674 Syntax:
5675
5676 @smallexample @c ada
5677 pragma Warnings (On | Off);
5678 pragma Warnings (On | Off, LOCAL_NAME);
5679 pragma Warnings (static_string_EXPRESSION);
5680 pragma Warnings (On | Off, static_string_EXPRESSION);
5681 @end smallexample
5682
5683 @noindent
5684 Normally warnings are enabled, with the output being controlled by
5685 the command line switch.  Warnings (@code{Off}) turns off generation of
5686 warnings until a Warnings (@code{On}) is encountered or the end of the
5687 current unit.  If generation of warnings is turned off using this
5688 pragma, then no warning messages are output, regardless of the
5689 setting of the command line switches.
5690
5691 The form with a single argument may be used as a configuration pragma.
5692
5693 If the @var{LOCAL_NAME} parameter is present, warnings are suppressed for
5694 the specified entity.  This suppression is effective from the point where
5695 it occurs till the end of the extended scope of the variable (similar to
5696 the scope of @code{Suppress}).
5697
5698 The form with a single static_string_EXPRESSION argument provides more precise
5699 control over which warnings are active. The string is a list of letters
5700 specifying which warnings are to be activated and which deactivated. The
5701 code for these letters is the same as the string used in the command
5702 line switch controlling warnings. For a brief summary, use the gnatmake
5703 command with no arguments, which will generate usage information containing
5704 the list of warnings switches supported. For
5705 full details see @ref{Warning Message Control,,, gnat_ugn, @value{EDITION}
5706 User's Guide}.
5707
5708 @noindent
5709 The specified warnings will be in effect until the end of the program
5710 or another pragma Warnings is encountered. The effect of the pragma is
5711 cumulative. Initially the set of warnings is the standard default set
5712 as possibly modified by compiler switches. Then each pragma Warning
5713 modifies this set of warnings as specified. This form of the pragma may
5714 also be used as a configuration pragma.
5715
5716 The fourth form, with an @code{On|Off} parameter and a string, is used to
5717 control individual messages, based on their text. The string argument
5718 is a pattern that is used to match against the text of individual
5719 warning messages (not including the initial "warning: " tag).
5720
5721 The pattern may contain asterisks, which match zero or more characters in
5722 the message. For example, you can use
5723 @code{pragma Warnings (Off, "*bits of*unused")} to suppress the warning
5724 message @code{warning: 960 bits of "a" unused}. No other regular
5725 expression notations are permitted. All characters other than asterisk in
5726 these three specific cases are treated as literal characters in the match.
5727
5728 There are two ways to use the pragma in this form. The OFF form can be used as a
5729 configuration pragma. The effect is to suppress all warnings (if any)
5730 that match the pattern string throughout the compilation.
5731
5732 The second usage is to suppress a warning locally, and in this case, two
5733 pragmas must appear in sequence:
5734
5735 @smallexample @c ada
5736 pragma Warnings (Off, Pattern);
5737 @dots{} code where given warning is to be suppressed
5738 pragma Warnings (On, Pattern);
5739 @end smallexample
5740
5741 @noindent
5742 In this usage, the pattern string must match in the Off and On pragmas,
5743 and at least one matching warning must be suppressed.
5744
5745 Note: to write a string that will match any warning, use the string
5746 @code{"***"}. It will not work to use a single asterisk or two asterisks
5747 since this looks like an operator name. This form with three asterisks
5748 is similar in effect to specifying @code{pragma Warnings (Off)} except that a
5749 matching @code{pragma Warnings (On, "***")} will be required. This can be
5750 helpful in avoiding forgetting to turn warnings back on.
5751
5752 Note: the debug flag -gnatd.i (@code{/NOWARNINGS_PRAGMAS} in VMS) can be
5753 used to cause the compiler to entirely ignore all WARNINGS pragmas. This can
5754 be useful in checking whether obsolete pragmas in existing programs are hiding
5755 real problems.
5756
5757 Note: pragma Warnings does not affect the processing of style messages. See
5758 separate entry for pragma Style_Checks for control of style messages.
5759
5760 @node Pragma Weak_External
5761 @unnumberedsec Pragma Weak_External
5762 @findex Weak_External
5763 @noindent
5764 Syntax:
5765
5766 @smallexample @c ada
5767 pragma Weak_External ([Entity =>] LOCAL_NAME);
5768 @end smallexample
5769
5770 @noindent
5771 @var{LOCAL_NAME} must refer to an object that is declared at the library
5772 level. This pragma specifies that the given entity should be marked as a
5773 weak symbol for the linker. It is equivalent to @code{__attribute__((weak))}
5774 in GNU C and causes @var{LOCAL_NAME} to be emitted as a weak symbol instead
5775 of a regular symbol, that is to say a symbol that does not have to be
5776 resolved by the linker if used in conjunction with a pragma Import.
5777
5778 When a weak symbol is not resolved by the linker, its address is set to
5779 zero. This is useful in writing interfaces to external modules that may
5780 or may not be linked in the final executable, for example depending on
5781 configuration settings.
5782
5783 If a program references at run time an entity to which this pragma has been
5784 applied, and the corresponding symbol was not resolved at link time, then
5785 the execution of the program is erroneous. It is not erroneous to take the
5786 Address of such an entity, for example to guard potential references,
5787 as shown in the example below.
5788
5789 Some file formats do not support weak symbols so not all target machines
5790 support this pragma.
5791
5792 @smallexample @c ada
5793 --  Example of the use of pragma Weak_External
5794
5795 package External_Module is
5796   key : Integer;
5797   pragma Import (C, key);
5798   pragma Weak_External (key);
5799   function Present return boolean;
5800 end External_Module;
5801
5802 with System; use System;
5803 package body External_Module is
5804   function Present return boolean is
5805   begin
5806     return key'Address /= System.Null_Address;
5807   end Present;
5808 end External_Module;
5809 @end smallexample
5810
5811 @node Pragma Wide_Character_Encoding
5812 @unnumberedsec Pragma Wide_Character_Encoding
5813 @findex Wide_Character_Encoding
5814 @noindent
5815 Syntax:
5816
5817 @smallexample @c ada
5818 pragma Wide_Character_Encoding (IDENTIFIER | CHARACTER_LITERAL);
5819 @end smallexample
5820
5821 @noindent
5822 This pragma specifies the wide character encoding to be used in program
5823 source text appearing subsequently. It is a configuration pragma, but may
5824 also be used at any point that a pragma is allowed, and it is permissible
5825 to have more than one such pragma in a file, allowing multiple encodings
5826 to appear within the same file.
5827
5828 The argument can be an identifier or a character literal. In the identifier
5829 case, it is one of @code{HEX}, @code{UPPER}, @code{SHIFT_JIS},
5830 @code{EUC}, @code{UTF8}, or @code{BRACKETS}. In the character literal
5831 case it is correspondingly one of the characters @samp{h}, @samp{u},
5832 @samp{s}, @samp{e}, @samp{8}, or @samp{b}.
5833
5834 Note that when the pragma is used within a file, it affects only the
5835 encoding within that file, and does not affect withed units, specs,
5836 or subunits.
5837
5838 @node Implementation Defined Attributes
5839 @chapter Implementation Defined Attributes
5840 Ada defines (throughout the Ada reference manual,
5841 summarized in Annex K),
5842 a set of attributes that provide useful additional functionality in all
5843 areas of the language.  These language defined attributes are implemented
5844 in GNAT and work as described in the Ada Reference Manual.
5845
5846 In addition, Ada allows implementations to define additional
5847 attributes whose meaning is defined by the implementation.  GNAT provides
5848 a number of these implementation-dependent attributes which can be used
5849 to extend and enhance the functionality of the compiler.  This section of
5850 the GNAT reference manual describes these additional attributes.
5851
5852 Note that any program using these attributes may not be portable to
5853 other compilers (although GNAT implements this set of attributes on all
5854 platforms).  Therefore if portability to other compilers is an important
5855 consideration, you should minimize the use of these attributes.
5856
5857 @menu
5858 * Abort_Signal::
5859 * Address_Size::
5860 * Asm_Input::
5861 * Asm_Output::
5862 * AST_Entry::
5863 * Bit::
5864 * Bit_Position::
5865 * Compiler_Version::
5866 * Code_Address::
5867 * Default_Bit_Order::
5868 * Descriptor_Size::
5869 * Elaborated::
5870 * Elab_Body::
5871 * Elab_Spec::
5872 * Elab_Subp_Body::
5873 * Emax::
5874 * Enabled::
5875 * Enum_Rep::
5876 * Enum_Val::
5877 * Epsilon::
5878 * Fixed_Value::
5879 * Has_Access_Values::
5880 * Has_Discriminants::
5881 * Img::
5882 * Integer_Value::
5883 * Invalid_Value::
5884 * Large::
5885 * Machine_Size::
5886 * Mantissa::
5887 * Max_Interrupt_Priority::
5888 * Max_Priority::
5889 * Maximum_Alignment::
5890 * Mechanism_Code::
5891 * Null_Parameter::
5892 * Object_Size::
5893 * Old::
5894 * Passed_By_Reference::
5895 * Pool_Address::
5896 * Range_Length::
5897 * Ref::
5898 * Result::
5899 * Safe_Emax::
5900 * Safe_Large::
5901 * Simple_Storage_Pool::
5902 * Small::
5903 * Storage_Unit::
5904 * Stub_Type::
5905 * System_Allocator_Alignment::
5906 * Target_Name::
5907 * Tick::
5908 * To_Address::
5909 * Type_Class::
5910 * UET_Address::
5911 * Unconstrained_Array::
5912 * Universal_Literal_String::
5913 * Unrestricted_Access::
5914 * VADS_Size::
5915 * Value_Size::
5916 * Wchar_T_Size::
5917 * Word_Size::
5918 @end menu
5919
5920 @node Abort_Signal
5921 @unnumberedsec Abort_Signal
5922 @findex Abort_Signal
5923 @noindent
5924 @code{Standard'Abort_Signal} (@code{Standard} is the only allowed
5925 prefix) provides the entity for the special exception used to signal
5926 task abort or asynchronous transfer of control.  Normally this attribute
5927 should only be used in the tasking runtime (it is highly peculiar, and
5928 completely outside the normal semantics of Ada, for a user program to
5929 intercept the abort exception).
5930
5931 @node Address_Size
5932 @unnumberedsec Address_Size
5933 @cindex Size of @code{Address}
5934 @findex Address_Size
5935 @noindent
5936 @code{Standard'Address_Size} (@code{Standard} is the only allowed
5937 prefix) is a static constant giving the number of bits in an
5938 @code{Address}. It is the same value as System.Address'Size,
5939 but has the advantage of being static, while a direct
5940 reference to System.Address'Size is non-static because Address
5941 is a private type.
5942
5943 @node Asm_Input
5944 @unnumberedsec Asm_Input
5945 @findex Asm_Input
5946 @noindent
5947 The @code{Asm_Input} attribute denotes a function that takes two
5948 parameters.  The first is a string, the second is an expression of the
5949 type designated by the prefix.  The first (string) argument is required
5950 to be a static expression, and is the constraint for the parameter,
5951 (e.g.@: what kind of register is required).  The second argument is the
5952 value to be used as the input argument.  The possible values for the
5953 constant are the same as those used in the RTL, and are dependent on
5954 the configuration file used to built the GCC back end.
5955 @ref{Machine Code Insertions}
5956
5957 @node Asm_Output
5958 @unnumberedsec Asm_Output
5959 @findex Asm_Output
5960 @noindent
5961 The @code{Asm_Output} attribute denotes a function that takes two
5962 parameters.  The first is a string, the second is the name of a variable
5963 of the type designated by the attribute prefix.  The first (string)
5964 argument is required to be a static expression and designates the
5965 constraint for the parameter (e.g.@: what kind of register is
5966 required).  The second argument is the variable to be updated with the
5967 result.  The possible values for constraint are the same as those used in
5968 the RTL, and are dependent on the configuration file used to build the
5969 GCC back end.  If there are no output operands, then this argument may
5970 either be omitted, or explicitly given as @code{No_Output_Operands}.
5971 @ref{Machine Code Insertions}
5972
5973 @node AST_Entry
5974 @unnumberedsec AST_Entry
5975 @cindex OpenVMS
5976 @findex AST_Entry
5977 @noindent
5978 This attribute is implemented only in OpenVMS versions of GNAT@.  Applied to
5979 the name of an entry, it yields a value of the predefined type AST_Handler
5980 (declared in the predefined package System, as extended by the use of
5981 pragma @code{Extend_System (Aux_DEC)}).  This value enables the given entry to
5982 be called when an AST occurs.  For further details, refer to the @cite{DEC Ada
5983 Language Reference Manual}, section 9.12a.
5984
5985 @node Bit
5986 @unnumberedsec Bit
5987 @findex Bit
5988 @code{@var{obj}'Bit}, where @var{obj} is any object, yields the bit
5989 offset within the storage unit (byte) that contains the first bit of
5990 storage allocated for the object.  The value of this attribute is of the
5991 type @code{Universal_Integer}, and is always a non-negative number not
5992 exceeding the value of @code{System.Storage_Unit}.
5993
5994 For an object that is a variable or a constant allocated in a register,
5995 the value is zero.  (The use of this attribute does not force the
5996 allocation of a variable to memory).
5997
5998 For an object that is a formal parameter, this attribute applies
5999 to either the matching actual parameter or to a copy of the
6000 matching actual parameter.
6001
6002 For an access object the value is zero.  Note that
6003 @code{@var{obj}.all'Bit} is subject to an @code{Access_Check} for the
6004 designated object.  Similarly for a record component
6005 @code{@var{X}.@var{C}'Bit} is subject to a discriminant check and
6006 @code{@var{X}(@var{I}).Bit} and @code{@var{X}(@var{I1}..@var{I2})'Bit}
6007 are subject to index checks.
6008
6009 This attribute is designed to be compatible with the DEC Ada 83 definition
6010 and implementation of the @code{Bit} attribute.
6011
6012 @node Bit_Position
6013 @unnumberedsec Bit_Position
6014 @findex Bit_Position
6015 @noindent
6016 @code{@var{R.C}'Bit_Position}, where @var{R} is a record object and C is one
6017 of the fields of the record type, yields the bit
6018 offset within the record contains the first bit of
6019 storage allocated for the object.  The value of this attribute is of the
6020 type @code{Universal_Integer}.  The value depends only on the field
6021 @var{C} and is independent of the alignment of
6022 the containing record @var{R}.
6023
6024 @node Compiler_Version
6025 @unnumberedsec Compiler_Version
6026 @findex Compiler_Version
6027 @noindent
6028 @code{Standard'Compiler_Version} (@code{Standard} is the only allowed
6029 prefix) yields a static string identifying the version of the compiler
6030 being used to compile the unit containing the attribute reference. A
6031 typical result would be something like "@value{EDITION} @i{version} (20090221)".
6032
6033 @node Code_Address
6034 @unnumberedsec Code_Address
6035 @findex Code_Address
6036 @cindex Subprogram address
6037 @cindex Address of subprogram code
6038 @noindent
6039 The @code{'Address}
6040 attribute may be applied to subprograms in Ada 95 and Ada 2005, but the
6041 intended effect seems to be to provide
6042 an address value which can be used to call the subprogram by means of
6043 an address clause as in the following example:
6044
6045 @smallexample @c ada
6046 procedure K is @dots{}
6047
6048 procedure L;
6049 for L'Address use K'Address;
6050 pragma Import (Ada, L);
6051 @end smallexample
6052
6053 @noindent
6054 A call to @code{L} is then expected to result in a call to @code{K}@.
6055 In Ada 83, where there were no access-to-subprogram values, this was
6056 a common work-around for getting the effect of an indirect call.
6057 GNAT implements the above use of @code{Address} and the technique
6058 illustrated by the example code works correctly.
6059
6060 However, for some purposes, it is useful to have the address of the start
6061 of the generated code for the subprogram.  On some architectures, this is
6062 not necessarily the same as the @code{Address} value described above.
6063 For example, the @code{Address} value may reference a subprogram
6064 descriptor rather than the subprogram itself.
6065
6066 The @code{'Code_Address} attribute, which can only be applied to
6067 subprogram entities, always returns the address of the start of the
6068 generated code of the specified subprogram, which may or may not be
6069 the same value as is returned by the corresponding @code{'Address}
6070 attribute.
6071
6072 @node Default_Bit_Order
6073 @unnumberedsec Default_Bit_Order
6074 @cindex Big endian
6075 @cindex Little endian
6076 @findex Default_Bit_Order
6077 @noindent
6078 @code{Standard'Default_Bit_Order} (@code{Standard} is the only
6079 permissible prefix), provides the value @code{System.Default_Bit_Order}
6080 as a @code{Pos} value (0 for @code{High_Order_First}, 1 for
6081 @code{Low_Order_First}).  This is used to construct the definition of
6082 @code{Default_Bit_Order} in package @code{System}.
6083
6084 @node Descriptor_Size
6085 @unnumberedsec Descriptor_Size
6086 @cindex Descriptor
6087 @cindex Dope vector
6088 @findex Descriptor_Size
6089 @noindent
6090 Non-static attribute @code{Descriptor_Size} returns the size in bits of the
6091 descriptor allocated for a type.  The result is non-zero only for unconstrained
6092 array types and the returned value is of type universal integer.  In GNAT, an
6093 array descriptor contains bounds information and is located immediately before
6094 the first element of the array.
6095
6096 @smallexample @c ada
6097 type Unconstr_Array is array (Positive range <>) of Boolean;
6098 Put_Line ("Descriptor size = " & Unconstr_Array'Descriptor_Size'Img);
6099 @end smallexample
6100
6101 @noindent
6102 The attribute takes into account any additional padding due to type alignment.
6103 In the example above, the descriptor contains two values of type
6104 @code{Positive} representing the low and high bound.  Since @code{Positive} has
6105 a size of 31 bits and an alignment of 4, the descriptor size is @code{2 *
6106 Positive'Size + 2} or 64 bits.
6107
6108 @node Elaborated
6109 @unnumberedsec Elaborated
6110 @findex Elaborated
6111 @noindent
6112 The prefix of the @code{'Elaborated} attribute must be a unit name.  The
6113 value is a Boolean which indicates whether or not the given unit has been
6114 elaborated.  This attribute is primarily intended for internal use by the
6115 generated code for dynamic elaboration checking, but it can also be used
6116 in user programs.  The value will always be True once elaboration of all
6117 units has been completed.  An exception is for units which need no
6118 elaboration, the value is always False for such units.
6119
6120 @node Elab_Body
6121 @unnumberedsec Elab_Body
6122 @findex Elab_Body
6123 @noindent
6124 This attribute can only be applied to a program unit name.  It returns
6125 the entity for the corresponding elaboration procedure for elaborating
6126 the body of the referenced unit.  This is used in the main generated
6127 elaboration procedure by the binder and is not normally used in any
6128 other context.  However, there may be specialized situations in which it
6129 is useful to be able to call this elaboration procedure from Ada code,
6130 e.g.@: if it is necessary to do selective re-elaboration to fix some
6131 error.
6132
6133 @node Elab_Spec
6134 @unnumberedsec Elab_Spec
6135 @findex Elab_Spec
6136 @noindent
6137 This attribute can only be applied to a program unit name.  It returns
6138 the entity for the corresponding elaboration procedure for elaborating
6139 the spec of the referenced unit.  This is used in the main
6140 generated elaboration procedure by the binder and is not normally used
6141 in any other context.  However, there may be specialized situations in
6142 which it is useful to be able to call this elaboration procedure from
6143 Ada code, e.g.@: if it is necessary to do selective re-elaboration to fix
6144 some error.
6145
6146 @node Elab_Subp_Body
6147 @unnumberedsec Elab_Subp_Body
6148 @findex Elab_Subp_Body
6149 @noindent
6150 This attribute can only be applied to a library level subprogram
6151 name and is only allowed in CodePeer mode. It returns the entity
6152 for the corresponding elaboration procedure for elaborating the body
6153 of the referenced subprogram unit. This is used in the main generated
6154 elaboration procedure by the binder in CodePeer mode only and is unrecognized
6155 otherwise.
6156
6157 @node Emax
6158 @unnumberedsec Emax
6159 @cindex Ada 83 attributes
6160 @findex Emax
6161 @noindent
6162 The @code{Emax} attribute is provided for compatibility with Ada 83.  See
6163 the Ada 83 reference manual for an exact description of the semantics of
6164 this attribute.
6165
6166 @node Enabled
6167 @unnumberedsec Enabled
6168 @findex Enabled
6169 @noindent
6170 The @code{Enabled} attribute allows an application program to check at compile
6171 time to see if the designated check is currently enabled. The prefix is a
6172 simple identifier, referencing any predefined check name (other than
6173 @code{All_Checks}) or a check name introduced by pragma Check_Name. If
6174 no argument is given for the attribute, the check is for the general state
6175 of the check, if an argument is given, then it is an entity name, and the
6176 check indicates whether an @code{Suppress} or @code{Unsuppress} has been
6177 given naming the entity (if not, then the argument is ignored).
6178
6179 Note that instantiations inherit the check status at the point of the
6180 instantiation, so a useful idiom is to have a library package that
6181 introduces a check name with @code{pragma Check_Name}, and then contains
6182 generic packages or subprograms which use the @code{Enabled} attribute
6183 to see if the check is enabled. A user of this package can then issue
6184 a @code{pragma Suppress} or @code{pragma Unsuppress} before instantiating
6185 the package or subprogram, controlling whether the check will be present.
6186
6187 @node Enum_Rep
6188 @unnumberedsec Enum_Rep
6189 @cindex Representation of enums
6190 @findex Enum_Rep
6191 @noindent
6192 For every enumeration subtype @var{S}, @code{@var{S}'Enum_Rep} denotes a
6193 function with the following spec:
6194
6195 @smallexample @c ada
6196 function @var{S}'Enum_Rep (Arg : @var{S}'Base)
6197   return @i{Universal_Integer};
6198 @end smallexample
6199
6200 @noindent
6201 It is also allowable to apply @code{Enum_Rep} directly to an object of an
6202 enumeration type or to a non-overloaded enumeration
6203 literal.  In this case @code{@var{S}'Enum_Rep} is equivalent to
6204 @code{@var{typ}'Enum_Rep(@var{S})} where @var{typ} is the type of the
6205 enumeration literal or object.
6206
6207 The function returns the representation value for the given enumeration
6208 value.  This will be equal to value of the @code{Pos} attribute in the
6209 absence of an enumeration representation clause.  This is a static
6210 attribute (i.e.@: the result is static if the argument is static).
6211
6212 @code{@var{S}'Enum_Rep} can also be used with integer types and objects,
6213 in which case it simply returns the integer value.  The reason for this
6214 is to allow it to be used for @code{(<>)} discrete formal arguments in
6215 a generic unit that can be instantiated with either enumeration types
6216 or integer types.  Note that if @code{Enum_Rep} is used on a modular
6217 type whose upper bound exceeds the upper bound of the largest signed
6218 integer type, and the argument is a variable, so that the universal
6219 integer calculation is done at run time, then the call to @code{Enum_Rep}
6220 may raise @code{Constraint_Error}.
6221
6222 @node Enum_Val
6223 @unnumberedsec Enum_Val
6224 @cindex Representation of enums
6225 @findex Enum_Val
6226 @noindent
6227 For every enumeration subtype @var{S}, @code{@var{S}'Enum_Val} denotes a
6228 function with the following spec:
6229
6230 @smallexample @c ada
6231 function @var{S}'Enum_Val (Arg : @i{Universal_Integer)
6232   return @var{S}'Base};
6233 @end smallexample
6234
6235 @noindent
6236 The function returns the enumeration value whose representation matches the
6237 argument, or raises Constraint_Error if no enumeration literal of the type
6238 has the matching value.
6239 This will be equal to value of the @code{Val} attribute in the
6240 absence of an enumeration representation clause.  This is a static
6241 attribute (i.e.@: the result is static if the argument is static).
6242
6243 @node Epsilon
6244 @unnumberedsec Epsilon
6245 @cindex Ada 83 attributes
6246 @findex Epsilon
6247 @noindent
6248 The @code{Epsilon} attribute is provided for compatibility with Ada 83.  See
6249 the Ada 83 reference manual for an exact description of the semantics of
6250 this attribute.
6251
6252 @node Fixed_Value
6253 @unnumberedsec Fixed_Value
6254 @findex Fixed_Value
6255 @noindent
6256 For every fixed-point type @var{S}, @code{@var{S}'Fixed_Value} denotes a
6257 function with the following specification:
6258
6259 @smallexample @c ada
6260 function @var{S}'Fixed_Value (Arg : @i{Universal_Integer})
6261   return @var{S};
6262 @end smallexample
6263
6264 @noindent
6265 The value returned is the fixed-point value @var{V} such that
6266
6267 @smallexample @c ada
6268 @var{V} = Arg * @var{S}'Small
6269 @end smallexample
6270
6271 @noindent
6272 The effect is thus similar to first converting the argument to the
6273 integer type used to represent @var{S}, and then doing an unchecked
6274 conversion to the fixed-point type.  The difference is
6275 that there are full range checks, to ensure that the result is in range.
6276 This attribute is primarily intended for use in implementation of the
6277 input-output functions for fixed-point values.
6278
6279 @node Has_Access_Values
6280 @unnumberedsec Has_Access_Values
6281 @cindex Access values, testing for
6282 @findex Has_Access_Values
6283 @noindent
6284 The prefix of the @code{Has_Access_Values} attribute is a type.  The result
6285 is a Boolean value which is True if the is an access type, or is a composite
6286 type with a component (at any nesting depth) that is an access type, and is
6287 False otherwise.
6288 The intended use of this attribute is in conjunction with generic
6289 definitions.  If the attribute is applied to a generic private type, it
6290 indicates whether or not the corresponding actual type has access values.
6291
6292 @node Has_Discriminants
6293 @unnumberedsec Has_Discriminants
6294 @cindex Discriminants, testing for
6295 @findex Has_Discriminants
6296 @noindent
6297 The prefix of the @code{Has_Discriminants} attribute is a type.  The result
6298 is a Boolean value which is True if the type has discriminants, and False
6299 otherwise.  The intended use of this attribute is in conjunction with generic
6300 definitions.  If the attribute is applied to a generic private type, it
6301 indicates whether or not the corresponding actual type has discriminants.
6302
6303 @node Img
6304 @unnumberedsec Img
6305 @findex Img
6306 @noindent
6307 The @code{Img} attribute differs from @code{Image} in that it may be
6308 applied to objects as well as types, in which case it gives the
6309 @code{Image} for the subtype of the object.  This is convenient for
6310 debugging:
6311
6312 @smallexample @c ada
6313 Put_Line ("X = " & X'Img);
6314 @end smallexample
6315
6316 @noindent
6317 has the same meaning as the more verbose:
6318
6319 @smallexample @c ada
6320 Put_Line ("X = " & @var{T}'Image (X));
6321 @end smallexample
6322
6323 @noindent
6324 where @var{T} is the (sub)type of the object @code{X}.
6325
6326 @node Integer_Value
6327 @unnumberedsec Integer_Value
6328 @findex Integer_Value
6329 @noindent
6330 For every integer type @var{S}, @code{@var{S}'Integer_Value} denotes a
6331 function with the following spec:
6332
6333 @smallexample @c ada
6334 function @var{S}'Integer_Value (Arg : @i{Universal_Fixed})
6335   return @var{S};
6336 @end smallexample
6337
6338 @noindent
6339 The value returned is the integer value @var{V}, such that
6340
6341 @smallexample @c ada
6342 Arg = @var{V} * @var{T}'Small
6343 @end smallexample
6344
6345 @noindent
6346 where @var{T} is the type of @code{Arg}.
6347 The effect is thus similar to first doing an unchecked conversion from
6348 the fixed-point type to its corresponding implementation type, and then
6349 converting the result to the target integer type.  The difference is
6350 that there are full range checks, to ensure that the result is in range.
6351 This attribute is primarily intended for use in implementation of the
6352 standard input-output functions for fixed-point values.
6353
6354 @node Invalid_Value
6355 @unnumberedsec Invalid_Value
6356 @findex Invalid_Value
6357 @noindent
6358 For every scalar type S, S'Invalid_Value returns an undefined value of the
6359 type. If possible this value is an invalid representation for the type. The
6360 value returned is identical to the value used to initialize an otherwise
6361 uninitialized value of the type if pragma Initialize_Scalars is used,
6362 including the ability to modify the value with the binder -Sxx flag and
6363 relevant environment variables at run time.
6364
6365 @node Large
6366 @unnumberedsec Large
6367 @cindex Ada 83 attributes
6368 @findex Large
6369 @noindent
6370 The @code{Large} attribute is provided for compatibility with Ada 83.  See
6371 the Ada 83 reference manual for an exact description of the semantics of
6372 this attribute.
6373
6374 @node Machine_Size
6375 @unnumberedsec Machine_Size
6376 @findex Machine_Size
6377 @noindent
6378 This attribute is identical to the @code{Object_Size} attribute.  It is
6379 provided for compatibility with the DEC Ada 83 attribute of this name.
6380
6381 @node Mantissa
6382 @unnumberedsec Mantissa
6383 @cindex Ada 83 attributes
6384 @findex Mantissa
6385 @noindent
6386 The @code{Mantissa} attribute is provided for compatibility with Ada 83.  See
6387 the Ada 83 reference manual for an exact description of the semantics of
6388 this attribute.
6389
6390 @node Max_Interrupt_Priority
6391 @unnumberedsec Max_Interrupt_Priority
6392 @cindex Interrupt priority, maximum
6393 @findex Max_Interrupt_Priority
6394 @noindent
6395 @code{Standard'Max_Interrupt_Priority} (@code{Standard} is the only
6396 permissible prefix), provides the same value as
6397 @code{System.Max_Interrupt_Priority}.
6398
6399 @node Max_Priority
6400 @unnumberedsec Max_Priority
6401 @cindex Priority, maximum
6402 @findex Max_Priority
6403 @noindent
6404 @code{Standard'Max_Priority} (@code{Standard} is the only permissible
6405 prefix) provides the same value as @code{System.Max_Priority}.
6406
6407 @node Maximum_Alignment
6408 @unnumberedsec Maximum_Alignment
6409 @cindex Alignment, maximum
6410 @findex Maximum_Alignment
6411 @noindent
6412 @code{Standard'Maximum_Alignment} (@code{Standard} is the only
6413 permissible prefix) provides the maximum useful alignment value for the
6414 target.  This is a static value that can be used to specify the alignment
6415 for an object, guaranteeing that it is properly aligned in all
6416 cases.
6417
6418 @node Mechanism_Code
6419 @unnumberedsec Mechanism_Code
6420 @cindex Return values, passing mechanism
6421 @cindex Parameters, passing mechanism
6422 @findex Mechanism_Code
6423 @noindent
6424 @code{@var{function}'Mechanism_Code} yields an integer code for the
6425 mechanism used for the result of function, and
6426 @code{@var{subprogram}'Mechanism_Code (@var{n})} yields the mechanism
6427 used for formal parameter number @var{n} (a static integer value with 1
6428 meaning the first parameter) of @var{subprogram}.  The code returned is:
6429
6430 @table @asis
6431 @item 1
6432 by copy (value)
6433 @item 2
6434 by reference
6435 @item 3
6436 by descriptor (default descriptor class)
6437 @item 4
6438 by descriptor (UBS: unaligned bit string)
6439 @item 5
6440 by descriptor (UBSB: aligned bit string with arbitrary bounds)
6441 @item 6
6442 by descriptor (UBA: unaligned bit array)
6443 @item 7
6444 by descriptor (S: string, also scalar access type parameter)
6445 @item 8
6446 by descriptor (SB: string with arbitrary bounds)
6447 @item 9
6448 by descriptor (A: contiguous array)
6449 @item 10
6450 by descriptor (NCA: non-contiguous array)
6451 @end table
6452
6453 @noindent
6454 Values from 3 through 10 are only relevant to Digital OpenVMS implementations.
6455 @cindex OpenVMS
6456
6457 @node Null_Parameter
6458 @unnumberedsec Null_Parameter
6459 @cindex Zero address, passing
6460 @findex Null_Parameter
6461 @noindent
6462 A reference @code{@var{T}'Null_Parameter} denotes an imaginary object of
6463 type or subtype @var{T} allocated at machine address zero.  The attribute
6464 is allowed only as the default expression of a formal parameter, or as
6465 an actual expression of a subprogram call.  In either case, the
6466 subprogram must be imported.
6467
6468 The identity of the object is represented by the address zero in the
6469 argument list, independent of the passing mechanism (explicit or
6470 default).
6471
6472 This capability is needed to specify that a zero address should be
6473 passed for a record or other composite object passed by reference.
6474 There is no way of indicating this without the @code{Null_Parameter}
6475 attribute.
6476
6477 @node Object_Size
6478 @unnumberedsec Object_Size
6479 @cindex Size, used for objects
6480 @findex Object_Size
6481 @noindent
6482 The size of an object is not necessarily the same as the size of the type
6483 of an object.  This is because by default object sizes are increased to be
6484 a multiple of the alignment of the object.  For example,
6485 @code{Natural'Size} is
6486 31, but by default objects of type @code{Natural} will have a size of 32 bits.
6487 Similarly, a record containing an integer and a character:
6488
6489 @smallexample @c ada
6490 type Rec is record
6491    I : Integer;
6492    C : Character;
6493 end record;
6494 @end smallexample
6495
6496 @noindent
6497 will have a size of 40 (that is @code{Rec'Size} will be 40).  The
6498 alignment will be 4, because of the
6499 integer field, and so the default size of record objects for this type
6500 will be 64 (8 bytes).
6501
6502 @node Old
6503 @unnumberedsec Old
6504 @cindex Capturing Old values
6505 @cindex Postconditions
6506 @noindent
6507 The attribute Prefix'Old can be used within a
6508 subprogram body or within a precondition or
6509 postcondition pragma. The effect is to
6510 refer to the value of the prefix on entry. So for
6511 example if you have an argument of a record type X called Arg1,
6512 you can refer to Arg1.Field'Old which yields the value of
6513 Arg1.Field on entry. The implementation simply involves generating
6514 an object declaration which captures the value on entry.
6515 The prefix must denote an object of a nonlimited type (since limited types
6516 cannot be copied to capture their values) and it must not reference a local
6517 variable (since local variables do not exist at subprogram entry time). Note
6518 that the variable introduced by a quantified expression is a local variable.
6519 The following example shows the use of 'Old to implement
6520 a test of a postcondition:
6521
6522 @smallexample @c ada
6523 with Old_Pkg;
6524 procedure Old is
6525 begin
6526    Old_Pkg.Incr;
6527 end Old;
6528
6529 package Old_Pkg is
6530    procedure Incr;
6531 end Old_Pkg;
6532
6533 package body Old_Pkg is
6534    Count : Natural := 0;
6535
6536    procedure Incr is
6537    begin
6538       ... code manipulating the value of Count
6539
6540       pragma Assert (Count = Count'Old + 1);
6541    end Incr;
6542 end Old_Pkg;
6543 @end smallexample
6544
6545 @noindent
6546 Note that it is allowed to apply 'Old to a constant entity, but this will
6547 result in a warning, since the old and new values will always be the same.
6548
6549 @node Passed_By_Reference
6550 @unnumberedsec Passed_By_Reference
6551 @cindex Parameters, when passed by reference
6552 @findex Passed_By_Reference
6553 @noindent
6554 @code{@var{type}'Passed_By_Reference} for any subtype @var{type} returns
6555 a value of type @code{Boolean} value that is @code{True} if the type is
6556 normally passed by reference and @code{False} if the type is normally
6557 passed by copy in calls.  For scalar types, the result is always @code{False}
6558 and is static.  For non-scalar types, the result is non-static.
6559
6560 @node Pool_Address
6561 @unnumberedsec Pool_Address
6562 @cindex Parameters, when passed by reference
6563 @findex Pool_Address
6564 @noindent
6565 @code{@var{X}'Pool_Address} for any object @var{X} returns the address
6566 of X within its storage pool. This is the same as
6567 @code{@var{X}'Address}, except that for an unconstrained array whose
6568 bounds are allocated just before the first component,
6569 @code{@var{X}'Pool_Address} returns the address of those bounds,
6570 whereas @code{@var{X}'Address} returns the address of the first
6571 component.
6572
6573 Here, we are interpreting ``storage pool'' broadly to mean ``wherever
6574 the object is allocated'', which could be a user-defined storage pool,
6575 the global heap, on the stack, or in a static memory area. For an
6576 object created by @code{new}, @code{@var{Ptr.all}'Pool_Address} is
6577 what is passed to @code{Allocate} and returned from @code{Deallocate}.
6578
6579 @node Range_Length
6580 @unnumberedsec Range_Length
6581 @findex Range_Length
6582 @noindent
6583 @code{@var{type}'Range_Length} for any discrete type @var{type} yields
6584 the number of values represented by the subtype (zero for a null
6585 range).  The result is static for static subtypes.  @code{Range_Length}
6586 applied to the index subtype of a one dimensional array always gives the
6587 same result as @code{Range} applied to the array itself.
6588
6589 @node Ref
6590 @unnumberedsec Ref
6591 @findex Ref
6592 @noindent
6593 The @code{System.Address'Ref}
6594 (@code{System.Address} is the only permissible prefix)
6595 denotes a function identical to
6596 @code{System.Storage_Elements.To_Address} except that
6597 it is a static attribute.  See @ref{To_Address} for more details.
6598
6599 @node Result
6600 @unnumberedsec Result
6601 @findex Result
6602 @noindent
6603 @code{@var{function}'Result} can only be used with in a Postcondition pragma
6604 for a function. The prefix must be the name of the corresponding function. This
6605 is used to refer to the result of the function in the postcondition expression.
6606 For a further discussion of the use of this attribute and examples of its use,
6607 see the description of pragma Postcondition.
6608
6609 @node Safe_Emax
6610 @unnumberedsec Safe_Emax
6611 @cindex Ada 83 attributes
6612 @findex Safe_Emax
6613 @noindent
6614 The @code{Safe_Emax} attribute is provided for compatibility with Ada 83.  See
6615 the Ada 83 reference manual for an exact description of the semantics of
6616 this attribute.
6617
6618 @node Safe_Large
6619 @unnumberedsec Safe_Large
6620 @cindex Ada 83 attributes
6621 @findex Safe_Large
6622 @noindent
6623 The @code{Safe_Large} attribute is provided for compatibility with Ada 83.  See
6624 the Ada 83 reference manual for an exact description of the semantics of
6625 this attribute.
6626
6627 @node Simple_Storage_Pool
6628 @unnumberedsec Simple_Storage_Pool
6629 @cindex Storage pool, simple
6630 @cindex Simple storage pool
6631 @findex Simple_Storage_Pool
6632 @noindent
6633 For every nonformal, nonderived access-to-object type @var{Acc}, the
6634 representation attribute @code{Simple_Storage_Pool} may be specified
6635 via an attribute_definition_clause (or by specifying the equivalent aspect):
6636
6637 @smallexample @c ada
6638
6639 My_Pool : My_Simple_Storage_Pool_Type;
6640
6641 type Acc is access My_Data_Type;
6642
6643 for Acc'Simple_Storage_Pool use My_Pool;
6644
6645 @end smallexample
6646
6647 @noindent
6648 The name given in an attribute_definition_clause for the
6649 @code{Simple_Storage_Pool} attribute shall denote a variable of
6650 a ``simple storage pool type'' (see pragma @code{Simple_Storage_Pool_Type}).
6651
6652 The use of this attribute is only allowed for a prefix denoting a type
6653 for which it has been specified. The type of the attribute is the type
6654 of the variable specified as the simple storage pool of the access type,
6655 and the attribute denotes that variable.
6656
6657 It is illegal to specify both @code{Storage_Pool} and @code{Simple_Storage_Pool}
6658 for the same access type.
6659
6660 If the @code{Simple_Storage_Pool} attribute has been specified for an access
6661 type, then applying the @code{Storage_Pool} attribute to the type is flagged
6662 with a warning and its evaluation raises the exception @code{Program_Error}.
6663
6664 If the Simple_Storage_Pool attribute has been specified for an access
6665 type @var{S}, then the evaluation of the attribute @code{@var{S}'Storage_Size}
6666 returns the result of calling @code{Storage_Size (@var{S}'Simple_Storage_Pool)},
6667 which is intended to indicate the number of storage elements reserved for
6668 the simple storage pool. If the Storage_Size function has not been defined
6669 for the simple storage pool type, then this attribute returns zero.
6670
6671 If an access type @var{S} has a specified simple storage pool of type
6672 @var{SSP}, then the evaluation of an allocator for that access type calls
6673 the primitive @code{Allocate} procedure for type @var{SSP}, passing
6674 @code{@var{S}'Simple_Storage_Pool} as the pool parameter. The detailed
6675 semantics of such allocators is the same as those defined for allocators
6676 in section 13.11 of the Ada Reference Manual, with the term
6677 ``simple storage pool'' substituted for ``storage pool''.
6678
6679 If an access type @var{S} has a specified simple storage pool of type
6680 @var{SSP}, then a call to an instance of the @code{Ada.Unchecked_Deallocation}
6681 for that access type invokes the primitive @code{Deallocate} procedure
6682 for type @var{SSP}, passing @code{@var{S}'Simple_Storage_Pool} as the pool
6683 parameter. The detailed semantics of such unchecked deallocations is the same
6684 as defined in section 13.11.2 of the Ada Reference Manual, except that the
6685 term ``simple storage pool'' is substituted for ``storage pool''.
6686
6687 @node Small
6688 @unnumberedsec Small
6689 @cindex Ada 83 attributes
6690 @findex Small
6691 @noindent
6692 The @code{Small} attribute is defined in Ada 95 (and Ada 2005) only for
6693 fixed-point types.
6694 GNAT also allows this attribute to be applied to floating-point types
6695 for compatibility with Ada 83.  See
6696 the Ada 83 reference manual for an exact description of the semantics of
6697 this attribute when applied to floating-point types.
6698
6699 @node Storage_Unit
6700 @unnumberedsec Storage_Unit
6701 @findex Storage_Unit
6702 @noindent
6703 @code{Standard'Storage_Unit} (@code{Standard} is the only permissible
6704 prefix) provides the same value as @code{System.Storage_Unit}.
6705
6706 @node Stub_Type
6707 @unnumberedsec Stub_Type
6708 @findex Stub_Type
6709 @noindent
6710 The GNAT implementation of remote access-to-classwide types is
6711 organized as described in AARM section E.4 (20.t): a value of an RACW type
6712 (designating a remote object) is represented as a normal access
6713 value, pointing to a "stub" object which in turn contains the
6714 necessary information to contact the designated remote object. A
6715 call on any dispatching operation of such a stub object does the
6716 remote call, if necessary, using the information in the stub object
6717 to locate the target partition, etc.
6718
6719 For a prefix @code{T} that denotes a remote access-to-classwide type,
6720 @code{T'Stub_Type} denotes the type of the corresponding stub objects.
6721
6722 By construction, the layout of @code{T'Stub_Type} is identical to that of
6723 type @code{RACW_Stub_Type} declared in the internal implementation-defined
6724 unit @code{System.Partition_Interface}. Use of this attribute will create
6725 an implicit dependency on this unit.
6726
6727 @node System_Allocator_Alignment
6728 @unnumberedsec System_Allocator_Alignment
6729 @cindex Alignment, allocator
6730 @findex System_Allocator_Alignment
6731 @noindent
6732 @code{Standard'System_Allocator_Alignment} (@code{Standard} is the only
6733 permissible prefix) provides the observable guaranted to be honored by
6734 the system allocator (malloc). This is a static value that can be used
6735 in user storage pools based on malloc either to reject allocation
6736 with alignment too large or to enable a realignment circuitry if the
6737 alignment request is larger than this value.
6738
6739 @node Target_Name
6740 @unnumberedsec Target_Name
6741 @findex Target_Name
6742 @noindent
6743 @code{Standard'Target_Name} (@code{Standard} is the only permissible
6744 prefix) provides a static string value that identifies the target
6745 for the current compilation. For GCC implementations, this is the
6746 standard gcc target name without the terminating slash (for
6747 example, GNAT 5.0 on windows yields "i586-pc-mingw32msv").
6748
6749 @node Tick
6750 @unnumberedsec Tick
6751 @findex Tick
6752 @noindent
6753 @code{Standard'Tick} (@code{Standard} is the only permissible prefix)
6754 provides the same value as @code{System.Tick},
6755
6756 @node To_Address
6757 @unnumberedsec To_Address
6758 @findex To_Address
6759 @noindent
6760 The @code{System'To_Address}
6761 (@code{System} is the only permissible prefix)
6762 denotes a function identical to
6763 @code{System.Storage_Elements.To_Address} except that
6764 it is a static attribute.  This means that if its argument is
6765 a static expression, then the result of the attribute is a
6766 static expression.  The result is that such an expression can be
6767 used in contexts (e.g.@: preelaborable packages) which require a
6768 static expression and where the function call could not be used
6769 (since the function call is always non-static, even if its
6770 argument is static).
6771
6772 @node Type_Class
6773 @unnumberedsec Type_Class
6774 @findex Type_Class
6775 @noindent
6776 @code{@var{type}'Type_Class} for any type or subtype @var{type} yields
6777 the value of the type class for the full type of @var{type}.  If
6778 @var{type} is a generic formal type, the value is the value for the
6779 corresponding actual subtype.  The value of this attribute is of type
6780 @code{System.Aux_DEC.Type_Class}, which has the following definition:
6781
6782 @smallexample @c ada
6783   type Type_Class is
6784     (Type_Class_Enumeration,
6785      Type_Class_Integer,
6786      Type_Class_Fixed_Point,
6787      Type_Class_Floating_Point,
6788      Type_Class_Array,
6789      Type_Class_Record,
6790      Type_Class_Access,
6791      Type_Class_Task,
6792      Type_Class_Address);
6793 @end smallexample
6794
6795 @noindent
6796 Protected types yield the value @code{Type_Class_Task}, which thus
6797 applies to all concurrent types.  This attribute is designed to
6798 be compatible with the DEC Ada 83 attribute of the same name.
6799
6800 @node UET_Address
6801 @unnumberedsec UET_Address
6802 @findex UET_Address
6803 @noindent
6804 The @code{UET_Address} attribute can only be used for a prefix which
6805 denotes a library package.  It yields the address of the unit exception
6806 table when zero cost exception handling is used.  This attribute is
6807 intended only for use within the GNAT implementation.  See the unit
6808 @code{Ada.Exceptions} in files @file{a-except.ads} and @file{a-except.adb}
6809 for details on how this attribute is used in the implementation.
6810
6811 @node Unconstrained_Array
6812 @unnumberedsec Unconstrained_Array
6813 @findex Unconstrained_Array
6814 @noindent
6815 The @code{Unconstrained_Array} attribute can be used with a prefix that
6816 denotes any type or subtype. It is a static attribute that yields
6817 @code{True} if the prefix designates an unconstrained array,
6818 and @code{False} otherwise. In a generic instance, the result is
6819 still static, and yields the result of applying this test to the
6820 generic actual.
6821
6822 @node Universal_Literal_String
6823 @unnumberedsec Universal_Literal_String
6824 @cindex Named numbers, representation of
6825 @findex Universal_Literal_String
6826 @noindent
6827 The prefix of @code{Universal_Literal_String} must be a named
6828 number.  The static result is the string consisting of the characters of
6829 the number as defined in the original source.  This allows the user
6830 program to access the actual text of named numbers without intermediate
6831 conversions and without the need to enclose the strings in quotes (which
6832 would preclude their use as numbers).
6833
6834 For example, the following program prints the first 50 digits of pi:
6835
6836 @smallexample @c ada
6837 with Text_IO; use Text_IO;
6838 with Ada.Numerics;
6839 procedure Pi is
6840 begin
6841    Put (Ada.Numerics.Pi'Universal_Literal_String);
6842 end;
6843 @end smallexample
6844
6845 @node Unrestricted_Access
6846 @unnumberedsec Unrestricted_Access
6847 @cindex @code{Access}, unrestricted
6848 @findex Unrestricted_Access
6849 @noindent
6850 The @code{Unrestricted_Access} attribute is similar to @code{Access}
6851 except that all accessibility and aliased view checks are omitted.  This
6852 is a user-beware attribute.  It is similar to
6853 @code{Address}, for which it is a desirable replacement where the value
6854 desired is an access type.  In other words, its effect is identical to
6855 first applying the @code{Address} attribute and then doing an unchecked
6856 conversion to a desired access type.  In GNAT, but not necessarily in
6857 other implementations, the use of static chains for inner level
6858 subprograms means that @code{Unrestricted_Access} applied to a
6859 subprogram yields a value that can be called as long as the subprogram
6860 is in scope (normal Ada accessibility rules restrict this usage).
6861
6862 It is possible to use @code{Unrestricted_Access} for any type, but care
6863 must be exercised if it is used to create pointers to unconstrained
6864 objects. In this case, the resulting pointer has the same scope as the
6865 context of the attribute, and may not be returned to some enclosing
6866 scope. For instance, a function cannot use @code{Unrestricted_Access}
6867 to create a unconstrained pointer and then return that value to the
6868 caller.
6869
6870 @node VADS_Size
6871 @unnumberedsec VADS_Size
6872 @cindex @code{Size}, VADS compatibility
6873 @findex VADS_Size
6874 @noindent
6875 The @code{'VADS_Size} attribute is intended to make it easier to port
6876 legacy code which relies on the semantics of @code{'Size} as implemented
6877 by the VADS Ada 83 compiler.  GNAT makes a best effort at duplicating the
6878 same semantic interpretation.  In particular, @code{'VADS_Size} applied
6879 to a predefined or other primitive type with no Size clause yields the
6880 Object_Size (for example, @code{Natural'Size} is 32 rather than 31 on
6881 typical machines).  In addition @code{'VADS_Size} applied to an object
6882 gives the result that would be obtained by applying the attribute to
6883 the corresponding type.
6884
6885 @node Value_Size
6886 @unnumberedsec Value_Size
6887 @cindex @code{Size}, setting for not-first subtype
6888 @findex Value_Size
6889 @code{@var{type}'Value_Size} is the number of bits required to represent
6890 a value of the given subtype.  It is the same as @code{@var{type}'Size},
6891 but, unlike @code{Size}, may be set for non-first subtypes.
6892
6893 @node Wchar_T_Size
6894 @unnumberedsec Wchar_T_Size
6895 @findex Wchar_T_Size
6896 @code{Standard'Wchar_T_Size} (@code{Standard} is the only permissible
6897 prefix) provides the size in bits of the C @code{wchar_t} type
6898 primarily for constructing the definition of this type in
6899 package @code{Interfaces.C}.
6900
6901 @node Word_Size
6902 @unnumberedsec Word_Size
6903 @findex Word_Size
6904 @code{Standard'Word_Size} (@code{Standard} is the only permissible
6905 prefix) provides the value @code{System.Word_Size}.
6906
6907 @node Implementation Defined Restrictions
6908 @chapter Implementation Defined Restrictions
6909
6910 @noindent
6911 All RM defined Restriction identifiers are implemented:
6912
6913 @itemize @bullet
6914 @item language-defined restrictions (see 13.12.1)
6915 @item tasking restrictions (see D.7)
6916 @item high integrity restrictions (see H.4)
6917 @end itemize
6918
6919 @noindent
6920 GNAT implements additional restriction identifiers. All restrictions, whether
6921 language defined or GNAT-specific, are listed in the following.
6922
6923 @menu
6924 * Partition-Wide Restrictions::
6925 * Program Unit Level Restrictions::
6926 @end menu
6927
6928 @node Partition-Wide Restrictions
6929 @section Partition-Wide Restrictions
6930
6931 There are two separate lists of restriction identifiers. The first
6932 set requires consistency throughout a partition (in other words, if the
6933 restriction identifier is used for any compilation unit in the partition,
6934 then all compilation units in the partition must obey the restriction).
6935
6936 @menu
6937 * Immediate_Reclamation::
6938 * Max_Asynchronous_Select_Nesting::
6939 * Max_Entry_Queue_Length::
6940 * Max_Protected_Entries::
6941 * Max_Select_Alternatives::
6942 * Max_Storage_At_Blocking::
6943 * Max_Task_Entries::
6944 * Max_Tasks::
6945 * No_Abort_Statements::
6946 * No_Access_Parameter_Allocators::
6947 * No_Access_Subprograms::
6948 * No_Allocators::
6949 * No_Anonymous_Allocators::
6950 * No_Calendar::
6951 * No_Coextensions::
6952 * No_Default_Initialization::
6953 * No_Delay::
6954 * No_Dependence::
6955 * No_Direct_Boolean_Operators::
6956 * No_Dispatch::
6957 * No_Dispatching_Calls::
6958 * No_Dynamic_Attachment::
6959 * No_Dynamic_Priorities::
6960 * No_Entry_Calls_In_Elaboration_Code::
6961 * No_Enumeration_Maps::
6962 * No_Exception_Handlers::
6963 * No_Exception_Propagation::
6964 * No_Exception_Registration::
6965 * No_Exceptions::
6966 * No_Finalization::
6967 * No_Fixed_Point::
6968 * No_Floating_Point::
6969 * No_Implicit_Conditionals::
6970 * No_Implicit_Dynamic_Code::
6971 * No_Implicit_Heap_Allocations::
6972 * No_Implicit_Loops::
6973 * No_Initialize_Scalars::
6974 * No_IO::
6975 * No_Local_Allocators::
6976 * No_Local_Protected_Objects::
6977 * No_Local_Timing_Events::
6978 * No_Nested_Finalization::
6979 * No_Protected_Type_Allocators::
6980 * No_Protected_Types::
6981 * No_Recursion::
6982 * No_Reentrancy::
6983 * No_Relative_Delay::
6984 * No_Requeue_Statements::
6985 * No_Secondary_Stack::
6986 * No_Select_Statements::
6987 * No_Specific_Termination_Handlers::
6988 * No_Specification_of_Aspect::
6989 * No_Standard_Allocators_After_Elaboration::
6990 * No_Standard_Storage_Pools::
6991 * No_Stream_Optimizations::
6992 * No_Streams::
6993 * No_Task_Allocators::
6994 * No_Task_Attributes_Package::
6995 * No_Task_Hierarchy::
6996 * No_Task_Termination::
6997 * No_Tasking::
6998 * No_Terminate_Alternatives::
6999 * No_Unchecked_Access::
7000 * Simple_Barriers::
7001 * Static_Priorities::
7002 * Static_Storage_Size::
7003 @end menu
7004
7005 @node Immediate_Reclamation
7006 @unnumberedsubsec Immediate_Reclamation
7007 @findex Immediate_Reclamation
7008 [RM H.4] This restriction ensures that, except for storage occupied by
7009 objects created by allocators and not deallocated via unchecked
7010 deallocation, any storage reserved at run time for an object is
7011 immediately reclaimed when the object no longer exists.
7012
7013 @node Max_Asynchronous_Select_Nesting
7014 @unnumberedsubsec Max_Asynchronous_Select_Nesting
7015 @findex Max_Asynchronous_Select_Nesting
7016 [RM D.7] Specifies the maximum dynamic nesting level of asynchronous
7017 selects. Violations of this restriction with a value of zero are
7018 detected at compile time. Violations of this restriction with values
7019 other than zero cause Storage_Error to be raised.
7020
7021 @node Max_Entry_Queue_Length
7022 @unnumberedsubsec Max_Entry_Queue_Length
7023 @findex Max_Entry_Queue_Length
7024 [RM D.7] This restriction is a declaration that any protected entry compiled in
7025 the scope of the restriction has at most the specified number of
7026 tasks waiting on the entry at any one time, and so no queue is required.
7027 Note that this restriction is checked at run time. Violation of this
7028 restriction results in the raising of Program_Error exception at the point of
7029 the call.
7030
7031 @node Max_Protected_Entries
7032 @unnumberedsubsec Max_Protected_Entries
7033 @findex Max_Protected_Entries
7034 [RM D.7] Specifies the maximum number of entries per protected type. The
7035 bounds of every entry family of a protected unit shall be static, or shall be
7036 defined by a discriminant of a subtype whose corresponding bound is static.
7037
7038 @node Max_Select_Alternatives
7039 @unnumberedsubsec Max_Select_Alternatives
7040 @findex Max_Select_Alternatives
7041 [RM D.7] Specifies the maximum number of alternatives in a selective accept.
7042
7043 @node Max_Storage_At_Blocking
7044 @unnumberedsubsec Max_Storage_At_Blocking
7045 @findex Max_Storage_At_Blocking
7046 [RM D.7] Specifies the maximum portion (in storage elements) of a task's
7047 Storage_Size that can be retained by a blocked task. A violation of this
7048 restriction causes Storage_Error to be raised.
7049
7050 @node Max_Task_Entries
7051 @unnumberedsubsec Max_Task_Entries
7052 @findex Max_Task_Entries
7053 [RM D.7] Specifies the maximum number of entries
7054 per task.  The bounds of every entry family
7055 of a task unit shall be static, or shall be
7056 defined by a discriminant of a subtype whose
7057 corresponding bound is static.
7058
7059 @node Max_Tasks
7060 @unnumberedsubsec Max_Tasks
7061 @findex Max_Tasks
7062 [RM D.7] Specifies the maximum number of task that may be created, not
7063 counting the creation of the environment task.  Violations of this
7064 restriction with a value of zero are detected at compile
7065 time. Violations of this restriction with values other than zero cause
7066 Storage_Error to be raised.
7067
7068 @node No_Abort_Statements
7069 @unnumberedsubsec No_Abort_Statements
7070 @findex No_Abort_Statements
7071 [RM D.7] There are no abort_statements, and there are
7072 no calls to Task_Identification.Abort_Task.
7073
7074 @node No_Access_Parameter_Allocators
7075 @unnumberedsubsec No_Access_Parameter_Allocators
7076 @findex No_Access_Parameter_Allocators
7077 [RM H.4] This restriction ensures at compile time that there are no
7078 occurrences of an allocator as the actual parameter to an access
7079 parameter.
7080
7081 @node No_Access_Subprograms
7082 @unnumberedsubsec No_Access_Subprograms
7083 @findex No_Access_Subprograms
7084 [RM H.4] This restriction ensures at compile time that there are no
7085 declarations of access-to-subprogram types.
7086
7087 @node No_Allocators
7088 @unnumberedsubsec No_Allocators
7089 @findex No_Allocators
7090 [RM H.4] This restriction ensures at compile time that there are no
7091 occurrences of an allocator.
7092
7093 @node No_Anonymous_Allocators
7094 @unnumberedsubsec No_Anonymous_Allocators
7095 @findex No_Anonymous_Allocators
7096 [RM H.4] This restriction ensures at compile time that there are no
7097 occurrences of an allocator of anonymous access type.
7098
7099 @node No_Calendar
7100 @unnumberedsubsec No_Calendar
7101 @findex No_Calendar
7102 [GNAT] This restriction ensures at compile time that there is no implicit or
7103 explicit dependence on the package @code{Ada.Calendar}.
7104
7105 @node No_Coextensions
7106 @unnumberedsubsec No_Coextensions
7107 @findex No_Coextensions
7108 [RM H.4] This restriction ensures at compile time that there are no
7109 coextensions. See 3.10.2.
7110
7111 @node No_Default_Initialization
7112 @unnumberedsubsec No_Default_Initialization
7113 @findex No_Default_Initialization
7114
7115 [GNAT] This restriction prohibits any instance of default initialization
7116 of variables.  The binder implements a consistency rule which prevents
7117 any unit compiled without the restriction from with'ing a unit with the
7118 restriction (this allows the generation of initialization procedures to
7119 be skipped, since you can be sure that no call is ever generated to an
7120 initialization procedure in a unit with the restriction active). If used
7121 in conjunction with Initialize_Scalars or Normalize_Scalars, the effect
7122 is to prohibit all cases of variables declared without a specific
7123 initializer (including the case of OUT scalar parameters).
7124
7125 @node No_Delay
7126 @unnumberedsubsec No_Delay
7127 @findex No_Delay
7128 [RM H.4] This restriction ensures at compile time that there are no
7129 delay statements and no dependences on package Calendar.
7130
7131 @node No_Dependence
7132 @unnumberedsubsec No_Dependence
7133 @findex No_Dependence
7134 [RM 13.12.1] This restriction checks at compile time that there are no
7135 dependence on a library unit.
7136
7137 @node No_Direct_Boolean_Operators
7138 @unnumberedsubsec No_Direct_Boolean_Operators
7139 @findex No_Direct_Boolean_Operators
7140 [GNAT] This restriction ensures that no logical (and/or/xor) are used on
7141 operands of type Boolean (or any type derived
7142 from Boolean). This is intended for use in safety critical programs
7143 where the certification protocol requires the use of short-circuit
7144 (and then, or else) forms for all composite boolean operations.
7145
7146 @node No_Dispatch
7147 @unnumberedsubsec No_Dispatch
7148 @findex No_Dispatch
7149 [RM H.4] This restriction ensures at compile time that there are no
7150 occurrences of @code{T'Class}, for any (tagged) subtype @code{T}.
7151
7152 @node No_Dispatching_Calls
7153 @unnumberedsubsec No_Dispatching_Calls
7154 @findex No_Dispatching_Calls
7155 [GNAT] This restriction ensures at compile time that the code generated by the
7156 compiler involves no dispatching calls. The use of this restriction allows the
7157 safe use of record extensions, classwide membership tests and other classwide
7158 features not involving implicit dispatching. This restriction ensures that
7159 the code contains no indirect calls through a dispatching mechanism. Note that
7160 this includes internally-generated calls created by the compiler, for example
7161 in the implementation of class-wide objects assignments. The
7162 membership test is allowed in the presence of this restriction, because its
7163 implementation requires no dispatching.
7164 This restriction is comparable to the official Ada restriction
7165 @code{No_Dispatch} except that it is a bit less restrictive in that it allows
7166 all classwide constructs that do not imply dispatching.
7167 The following example indicates constructs that violate this restriction.
7168
7169 @smallexample
7170 package Pkg is
7171   type T is tagged record
7172     Data : Natural;
7173   end record;
7174   procedure P (X : T);
7175
7176   type DT is new T with record
7177     More_Data : Natural;
7178   end record;
7179   procedure Q (X : DT);
7180 end Pkg;
7181
7182 with Pkg; use Pkg;
7183 procedure Example is
7184   procedure Test (O : T'Class) is
7185     N : Natural  := O'Size;--  Error: Dispatching call
7186     C : T'Class := O;      --  Error: implicit Dispatching Call
7187   begin
7188     if O in DT'Class then  --  OK   : Membership test
7189        Q (DT (O));         --  OK   : Type conversion plus direct call
7190     else
7191        P (O);              --  Error: Dispatching call
7192     end if;
7193   end Test;
7194
7195   Obj : DT;
7196 begin
7197   P (Obj);                 --  OK   : Direct call
7198   P (T (Obj));             --  OK   : Type conversion plus direct call
7199   P (T'Class (Obj));       --  Error: Dispatching call
7200
7201   Test (Obj);              --  OK   : Type conversion
7202
7203   if Obj in T'Class then   --  OK   : Membership test
7204      null;
7205   end if;
7206 end Example;
7207 @end smallexample
7208
7209 @node No_Dynamic_Attachment
7210 @unnumberedsubsec No_Dynamic_Attachment
7211 @findex No_Dynamic_Attachment
7212 [RM D.7] This restriction ensures that there is no call to any of the
7213 operations defined in package Ada.Interrupts
7214 (Is_Reserved, Is_Attached, Current_Handler, Attach_Handler, Exchange_Handler,
7215 Detach_Handler, and Reference).
7216
7217 @node No_Dynamic_Priorities
7218 @unnumberedsubsec No_Dynamic_Priorities
7219 @findex No_Dynamic_Priorities
7220 [RM D.7] There are no semantic dependencies on the package Dynamic_Priorities.
7221
7222 @node No_Entry_Calls_In_Elaboration_Code
7223 @unnumberedsubsec No_Entry_Calls_In_Elaboration_Code
7224 @findex No_Entry_Calls_In_Elaboration_Code
7225 [GNAT] This restriction ensures at compile time that no task or protected entry
7226 calls are made during elaboration code.  As a result of the use of this
7227 restriction, the compiler can assume that no code past an accept statement
7228 in a task can be executed at elaboration time.
7229
7230 @node No_Enumeration_Maps
7231 @unnumberedsubsec No_Enumeration_Maps
7232 @findex No_Enumeration_Maps
7233 [GNAT] This restriction ensures at compile time that no operations requiring
7234 enumeration maps are used (that is Image and Value attributes applied
7235 to enumeration types).
7236
7237 @node No_Exception_Handlers
7238 @unnumberedsubsec No_Exception_Handlers
7239 @findex No_Exception_Handlers
7240 [GNAT] This restriction ensures at compile time that there are no explicit
7241 exception handlers. It also indicates that no exception propagation will
7242 be provided. In this mode, exceptions may be raised but will result in
7243 an immediate call to the last chance handler, a routine that the user
7244 must define with the following profile:
7245
7246 @smallexample @c ada
7247 procedure Last_Chance_Handler
7248   (Source_Location : System.Address; Line : Integer);
7249 pragma Export (C, Last_Chance_Handler,
7250                "__gnat_last_chance_handler");
7251 @end smallexample
7252
7253 The parameter is a C null-terminated string representing a message to be
7254 associated with the exception (typically the source location of the raise
7255 statement generated by the compiler). The Line parameter when nonzero
7256 represents the line number in the source program where the raise occurs.
7257
7258 @node No_Exception_Propagation
7259 @unnumberedsubsec No_Exception_Propagation
7260 @findex No_Exception_Propagation
7261 [GNAT] This restriction guarantees that exceptions are never propagated
7262 to an outer subprogram scope. The only case in which an exception may
7263 be raised is when the handler is statically in the same subprogram, so
7264 that the effect of a raise is essentially like a goto statement. Any
7265 other raise statement (implicit or explicit) will be considered
7266 unhandled. Exception handlers are allowed, but may not contain an
7267 exception occurrence identifier (exception choice). In addition, use of
7268 the package GNAT.Current_Exception is not permitted, and reraise
7269 statements (raise with no operand) are not permitted.
7270
7271 @node No_Exception_Registration
7272 @unnumberedsubsec No_Exception_Registration
7273 @findex No_Exception_Registration
7274 [GNAT] This restriction ensures at compile time that no stream operations for
7275 types Exception_Id or Exception_Occurrence are used. This also makes it
7276 impossible to pass exceptions to or from a partition with this restriction
7277 in a distributed environment. If this exception is active, then the generated
7278 code is simplified by omitting the otherwise-required global registration
7279 of exceptions when they are declared.
7280
7281 @node No_Exceptions
7282 @unnumberedsubsec No_Exceptions
7283 @findex No_Exceptions
7284 [RM H.4] This restriction ensures at compile time that there are no
7285 raise statements and no exception handlers.
7286
7287 @node No_Finalization
7288 @unnumberedsubsec No_Finalization
7289 @findex No_Finalization
7290 [GNAT] This restriction disables the language features described in
7291 chapter 7.6 of the Ada 2005 RM as well as all form of code generation
7292 performed by the compiler to support these features. The following types
7293 are no longer considered controlled when this restriction is in effect:
7294 @itemize @bullet
7295 @item
7296 @code{Ada.Finalization.Controlled}
7297 @item
7298 @code{Ada.Finalization.Limited_Controlled}
7299 @item
7300 Derivations from @code{Controlled} or @code{Limited_Controlled}
7301 @item
7302 Class-wide types
7303 @item
7304 Protected types
7305 @item
7306 Task types
7307 @item
7308 Array and record types with controlled components
7309 @end itemize
7310 The compiler no longer generates code to initialize, finalize or adjust an
7311 object or a nested component, either declared on the stack or on the heap. The
7312 deallocation of a controlled object no longer finalizes its contents.
7313
7314 @node No_Fixed_Point
7315 @unnumberedsubsec No_Fixed_Point
7316 @findex No_Fixed_Point
7317 [RM H.4] This restriction ensures at compile time that there are no
7318 occurrences of fixed point types and operations.
7319
7320 @node No_Floating_Point
7321 @unnumberedsubsec No_Floating_Point
7322 @findex No_Floating_Point
7323 [RM H.4] This restriction ensures at compile time that there are no
7324 occurrences of floating point types and operations.
7325
7326 @node No_Implicit_Conditionals
7327 @unnumberedsubsec No_Implicit_Conditionals
7328 @findex No_Implicit_Conditionals
7329 [GNAT] This restriction ensures that the generated code does not contain any
7330 implicit conditionals, either by modifying the generated code where possible,
7331 or by rejecting any construct that would otherwise generate an implicit
7332 conditional. Note that this check does not include run time constraint
7333 checks, which on some targets may generate implicit conditionals as
7334 well. To control the latter, constraint checks can be suppressed in the
7335 normal manner. Constructs generating implicit conditionals include comparisons
7336 of composite objects and the Max/Min attributes.
7337
7338 @node No_Implicit_Dynamic_Code
7339 @unnumberedsubsec No_Implicit_Dynamic_Code
7340 @findex No_Implicit_Dynamic_Code
7341 @cindex trampoline
7342 [GNAT] This restriction prevents the compiler from building ``trampolines''.
7343 This is a structure that is built on the stack and contains dynamic
7344 code to be executed at run time. On some targets, a trampoline is
7345 built for the following features: @code{Access},
7346 @code{Unrestricted_Access}, or @code{Address} of a nested subprogram;
7347 nested task bodies; primitive operations of nested tagged types.
7348 Trampolines do not work on machines that prevent execution of stack
7349 data. For example, on windows systems, enabling DEP (data execution
7350 protection) will cause trampolines to raise an exception.
7351 Trampolines are also quite slow at run time.
7352
7353 On many targets, trampolines have been largely eliminated. Look at the
7354 version of system.ads for your target --- if it has
7355 Always_Compatible_Rep equal to False, then trampolines are largely
7356 eliminated. In particular, a trampoline is built for the following
7357 features: @code{Address} of a nested subprogram;
7358 @code{Access} or @code{Unrestricted_Access} of a nested subprogram,
7359 but only if pragma Favor_Top_Level applies, or the access type has a
7360 foreign-language convention; primitive operations of nested tagged
7361 types.
7362
7363 @node No_Implicit_Heap_Allocations
7364 @unnumberedsubsec No_Implicit_Heap_Allocations
7365 @findex No_Implicit_Heap_Allocations
7366 [RM D.7] No constructs are allowed to cause implicit heap allocation.
7367
7368 @node No_Implicit_Loops
7369 @unnumberedsubsec No_Implicit_Loops
7370 @findex No_Implicit_Loops
7371 [GNAT] This restriction ensures that the generated code does not contain any
7372 implicit @code{for} loops, either by modifying
7373 the generated code where possible,
7374 or by rejecting any construct that would otherwise generate an implicit
7375 @code{for} loop. If this restriction is active, it is possible to build
7376 large array aggregates with all static components without generating an
7377 intermediate temporary, and without generating a loop to initialize individual
7378 components. Otherwise, a loop is created for arrays larger than about 5000
7379 scalar components.
7380
7381 @node No_Initialize_Scalars
7382 @unnumberedsubsec No_Initialize_Scalars
7383 @findex No_Initialize_Scalars
7384 [GNAT] This restriction ensures that no unit in the partition is compiled with
7385 pragma Initialize_Scalars. This allows the generation of more efficient
7386 code, and in particular eliminates dummy null initialization routines that
7387 are otherwise generated for some record and array types.
7388
7389 @node No_IO
7390 @unnumberedsubsec No_IO
7391 @findex No_IO
7392 [RM H.4] This restriction ensures at compile time that there are no
7393 dependences on any of the library units Sequential_IO, Direct_IO,
7394 Text_IO, Wide_Text_IO, Wide_Wide_Text_IO, or Stream_IO.
7395
7396 @node No_Local_Allocators
7397 @unnumberedsubsec No_Local_Allocators
7398 @findex No_Local_Allocators
7399 [RM H.4] This restriction ensures at compile time that there are no
7400 occurrences of an allocator in subprograms, generic subprograms, tasks,
7401 and entry bodies.
7402
7403 @node No_Local_Protected_Objects
7404 @unnumberedsubsec No_Local_Protected_Objects
7405 @findex No_Local_Protected_Objects
7406 [RM D.7] This restriction ensures at compile time that protected objects are
7407 only declared at the library level.
7408
7409 @node No_Local_Timing_Events
7410 @unnumberedsubsec No_Local_Timing_Events
7411 @findex No_Local_Timing_Events
7412 [RM D.7] All objects of type Ada.Timing_Events.Timing_Event are
7413 declared at the library level.
7414
7415 @node No_Nested_Finalization
7416 @unnumberedsubsec No_Nested_Finalization
7417 @findex No_Nested_Finalization
7418 [RM D.7] All objects requiring finalization are declared at the library level.
7419
7420 @node No_Protected_Type_Allocators
7421 @unnumberedsubsec No_Protected_Type_Allocators
7422 @findex No_Protected_Type_Allocators
7423 [RM D.7] This restriction ensures at compile time that there are no allocator
7424 expressions that attempt to allocate protected objects.
7425
7426 @node No_Protected_Types
7427 @unnumberedsubsec No_Protected_Types
7428 @findex No_Protected_Types
7429 [RM H.4] This restriction ensures at compile time that there are no
7430 declarations of protected types or protected objects.
7431
7432 @node No_Recursion
7433 @unnumberedsubsec No_Recursion
7434 @findex No_Recursion
7435 [RM H.4] A program execution is erroneous if a subprogram is invoked as
7436 part of its execution.
7437
7438 @node No_Reentrancy
7439 @unnumberedsubsec No_Reentrancy
7440 @findex No_Reentrancy
7441 [RM H.4] A program execution is erroneous if a subprogram is executed by
7442 two tasks at the same time.
7443
7444 @node No_Relative_Delay
7445 @unnumberedsubsec No_Relative_Delay
7446 @findex No_Relative_Delay
7447 [RM D.7] This restriction ensures at compile time that there are no delay
7448 relative statements and prevents expressions such as @code{delay 1.23;} from
7449 appearing in source code.
7450
7451 @node No_Requeue_Statements
7452 @unnumberedsubsec No_Requeue_Statements
7453 @findex No_Requeue_Statements
7454 [RM D.7] This restriction ensures at compile time that no requeue statements
7455 are permitted and prevents keyword @code{requeue} from being used in source
7456 code.
7457
7458 @node No_Secondary_Stack
7459 @unnumberedsubsec No_Secondary_Stack
7460 @findex No_Secondary_Stack
7461 [GNAT] This restriction ensures at compile time that the generated code
7462 does not contain any reference to the secondary stack.  The secondary
7463 stack is used to implement functions returning unconstrained objects
7464 (arrays or records) on some targets.
7465
7466 @node No_Select_Statements
7467 @unnumberedsubsec No_Select_Statements
7468 @findex No_Select_Statements
7469 [RM D.7] This restriction ensures at compile time no select statements of any
7470 kind are permitted, that is the keyword @code{select} may not appear.
7471
7472 @node No_Specific_Termination_Handlers
7473 @unnumberedsubsec No_Specific_Termination_Handlers
7474 @findex No_Specific_Termination_Handlers
7475 [RM D.7] There are no calls to Ada.Task_Termination.Set_Specific_Handler
7476 or to Ada.Task_Termination.Specific_Handler.
7477
7478 @node No_Specification_of_Aspect
7479 @unnumberedsubsec No_Specification_of_Aspect
7480 @findex No_Specification_of_Aspect
7481 [RM 13.12.1] This restriction checks at compile time that no aspect
7482 specification, attribute definition clause, or pragma is given for a
7483 given aspect.
7484
7485 @node No_Standard_Allocators_After_Elaboration
7486 @unnumberedsubsec No_Standard_Allocators_After_Elaboration
7487 @findex No_Standard_Allocators_After_Elaboration
7488 [RM D.7] Specifies that an allocator using a standard storage pool
7489 should never be evaluated at run time after the elaboration of the
7490 library items of the partition has completed. Otherwise, Storage_Error
7491 is raised.
7492
7493 @node No_Standard_Storage_Pools
7494 @unnumberedsubsec No_Standard_Storage_Pools
7495 @findex No_Standard_Storage_Pools
7496 [GNAT] This restriction ensures at compile time that no access types
7497 use the standard default storage pool.  Any access type declared must
7498 have an explicit Storage_Pool attribute defined specifying a
7499 user-defined storage pool.
7500
7501 @node No_Stream_Optimizations
7502 @unnumberedsubsec No_Stream_Optimizations
7503 @findex No_Stream_Optimizations
7504 [GNAT] This restriction affects the performance of stream operations on types
7505 @code{String}, @code{Wide_String} and @code{Wide_Wide_String}. By default, the
7506 compiler uses block reads and writes when manipulating @code{String} objects
7507 due to their supperior performance. When this restriction is in effect, the
7508 compiler performs all IO operations on a per-character basis.
7509
7510 @node No_Streams
7511 @unnumberedsubsec No_Streams
7512 @findex No_Streams
7513 [GNAT] This restriction ensures at compile/bind time that there are no
7514 stream objects created and no use of stream attributes.
7515 This restriction does not forbid dependences on the package
7516 @code{Ada.Streams}. So it is permissible to with
7517 @code{Ada.Streams} (or another package that does so itself)
7518 as long as no actual stream objects are created and no
7519 stream attributes are used.
7520
7521 Note that the use of restriction allows optimization of tagged types,
7522 since they do not need to worry about dispatching stream operations.
7523 To take maximum advantage of this space-saving optimization, any
7524 unit declaring a tagged type should be compiled with the restriction,
7525 though this is not required.
7526
7527 @node No_Task_Allocators
7528 @unnumberedsubsec No_Task_Allocators
7529 @findex No_Task_Allocators
7530 [RM D.7] There are no allocators for task types
7531 or types containing task subcomponents.
7532
7533 @node No_Task_Attributes_Package
7534 @unnumberedsubsec No_Task_Attributes_Package
7535 @findex No_Task_Attributes_Package
7536 [GNAT] This restriction ensures at compile time that there are no implicit or
7537 explicit dependencies on the package @code{Ada.Task_Attributes}.
7538
7539 @node No_Task_Hierarchy
7540 @unnumberedsubsec No_Task_Hierarchy
7541 @findex No_Task_Hierarchy
7542 [RM D.7] All (non-environment) tasks depend
7543 directly on the environment task of the partition.
7544
7545 @node No_Task_Termination
7546 @unnumberedsubsec No_Task_Termination
7547 @findex No_Task_Termination
7548 [RM D.7] Tasks which terminate are erroneous.
7549
7550 @node No_Tasking
7551 @unnumberedsubsec No_Tasking
7552 @findex No_Tasking
7553 [GNAT] This restriction prevents the declaration of tasks or task types
7554 throughout the partition.  It is similar in effect to the use of
7555 @code{Max_Tasks => 0} except that violations are caught at compile time
7556 and cause an error message to be output either by the compiler or
7557 binder.
7558
7559 @node No_Terminate_Alternatives
7560 @unnumberedsubsec No_Terminate_Alternatives
7561 @findex No_Terminate_Alternatives
7562 [RM D.7] There are no selective accepts with terminate alternatives.
7563
7564 @node No_Unchecked_Access
7565 @unnumberedsubsec No_Unchecked_Access
7566 @findex No_Unchecked_Access
7567 [RM H.4] This restriction ensures at compile time that there are no
7568 occurrences of the Unchecked_Access attribute.
7569
7570 @node Simple_Barriers
7571 @unnumberedsubsec Simple_Barriers
7572 @findex Simple_Barriers
7573 [RM D.7] This restriction ensures at compile time that barriers in entry
7574 declarations for protected types are restricted to either static boolean
7575 expressions or references to simple boolean variables defined in the private
7576 part of the protected type.  No other form of entry barriers is permitted.
7577
7578 @node Static_Priorities
7579 @unnumberedsubsec Static_Priorities
7580 @findex Static_Priorities
7581 [GNAT] This restriction ensures at compile time that all priority expressions
7582 are static, and that there are no dependences on the package
7583 @code{Ada.Dynamic_Priorities}.
7584
7585 @node Static_Storage_Size
7586 @unnumberedsubsec Static_Storage_Size
7587 @findex Static_Storage_Size
7588 [GNAT] This restriction ensures at compile time that any expression appearing
7589 in a Storage_Size pragma or attribute definition clause is static.
7590
7591 @node Program Unit Level Restrictions
7592 @section Program Unit Level Restrictions
7593
7594 @noindent
7595 The second set of restriction identifiers
7596 does not require partition-wide consistency.
7597 The restriction may be enforced for a single
7598 compilation unit without any effect on any of the
7599 other compilation units in the partition.
7600
7601 @menu
7602 * No_Elaboration_Code::
7603 * No_Entry_Queue::
7604 * No_Implementation_Aspect_Specifications::
7605 * No_Implementation_Attributes::
7606 * No_Implementation_Identifiers::
7607 * No_Implementation_Pragmas::
7608 * No_Implementation_Restrictions::
7609 * No_Implementation_Units::
7610 * No_Implicit_Aliasing::
7611 * No_Obsolescent_Features::
7612 * No_Wide_Characters::
7613 * SPARK::
7614 @end menu
7615
7616 @node No_Elaboration_Code
7617 @unnumberedsubsec No_Elaboration_Code
7618 @findex No_Elaboration_Code
7619 [GNAT] This restriction ensures at compile time that no elaboration code is
7620 generated.  Note that this is not the same condition as is enforced
7621 by pragma @code{Preelaborate}.  There are cases in which pragma
7622 @code{Preelaborate} still permits code to be generated (e.g.@: code
7623 to initialize a large array to all zeroes), and there are cases of units
7624 which do not meet the requirements for pragma @code{Preelaborate},
7625 but for which no elaboration code is generated.  Generally, it is
7626 the case that preelaborable units will meet the restrictions, with
7627 the exception of large aggregates initialized with an others_clause,
7628 and exception declarations (which generate calls to a run-time
7629 registry procedure).  This restriction is enforced on
7630 a unit by unit basis, it need not be obeyed consistently
7631 throughout a partition.
7632
7633 In the case of aggregates with others, if the aggregate has a dynamic
7634 size, there is no way to eliminate the elaboration code (such dynamic
7635 bounds would be incompatible with @code{Preelaborate} in any case). If
7636 the bounds are static, then use of this restriction actually modifies
7637 the code choice of the compiler to avoid generating a loop, and instead
7638 generate the aggregate statically if possible, no matter how many times
7639 the data for the others clause must be repeatedly generated.
7640
7641 It is not possible to precisely document
7642 the constructs which are compatible with this restriction, since,
7643 unlike most other restrictions, this is not a restriction on the
7644 source code, but a restriction on the generated object code. For
7645 example, if the source contains a declaration:
7646
7647 @smallexample
7648    Val : constant Integer := X;
7649 @end smallexample
7650
7651 @noindent
7652 where X is not a static constant, it may be possible, depending
7653 on complex optimization circuitry, for the compiler to figure
7654 out the value of X at compile time, in which case this initialization
7655 can be done by the loader, and requires no initialization code. It
7656 is not possible to document the precise conditions under which the
7657 optimizer can figure this out.
7658
7659 Note that this the implementation of this restriction requires full
7660 code generation. If it is used in conjunction with "semantics only"
7661 checking, then some cases of violations may be missed.
7662
7663 @node No_Entry_Queue
7664 @unnumberedsubsec No_Entry_Queue
7665 @findex No_Entry_Queue
7666 [GNAT] This restriction is a declaration that any protected entry compiled in
7667 the scope of the restriction has at most one task waiting on the entry
7668 at any one time, and so no queue is required.  This restriction is not
7669 checked at compile time.  A program execution is erroneous if an attempt
7670 is made to queue a second task on such an entry.
7671
7672 @node No_Implementation_Aspect_Specifications
7673 @unnumberedsubsec No_Implementation_Aspect_Specifications
7674 @findex No_Implementation_Aspect_Specifications
7675 [RM 13.12.1] This restriction checks at compile time that no
7676 GNAT-defined aspects are present.  With this restriction, the only
7677 aspects that can be used are those defined in the Ada Reference Manual.
7678
7679 @node No_Implementation_Attributes
7680 @unnumberedsubsec No_Implementation_Attributes
7681 @findex No_Implementation_Attributes
7682 [RM 13.12.1] This restriction checks at compile time that no
7683 GNAT-defined attributes are present.  With this restriction, the only
7684 attributes that can be used are those defined in the Ada Reference
7685 Manual.
7686
7687 @node No_Implementation_Identifiers
7688 @unnumberedsubsec No_Implementation_Identifiers
7689 @findex No_Implementation_Identifiers
7690 [RM 13.12.1] This restriction checks at compile time that no
7691 implementation-defined identifiers occur within language-defined
7692 packages.
7693
7694 @node No_Implementation_Pragmas
7695 @unnumberedsubsec No_Implementation_Pragmas
7696 @findex No_Implementation_Pragmas
7697 [RM 13.12.1] This restriction checks at compile time that no
7698 GNAT-defined pragmas are present.  With this restriction, the only
7699 pragmas that can be used are those defined in the Ada Reference Manual.
7700
7701 @node No_Implementation_Restrictions
7702 @unnumberedsubsec No_Implementation_Restrictions
7703 @findex No_Implementation_Restrictions
7704 [GNAT] This restriction checks at compile time that no GNAT-defined restriction
7705 identifiers (other than @code{No_Implementation_Restrictions} itself)
7706 are present.  With this restriction, the only other restriction identifiers
7707 that can be used are those defined in the Ada Reference Manual.
7708
7709 @node No_Implementation_Units
7710 @unnumberedsubsec No_Implementation_Units
7711 @findex No_Implementation_Units
7712 [RM 13.12.1] This restriction checks at compile time that there is no
7713 mention in the context clause of any implementation-defined descendants
7714 of packages Ada, Interfaces, or System.
7715
7716 @node No_Implicit_Aliasing
7717 @unnumberedsubsec No_Implicit_Aliasing
7718 @findex No_Implicit_Aliasing
7719 [GNAT] This restriction, which is not required to be partition-wide consistent,
7720 requires an explicit aliased keyword for an object to which 'Access,
7721 'Unchecked_Access, or 'Address is applied, and forbids entirely the use of
7722 the 'Unrestricted_Access attribute for objects. Note: the reason that
7723 Unrestricted_Access is forbidden is that it would require the prefix
7724 to be aliased, and in such cases, it can always be replaced by
7725 the standard attribute Unchecked_Access which is preferable.
7726
7727 @node No_Obsolescent_Features
7728 @unnumberedsubsec No_Obsolescent_Features
7729 @findex No_Obsolescent_Features
7730 [RM 13.12.1] This restriction checks at compile time that no obsolescent
7731 features are used, as defined in Annex J of the Ada Reference Manual.
7732
7733 @node No_Wide_Characters
7734 @unnumberedsubsec No_Wide_Characters
7735 @findex No_Wide_Characters
7736 [GNAT] This restriction ensures at compile time that no uses of the types
7737 @code{Wide_Character} or @code{Wide_String} or corresponding wide
7738 wide types
7739 appear, and that no wide or wide wide string or character literals
7740 appear in the program (that is literals representing characters not in
7741 type @code{Character}.
7742
7743 @node SPARK
7744 @unnumberedsubsec SPARK
7745 @findex SPARK
7746 [GNAT] This restriction checks at compile time that some constructs
7747 forbidden in SPARK are not present. The SPARK version used as a
7748 reference is the same as the Ada mode for the unit, so a unit compiled
7749 in Ada 95 mode with SPARK restrictions will be checked for constructs
7750 forbidden in SPARK 95.  Error messages related to SPARK restriction have
7751 the form:
7752
7753 @smallexample
7754 violation of restriction "SPARK" at <file>
7755  <error message>
7756 @end smallexample
7757
7758 This is not a replacement for the semantic checks performed by the
7759 SPARK Examiner tool, as the compiler only deals currently with code,
7760 not at all with SPARK annotations and does not guarantee catching all
7761 cases of constructs forbidden by SPARK.
7762
7763 Thus it may well be the case that code which
7764 passes the compiler in SPARK mode is rejected by the SPARK Examiner,
7765 e.g. due to the different visibility rules of the Examiner based on
7766 SPARK @code{inherit} annotations.
7767
7768 This restriction can be useful in providing an initial filter for
7769 code developed using SPARK, or in examining legacy code to see how far
7770 it is from meeting SPARK restrictions.
7771
7772 @c ------------------------
7773 @node Implementation Advice
7774 @chapter Implementation Advice
7775 @noindent
7776 The main text of the Ada Reference Manual describes the required
7777 behavior of all Ada compilers, and the GNAT compiler conforms to
7778 these requirements.
7779
7780 In addition, there are sections throughout the Ada Reference Manual headed
7781 by the phrase ``Implementation advice''.  These sections are not normative,
7782 i.e., they do not specify requirements that all compilers must
7783 follow.  Rather they provide advice on generally desirable behavior.  You
7784 may wonder why they are not requirements.  The most typical answer is
7785 that they describe behavior that seems generally desirable, but cannot
7786 be provided on all systems, or which may be undesirable on some systems.
7787
7788 As far as practical, GNAT follows the implementation advice sections in
7789 the Ada Reference Manual.  This chapter contains a table giving the
7790 reference manual section number, paragraph number and several keywords
7791 for each advice.  Each entry consists of the text of the advice followed
7792 by the GNAT interpretation of this advice.  Most often, this simply says
7793 ``followed'', which means that GNAT follows the advice.  However, in a
7794 number of cases, GNAT deliberately deviates from this advice, in which
7795 case the text describes what GNAT does and why.
7796
7797 @cindex Error detection
7798 @unnumberedsec 1.1.3(20): Error Detection
7799 @sp 1
7800 @cartouche
7801 If an implementation detects the use of an unsupported Specialized Needs
7802 Annex feature at run time, it should raise @code{Program_Error} if
7803 feasible.
7804 @end cartouche
7805 Not relevant.  All specialized needs annex features are either supported,
7806 or diagnosed at compile time.
7807
7808 @cindex Child Units
7809 @unnumberedsec 1.1.3(31): Child Units
7810 @sp 1
7811 @cartouche
7812 If an implementation wishes to provide implementation-defined
7813 extensions to the functionality of a language-defined library unit, it
7814 should normally do so by adding children to the library unit.
7815 @end cartouche
7816 Followed.
7817
7818 @cindex Bounded errors
7819 @unnumberedsec 1.1.5(12): Bounded Errors
7820 @sp 1
7821 @cartouche
7822 If an implementation detects a bounded error or erroneous
7823 execution, it should raise @code{Program_Error}.
7824 @end cartouche
7825 Followed in all cases in which the implementation detects a bounded
7826 error or erroneous execution.  Not all such situations are detected at
7827 runtime.
7828
7829 @cindex Pragmas
7830 @unnumberedsec 2.8(16): Pragmas
7831 @sp 1
7832 @cartouche
7833 Normally, implementation-defined pragmas should have no semantic effect
7834 for error-free programs; that is, if the implementation-defined pragmas
7835 are removed from a working program, the program should still be legal,
7836 and should still have the same semantics.
7837 @end cartouche
7838 The following implementation defined pragmas are exceptions to this
7839 rule:
7840
7841 @table @code
7842 @item Abort_Defer
7843 Affects semantics
7844 @item Ada_83
7845 Affects legality
7846 @item Assert
7847 Affects semantics
7848 @item CPP_Class
7849 Affects semantics
7850 @item CPP_Constructor
7851 Affects semantics
7852 @item Debug
7853 Affects semantics
7854 @item Interface_Name
7855 Affects semantics
7856 @item Machine_Attribute
7857 Affects semantics
7858 @item Unimplemented_Unit
7859 Affects legality
7860 @item Unchecked_Union
7861 Affects semantics
7862 @end table
7863
7864 @noindent
7865 In each of the above cases, it is essential to the purpose of the pragma
7866 that this advice not be followed.  For details see the separate section
7867 on implementation defined pragmas.
7868
7869 @unnumberedsec 2.8(17-19): Pragmas
7870 @sp 1
7871 @cartouche
7872 Normally, an implementation should not define pragmas that can
7873 make an illegal program legal, except as follows:
7874 @end cartouche
7875 @sp 1
7876 @cartouche
7877 A pragma used to complete a declaration, such as a pragma @code{Import};
7878 @end cartouche
7879 @sp 1
7880 @cartouche
7881 A pragma used to configure the environment by adding, removing, or
7882 replacing @code{library_items}.
7883 @end cartouche
7884 See response to paragraph 16 of this same section.
7885
7886 @cindex Character Sets
7887 @cindex Alternative Character Sets
7888 @unnumberedsec 3.5.2(5): Alternative Character Sets
7889 @sp 1
7890 @cartouche
7891 If an implementation supports a mode with alternative interpretations
7892 for @code{Character} and @code{Wide_Character}, the set of graphic
7893 characters of @code{Character} should nevertheless remain a proper
7894 subset of the set of graphic characters of @code{Wide_Character}.  Any
7895 character set ``localizations'' should be reflected in the results of
7896 the subprograms defined in the language-defined package
7897 @code{Characters.Handling} (see A.3) available in such a mode.  In a mode with
7898 an alternative interpretation of @code{Character}, the implementation should
7899 also support a corresponding change in what is a legal
7900 @code{identifier_letter}.
7901 @end cartouche
7902 Not all wide character modes follow this advice, in particular the JIS
7903 and IEC modes reflect standard usage in Japan, and in these encoding,
7904 the upper half of the Latin-1 set is not part of the wide-character
7905 subset, since the most significant bit is used for wide character
7906 encoding.  However, this only applies to the external forms.  Internally
7907 there is no such restriction.
7908
7909 @cindex Integer types
7910 @unnumberedsec 3.5.4(28): Integer Types
7911
7912 @sp 1
7913 @cartouche
7914 An implementation should support @code{Long_Integer} in addition to
7915 @code{Integer} if the target machine supports 32-bit (or longer)
7916 arithmetic.  No other named integer subtypes are recommended for package
7917 @code{Standard}.  Instead, appropriate named integer subtypes should be
7918 provided in the library package @code{Interfaces} (see B.2).
7919 @end cartouche
7920 @code{Long_Integer} is supported.  Other standard integer types are supported
7921 so this advice is not fully followed.  These types
7922 are supported for convenient interface to C, and so that all hardware
7923 types of the machine are easily available.
7924 @unnumberedsec 3.5.4(29): Integer Types
7925
7926 @sp 1
7927 @cartouche
7928 An implementation for a two's complement machine should support
7929 modular types with a binary modulus up to @code{System.Max_Int*2+2}.  An
7930 implementation should support a non-binary modules up to @code{Integer'Last}.
7931 @end cartouche
7932 Followed.
7933
7934 @cindex Enumeration values
7935 @unnumberedsec 3.5.5(8): Enumeration Values
7936 @sp 1
7937 @cartouche
7938 For the evaluation of a call on @code{@var{S}'Pos} for an enumeration
7939 subtype, if the value of the operand does not correspond to the internal
7940 code for any enumeration literal of its type (perhaps due to an
7941 un-initialized variable), then the implementation should raise
7942 @code{Program_Error}.  This is particularly important for enumeration
7943 types with noncontiguous internal codes specified by an
7944 enumeration_representation_clause.
7945 @end cartouche
7946 Followed.
7947
7948 @cindex Float types
7949 @unnumberedsec 3.5.7(17): Float Types
7950 @sp 1
7951 @cartouche
7952 An implementation should support @code{Long_Float} in addition to
7953 @code{Float} if the target machine supports 11 or more digits of
7954 precision.  No other named floating point subtypes are recommended for
7955 package @code{Standard}.  Instead, appropriate named floating point subtypes
7956 should be provided in the library package @code{Interfaces} (see B.2).
7957 @end cartouche
7958 @code{Short_Float} and @code{Long_Long_Float} are also provided.  The
7959 former provides improved compatibility with other implementations
7960 supporting this type.  The latter corresponds to the highest precision
7961 floating-point type supported by the hardware.  On most machines, this
7962 will be the same as @code{Long_Float}, but on some machines, it will
7963 correspond to the IEEE extended form.  The notable case is all ia32
7964 (x86) implementations, where @code{Long_Long_Float} corresponds to
7965 the 80-bit extended precision format supported in hardware on this
7966 processor.  Note that the 128-bit format on SPARC is not supported,
7967 since this is a software rather than a hardware format.
7968
7969 @cindex Multidimensional arrays
7970 @cindex Arrays, multidimensional
7971 @unnumberedsec 3.6.2(11): Multidimensional Arrays
7972 @sp 1
7973 @cartouche
7974 An implementation should normally represent multidimensional arrays in
7975 row-major order, consistent with the notation used for multidimensional
7976 array aggregates (see 4.3.3).  However, if a pragma @code{Convention}
7977 (@code{Fortran}, @dots{}) applies to a multidimensional array type, then
7978 column-major order should be used instead (see B.5, ``Interfacing with
7979 Fortran'').
7980 @end cartouche
7981 Followed.
7982
7983 @findex Duration'Small
7984 @unnumberedsec 9.6(30-31): Duration'Small
7985 @sp 1
7986 @cartouche
7987 Whenever possible in an implementation, the value of @code{Duration'Small}
7988 should be no greater than 100 microseconds.
7989 @end cartouche
7990 Followed.  (@code{Duration'Small} = 10**(@minus{}9)).
7991
7992 @sp 1
7993 @cartouche
7994 The time base for @code{delay_relative_statements} should be monotonic;
7995 it need not be the same time base as used for @code{Calendar.Clock}.
7996 @end cartouche
7997 Followed.
7998
7999 @unnumberedsec 10.2.1(12): Consistent Representation
8000 @sp 1
8001 @cartouche
8002 In an implementation, a type declared in a pre-elaborated package should
8003 have the same representation in every elaboration of a given version of
8004 the package, whether the elaborations occur in distinct executions of
8005 the same program, or in executions of distinct programs or partitions
8006 that include the given version.
8007 @end cartouche
8008 Followed, except in the case of tagged types.  Tagged types involve
8009 implicit pointers to a local copy of a dispatch table, and these pointers
8010 have representations which thus depend on a particular elaboration of the
8011 package.  It is not easy to see how it would be possible to follow this
8012 advice without severely impacting efficiency of execution.
8013
8014 @cindex Exception information
8015 @unnumberedsec 11.4.1(19): Exception Information
8016 @sp 1
8017 @cartouche
8018 @code{Exception_Message} by default and @code{Exception_Information}
8019 should produce information useful for
8020 debugging.  @code{Exception_Message} should be short, about one
8021 line.  @code{Exception_Information} can be long.  @code{Exception_Message}
8022 should not include the
8023 @code{Exception_Name}.  @code{Exception_Information} should include both
8024 the @code{Exception_Name} and the @code{Exception_Message}.
8025 @end cartouche
8026 Followed.  For each exception that doesn't have a specified
8027 @code{Exception_Message}, the compiler generates one containing the location
8028 of the raise statement.  This location has the form ``file:line'', where
8029 file is the short file name (without path information) and line is the line
8030 number in the file.  Note that in the case of the Zero Cost Exception
8031 mechanism, these messages become redundant with the Exception_Information that
8032 contains a full backtrace of the calling sequence, so they are disabled.
8033 To disable explicitly the generation of the source location message, use the
8034 Pragma @code{Discard_Names}.
8035
8036 @cindex Suppression of checks
8037 @cindex Checks, suppression of
8038 @unnumberedsec 11.5(28): Suppression of Checks
8039 @sp 1
8040 @cartouche
8041 The implementation should minimize the code executed for checks that
8042 have been suppressed.
8043 @end cartouche
8044 Followed.
8045
8046 @cindex Representation clauses
8047 @unnumberedsec 13.1 (21-24): Representation Clauses
8048 @sp 1
8049 @cartouche
8050 The recommended level of support for all representation items is
8051 qualified as follows:
8052 @end cartouche
8053 @sp 1
8054 @cartouche
8055 An implementation need not support representation items containing
8056 non-static expressions, except that an implementation should support a
8057 representation item for a given entity if each non-static expression in
8058 the representation item is a name that statically denotes a constant
8059 declared before the entity.
8060 @end cartouche
8061 Followed.  In fact, GNAT goes beyond the recommended level of support
8062 by allowing nonstatic expressions in some representation clauses even
8063 without the need to declare constants initialized with the values of
8064 such expressions.
8065 For example:
8066
8067 @smallexample @c ada
8068   X : Integer;
8069   Y : Float;
8070   for Y'Address use X'Address;>>
8071 @end smallexample
8072
8073 @sp 1
8074 @cartouche
8075 An implementation need not support a specification for the @code{Size}
8076 for a given composite subtype, nor the size or storage place for an
8077 object (including a component) of a given composite subtype, unless the
8078 constraints on the subtype and its composite subcomponents (if any) are
8079 all static constraints.
8080 @end cartouche
8081 Followed.  Size Clauses are not permitted on non-static components, as
8082 described above.
8083
8084 @sp 1
8085 @cartouche
8086 An aliased component, or a component whose type is by-reference, should
8087 always be allocated at an addressable location.
8088 @end cartouche
8089 Followed.
8090
8091 @cindex Packed types
8092 @unnumberedsec 13.2(6-8): Packed Types
8093 @sp 1
8094 @cartouche
8095 If a type is packed, then the implementation should try to minimize
8096 storage allocated to objects of the type, possibly at the expense of
8097 speed of accessing components, subject to reasonable complexity in
8098 addressing calculations.
8099 @end cartouche
8100 @sp 1
8101 @cartouche
8102 The recommended level of support pragma @code{Pack} is:
8103
8104 For a packed record type, the components should be packed as tightly as
8105 possible subject to the Sizes of the component subtypes, and subject to
8106 any @code{record_representation_clause} that applies to the type; the
8107 implementation may, but need not, reorder components or cross aligned
8108 word boundaries to improve the packing.  A component whose @code{Size} is
8109 greater than the word size may be allocated an integral number of words.
8110 @end cartouche
8111 Followed.  Tight packing of arrays is supported for all component sizes
8112 up to 64-bits. If the array component size is 1 (that is to say, if
8113 the component is a boolean type or an enumeration type with two values)
8114 then values of the type are implicitly initialized to zero. This
8115 happens both for objects of the packed type, and for objects that have a
8116 subcomponent of the packed type.
8117
8118 @sp 1
8119 @cartouche
8120 An implementation should support Address clauses for imported
8121 subprograms.
8122 @end cartouche
8123 Followed.
8124 @cindex @code{Address} clauses
8125 @unnumberedsec 13.3(14-19): Address Clauses
8126
8127 @sp 1
8128 @cartouche
8129 For an array @var{X}, @code{@var{X}'Address} should point at the first
8130 component of the array, and not at the array bounds.
8131 @end cartouche
8132 Followed.
8133
8134 @sp 1
8135 @cartouche
8136 The recommended level of support for the @code{Address} attribute is:
8137
8138 @code{@var{X}'Address} should produce a useful result if @var{X} is an
8139 object that is aliased or of a by-reference type, or is an entity whose
8140 @code{Address} has been specified.
8141 @end cartouche
8142 Followed.  A valid address will be produced even if none of those
8143 conditions have been met.  If necessary, the object is forced into
8144 memory to ensure the address is valid.
8145
8146 @sp 1
8147 @cartouche
8148 An implementation should support @code{Address} clauses for imported
8149 subprograms.
8150 @end cartouche
8151 Followed.
8152
8153 @sp 1
8154 @cartouche
8155 Objects (including subcomponents) that are aliased or of a by-reference
8156 type should be allocated on storage element boundaries.
8157 @end cartouche
8158 Followed.
8159
8160 @sp 1
8161 @cartouche
8162 If the @code{Address} of an object is specified, or it is imported or exported,
8163 then the implementation should not perform optimizations based on
8164 assumptions of no aliases.
8165 @end cartouche
8166 Followed.
8167
8168 @cindex @code{Alignment} clauses
8169 @unnumberedsec 13.3(29-35): Alignment Clauses
8170 @sp 1
8171 @cartouche
8172 The recommended level of support for the @code{Alignment} attribute for
8173 subtypes is:
8174
8175 An implementation should support specified Alignments that are factors
8176 and multiples of the number of storage elements per word, subject to the
8177 following:
8178 @end cartouche
8179 Followed.
8180
8181 @sp 1
8182 @cartouche
8183 An implementation need not support specified @code{Alignment}s for
8184 combinations of @code{Size}s and @code{Alignment}s that cannot be easily
8185 loaded and stored by available machine instructions.
8186 @end cartouche
8187 Followed.
8188
8189 @sp 1
8190 @cartouche
8191 An implementation need not support specified @code{Alignment}s that are
8192 greater than the maximum @code{Alignment} the implementation ever returns by
8193 default.
8194 @end cartouche
8195 Followed.
8196
8197 @sp 1
8198 @cartouche
8199 The recommended level of support for the @code{Alignment} attribute for
8200 objects is:
8201
8202 Same as above, for subtypes, but in addition:
8203 @end cartouche
8204 Followed.
8205
8206 @sp 1
8207 @cartouche
8208 For stand-alone library-level objects of statically constrained
8209 subtypes, the implementation should support all @code{Alignment}s
8210 supported by the target linker.  For example, page alignment is likely to
8211 be supported for such objects, but not for subtypes.
8212 @end cartouche
8213 Followed.
8214
8215 @cindex @code{Size} clauses
8216 @unnumberedsec 13.3(42-43): Size Clauses
8217 @sp 1
8218 @cartouche
8219 The recommended level of support for the @code{Size} attribute of
8220 objects is:
8221
8222 A @code{Size} clause should be supported for an object if the specified
8223 @code{Size} is at least as large as its subtype's @code{Size}, and
8224 corresponds to a size in storage elements that is a multiple of the
8225 object's @code{Alignment} (if the @code{Alignment} is nonzero).
8226 @end cartouche
8227 Followed.
8228
8229 @unnumberedsec 13.3(50-56): Size Clauses
8230 @sp 1
8231 @cartouche
8232 If the @code{Size} of a subtype is specified, and allows for efficient
8233 independent addressability (see 9.10) on the target architecture, then
8234 the @code{Size} of the following objects of the subtype should equal the
8235 @code{Size} of the subtype:
8236
8237 Aliased objects (including components).
8238 @end cartouche
8239 Followed.
8240
8241 @sp 1
8242 @cartouche
8243 @code{Size} clause on a composite subtype should not affect the
8244 internal layout of components.
8245 @end cartouche
8246 Followed. But note that this can be overridden by use of the implementation
8247 pragma Implicit_Packing in the case of packed arrays.
8248
8249 @sp 1
8250 @cartouche
8251 The recommended level of support for the @code{Size} attribute of subtypes is:
8252 @end cartouche
8253 @sp 1
8254 @cartouche
8255 The @code{Size} (if not specified) of a static discrete or fixed point
8256 subtype should be the number of bits needed to represent each value
8257 belonging to the subtype using an unbiased representation, leaving space
8258 for a sign bit only if the subtype contains negative values.  If such a
8259 subtype is a first subtype, then an implementation should support a
8260 specified @code{Size} for it that reflects this representation.
8261 @end cartouche
8262 Followed.
8263
8264 @sp 1
8265 @cartouche
8266 For a subtype implemented with levels of indirection, the @code{Size}
8267 should include the size of the pointers, but not the size of what they
8268 point at.
8269 @end cartouche
8270 Followed.
8271
8272 @cindex @code{Component_Size} clauses
8273 @unnumberedsec 13.3(71-73): Component Size Clauses
8274 @sp 1
8275 @cartouche
8276 The recommended level of support for the @code{Component_Size}
8277 attribute is:
8278 @end cartouche
8279 @sp 1
8280 @cartouche
8281 An implementation need not support specified @code{Component_Sizes} that are
8282 less than the @code{Size} of the component subtype.
8283 @end cartouche
8284 Followed.
8285
8286 @sp 1
8287 @cartouche
8288 An implementation should support specified @code{Component_Size}s that
8289 are factors and multiples of the word size.  For such
8290 @code{Component_Size}s, the array should contain no gaps between
8291 components.  For other @code{Component_Size}s (if supported), the array
8292 should contain no gaps between components when packing is also
8293 specified; the implementation should forbid this combination in cases
8294 where it cannot support a no-gaps representation.
8295 @end cartouche
8296 Followed.
8297
8298 @cindex Enumeration representation clauses
8299 @cindex Representation clauses, enumeration
8300 @unnumberedsec 13.4(9-10): Enumeration Representation Clauses
8301 @sp 1
8302 @cartouche
8303 The recommended level of support for enumeration representation clauses
8304 is:
8305
8306 An implementation need not support enumeration representation clauses
8307 for boolean types, but should at minimum support the internal codes in
8308 the range @code{System.Min_Int.System.Max_Int}.
8309 @end cartouche
8310 Followed.
8311
8312 @cindex Record representation clauses
8313 @cindex Representation clauses, records
8314 @unnumberedsec 13.5.1(17-22): Record Representation Clauses
8315 @sp 1
8316 @cartouche
8317 The recommended level of support for
8318 @*@code{record_representation_clauses} is:
8319
8320 An implementation should support storage places that can be extracted
8321 with a load, mask, shift sequence of machine code, and set with a load,
8322 shift, mask, store sequence, given the available machine instructions
8323 and run-time model.
8324 @end cartouche
8325 Followed.
8326
8327 @sp 1
8328 @cartouche
8329 A storage place should be supported if its size is equal to the
8330 @code{Size} of the component subtype, and it starts and ends on a
8331 boundary that obeys the @code{Alignment} of the component subtype.
8332 @end cartouche
8333 Followed.
8334
8335 @sp 1
8336 @cartouche
8337 If the default bit ordering applies to the declaration of a given type,
8338 then for a component whose subtype's @code{Size} is less than the word
8339 size, any storage place that does not cross an aligned word boundary
8340 should be supported.
8341 @end cartouche
8342 Followed.
8343
8344 @sp 1
8345 @cartouche
8346 An implementation may reserve a storage place for the tag field of a
8347 tagged type, and disallow other components from overlapping that place.
8348 @end cartouche
8349 Followed.  The storage place for the tag field is the beginning of the tagged
8350 record, and its size is Address'Size.  GNAT will reject an explicit component
8351 clause for the tag field.
8352
8353 @sp 1
8354 @cartouche
8355 An implementation need not support a @code{component_clause} for a
8356 component of an extension part if the storage place is not after the
8357 storage places of all components of the parent type, whether or not
8358 those storage places had been specified.
8359 @end cartouche
8360 Followed.  The above advice on record representation clauses is followed,
8361 and all mentioned features are implemented.
8362
8363 @cindex Storage place attributes
8364 @unnumberedsec 13.5.2(5): Storage Place Attributes
8365 @sp 1
8366 @cartouche
8367 If a component is represented using some form of pointer (such as an
8368 offset) to the actual data of the component, and this data is contiguous
8369 with the rest of the object, then the storage place attributes should
8370 reflect the place of the actual data, not the pointer.  If a component is
8371 allocated discontinuously from the rest of the object, then a warning
8372 should be generated upon reference to one of its storage place
8373 attributes.
8374 @end cartouche
8375 Followed.  There are no such components in GNAT@.
8376
8377 @cindex Bit ordering
8378 @unnumberedsec 13.5.3(7-8): Bit Ordering
8379 @sp 1
8380 @cartouche
8381 The recommended level of support for the non-default bit ordering is:
8382 @end cartouche
8383 @sp 1
8384 @cartouche
8385 If @code{Word_Size} = @code{Storage_Unit}, then the implementation
8386 should support the non-default bit ordering in addition to the default
8387 bit ordering.
8388 @end cartouche
8389 Followed.  Word size does not equal storage size in this implementation.
8390 Thus non-default bit ordering is not supported.
8391
8392 @cindex @code{Address}, as private type
8393 @unnumberedsec 13.7(37): Address as Private
8394 @sp 1
8395 @cartouche
8396 @code{Address} should be of a private type.
8397 @end cartouche
8398 Followed.
8399
8400 @cindex Operations, on @code{Address}
8401 @cindex @code{Address}, operations of
8402 @unnumberedsec 13.7.1(16): Address Operations
8403 @sp 1
8404 @cartouche
8405 Operations in @code{System} and its children should reflect the target
8406 environment semantics as closely as is reasonable.  For example, on most
8407 machines, it makes sense for address arithmetic to ``wrap around''.
8408 Operations that do not make sense should raise @code{Program_Error}.
8409 @end cartouche
8410 Followed.  Address arithmetic is modular arithmetic that wraps around.  No
8411 operation raises @code{Program_Error}, since all operations make sense.
8412
8413 @cindex Unchecked conversion
8414 @unnumberedsec 13.9(14-17): Unchecked Conversion
8415 @sp 1
8416 @cartouche
8417 The @code{Size} of an array object should not include its bounds; hence,
8418 the bounds should not be part of the converted data.
8419 @end cartouche
8420 Followed.
8421
8422 @sp 1
8423 @cartouche
8424 The implementation should not generate unnecessary run-time checks to
8425 ensure that the representation of @var{S} is a representation of the
8426 target type.  It should take advantage of the permission to return by
8427 reference when possible.  Restrictions on unchecked conversions should be
8428 avoided unless required by the target environment.
8429 @end cartouche
8430 Followed.  There are no restrictions on unchecked conversion.  A warning is
8431 generated if the source and target types do not have the same size since
8432 the semantics in this case may be target dependent.
8433
8434 @sp 1
8435 @cartouche
8436 The recommended level of support for unchecked conversions is:
8437 @end cartouche
8438 @sp 1
8439 @cartouche
8440 Unchecked conversions should be supported and should be reversible in
8441 the cases where this clause defines the result.  To enable meaningful use
8442 of unchecked conversion, a contiguous representation should be used for
8443 elementary subtypes, for statically constrained array subtypes whose
8444 component subtype is one of the subtypes described in this paragraph,
8445 and for record subtypes without discriminants whose component subtypes
8446 are described in this paragraph.
8447 @end cartouche
8448 Followed.
8449
8450 @cindex Heap usage, implicit
8451 @unnumberedsec 13.11(23-25): Implicit Heap Usage
8452 @sp 1
8453 @cartouche
8454 An implementation should document any cases in which it dynamically
8455 allocates heap storage for a purpose other than the evaluation of an
8456 allocator.
8457 @end cartouche
8458 Followed, the only other points at which heap storage is dynamically
8459 allocated are as follows:
8460
8461 @itemize @bullet
8462 @item
8463 At initial elaboration time, to allocate dynamically sized global
8464 objects.
8465
8466 @item
8467 To allocate space for a task when a task is created.
8468
8469 @item
8470 To extend the secondary stack dynamically when needed.  The secondary
8471 stack is used for returning variable length results.
8472 @end itemize
8473
8474 @sp 1
8475 @cartouche
8476 A default (implementation-provided) storage pool for an
8477 access-to-constant type should not have overhead to support deallocation of
8478 individual objects.
8479 @end cartouche
8480 Followed.
8481
8482 @sp 1
8483 @cartouche
8484 A storage pool for an anonymous access type should be created at the
8485 point of an allocator for the type, and be reclaimed when the designated
8486 object becomes inaccessible.
8487 @end cartouche
8488 Followed.
8489
8490 @cindex Unchecked deallocation
8491 @unnumberedsec 13.11.2(17): Unchecked De-allocation
8492 @sp 1
8493 @cartouche
8494 For a standard storage pool, @code{Free} should actually reclaim the
8495 storage.
8496 @end cartouche
8497 Followed.
8498
8499 @cindex Stream oriented attributes
8500 @unnumberedsec 13.13.2(17): Stream Oriented Attributes
8501 @sp 1
8502 @cartouche
8503 If a stream element is the same size as a storage element, then the
8504 normal in-memory representation should be used by @code{Read} and
8505 @code{Write} for scalar objects.  Otherwise, @code{Read} and @code{Write}
8506 should use the smallest number of stream elements needed to represent
8507 all values in the base range of the scalar type.
8508 @end cartouche
8509
8510 Followed.  By default, GNAT uses the interpretation suggested by AI-195,
8511 which specifies using the size of the first subtype.
8512 However, such an implementation is based on direct binary
8513 representations and is therefore target- and endianness-dependent.
8514 To address this issue, GNAT also supplies an alternate implementation
8515 of the stream attributes @code{Read} and @code{Write},
8516 which uses the target-independent XDR standard representation
8517 for scalar types.
8518 @cindex XDR representation
8519 @cindex @code{Read} attribute
8520 @cindex @code{Write} attribute
8521 @cindex Stream oriented attributes
8522 The XDR implementation is provided as an alternative body of the
8523 @code{System.Stream_Attributes} package, in the file
8524 @file{s-stratt-xdr.adb} in the GNAT library.
8525 There is no @file{s-stratt-xdr.ads} file.
8526 In order to install the XDR implementation, do the following:
8527 @enumerate
8528 @item Replace the default implementation of the
8529 @code{System.Stream_Attributes} package with the XDR implementation.
8530 For example on a Unix platform issue the commands:
8531 @smallexample
8532 $ mv s-stratt.adb s-stratt-default.adb
8533 $ mv s-stratt-xdr.adb s-stratt.adb
8534 @end smallexample
8535
8536 @item
8537 Rebuild the GNAT run-time library as documented in
8538 @ref{GNAT and Libraries,,, gnat_ugn, @value{EDITION} User's Guide}.
8539 @end enumerate
8540
8541 @unnumberedsec A.1(52): Names of Predefined Numeric Types
8542 @sp 1
8543 @cartouche
8544 If an implementation provides additional named predefined integer types,
8545 then the names should end with @samp{Integer} as in
8546 @samp{Long_Integer}.  If an implementation provides additional named
8547 predefined floating point types, then the names should end with
8548 @samp{Float} as in @samp{Long_Float}.
8549 @end cartouche
8550 Followed.
8551
8552 @findex Ada.Characters.Handling
8553 @unnumberedsec A.3.2(49): @code{Ada.Characters.Handling}
8554 @sp 1
8555 @cartouche
8556 If an implementation provides a localized definition of @code{Character}
8557 or @code{Wide_Character}, then the effects of the subprograms in
8558 @code{Characters.Handling} should reflect the localizations.  See also
8559 3.5.2.
8560 @end cartouche
8561 Followed.  GNAT provides no such localized definitions.
8562
8563 @cindex Bounded-length strings
8564 @unnumberedsec A.4.4(106): Bounded-Length String Handling
8565 @sp 1
8566 @cartouche
8567 Bounded string objects should not be implemented by implicit pointers
8568 and dynamic allocation.
8569 @end cartouche
8570 Followed.  No implicit pointers or dynamic allocation are used.
8571
8572 @cindex Random number generation
8573 @unnumberedsec A.5.2(46-47): Random Number Generation
8574 @sp 1
8575 @cartouche
8576 Any storage associated with an object of type @code{Generator} should be
8577 reclaimed on exit from the scope of the object.
8578 @end cartouche
8579 Followed.
8580
8581 @sp 1
8582 @cartouche
8583 If the generator period is sufficiently long in relation to the number
8584 of distinct initiator values, then each possible value of
8585 @code{Initiator} passed to @code{Reset} should initiate a sequence of
8586 random numbers that does not, in a practical sense, overlap the sequence
8587 initiated by any other value.  If this is not possible, then the mapping
8588 between initiator values and generator states should be a rapidly
8589 varying function of the initiator value.
8590 @end cartouche
8591 Followed.  The generator period is sufficiently long for the first
8592 condition here to hold true.
8593
8594 @findex Get_Immediate
8595 @unnumberedsec A.10.7(23): @code{Get_Immediate}
8596 @sp 1
8597 @cartouche
8598 The @code{Get_Immediate} procedures should be implemented with
8599 unbuffered input.  For a device such as a keyboard, input should be
8600 @dfn{available} if a key has already been typed, whereas for a disk
8601 file, input should always be available except at end of file.  For a file
8602 associated with a keyboard-like device, any line-editing features of the
8603 underlying operating system should be disabled during the execution of
8604 @code{Get_Immediate}.
8605 @end cartouche
8606 Followed on all targets except VxWorks. For VxWorks, there is no way to
8607 provide this functionality that does not result in the input buffer being
8608 flushed before the @code{Get_Immediate} call. A special unit
8609 @code{Interfaces.Vxworks.IO} is provided that contains routines to enable
8610 this functionality.
8611
8612 @findex Export
8613 @unnumberedsec B.1(39-41): Pragma @code{Export}
8614 @sp 1
8615 @cartouche
8616 If an implementation supports pragma @code{Export} to a given language,
8617 then it should also allow the main subprogram to be written in that
8618 language.  It should support some mechanism for invoking the elaboration
8619 of the Ada library units included in the system, and for invoking the
8620 finalization of the environment task.  On typical systems, the
8621 recommended mechanism is to provide two subprograms whose link names are
8622 @code{adainit} and @code{adafinal}.  @code{adainit} should contain the
8623 elaboration code for library units.  @code{adafinal} should contain the
8624 finalization code.  These subprograms should have no effect the second
8625 and subsequent time they are called.
8626 @end cartouche
8627 Followed.
8628
8629 @sp 1
8630 @cartouche
8631 Automatic elaboration of pre-elaborated packages should be
8632 provided when pragma @code{Export} is supported.
8633 @end cartouche
8634 Followed when the main program is in Ada.  If the main program is in a
8635 foreign language, then
8636 @code{adainit} must be called to elaborate pre-elaborated
8637 packages.
8638
8639 @sp 1
8640 @cartouche
8641 For each supported convention @var{L} other than @code{Intrinsic}, an
8642 implementation should support @code{Import} and @code{Export} pragmas
8643 for objects of @var{L}-compatible types and for subprograms, and pragma
8644 @code{Convention} for @var{L}-eligible types and for subprograms,
8645 presuming the other language has corresponding features.  Pragma
8646 @code{Convention} need not be supported for scalar types.
8647 @end cartouche
8648 Followed.
8649
8650 @cindex Package @code{Interfaces}
8651 @findex Interfaces
8652 @unnumberedsec B.2(12-13): Package @code{Interfaces}
8653 @sp 1
8654 @cartouche
8655 For each implementation-defined convention identifier, there should be a
8656 child package of package Interfaces with the corresponding name.  This
8657 package should contain any declarations that would be useful for
8658 interfacing to the language (implementation) represented by the
8659 convention.  Any declarations useful for interfacing to any language on
8660 the given hardware architecture should be provided directly in
8661 @code{Interfaces}.
8662 @end cartouche
8663 Followed. An additional package not defined
8664 in the Ada Reference Manual is @code{Interfaces.CPP}, used
8665 for interfacing to C++.
8666
8667 @sp 1
8668 @cartouche
8669 An implementation supporting an interface to C, COBOL, or Fortran should
8670 provide the corresponding package or packages described in the following
8671 clauses.
8672 @end cartouche
8673 Followed.  GNAT provides all the packages described in this section.
8674
8675 @cindex C, interfacing with
8676 @unnumberedsec B.3(63-71): Interfacing with C
8677 @sp 1
8678 @cartouche
8679 An implementation should support the following interface correspondences
8680 between Ada and C@.
8681 @end cartouche
8682 Followed.
8683
8684 @sp 1
8685 @cartouche
8686 An Ada procedure corresponds to a void-returning C function.
8687 @end cartouche
8688 Followed.
8689
8690 @sp 1
8691 @cartouche
8692 An Ada function corresponds to a non-void C function.
8693 @end cartouche
8694 Followed.
8695
8696 @sp 1
8697 @cartouche
8698 An Ada @code{in} scalar parameter is passed as a scalar argument to a C
8699 function.
8700 @end cartouche
8701 Followed.
8702
8703 @sp 1
8704 @cartouche
8705 An Ada @code{in} parameter of an access-to-object type with designated
8706 type @var{T} is passed as a @code{@var{t}*} argument to a C function,
8707 where @var{t} is the C type corresponding to the Ada type @var{T}.
8708 @end cartouche
8709 Followed.
8710
8711 @sp 1
8712 @cartouche
8713 An Ada access @var{T} parameter, or an Ada @code{out} or @code{in out}
8714 parameter of an elementary type @var{T}, is passed as a @code{@var{t}*}
8715 argument to a C function, where @var{t} is the C type corresponding to
8716 the Ada type @var{T}.  In the case of an elementary @code{out} or
8717 @code{in out} parameter, a pointer to a temporary copy is used to
8718 preserve by-copy semantics.
8719 @end cartouche
8720 Followed.
8721
8722 @sp 1
8723 @cartouche
8724 An Ada parameter of a record type @var{T}, of any mode, is passed as a
8725 @code{@var{t}*} argument to a C function, where @var{t} is the C
8726 structure corresponding to the Ada type @var{T}.
8727 @end cartouche
8728 Followed.  This convention may be overridden by the use of the C_Pass_By_Copy
8729 pragma, or Convention, or by explicitly specifying the mechanism for a given
8730 call using an extended import or export pragma.
8731
8732 @sp 1
8733 @cartouche
8734 An Ada parameter of an array type with component type @var{T}, of any
8735 mode, is passed as a @code{@var{t}*} argument to a C function, where
8736 @var{t} is the C type corresponding to the Ada type @var{T}.
8737 @end cartouche
8738 Followed.
8739
8740 @sp 1
8741 @cartouche
8742 An Ada parameter of an access-to-subprogram type is passed as a pointer
8743 to a C function whose prototype corresponds to the designated
8744 subprogram's specification.
8745 @end cartouche
8746 Followed.
8747
8748 @cindex COBOL, interfacing with
8749 @unnumberedsec B.4(95-98): Interfacing with COBOL
8750 @sp 1
8751 @cartouche
8752 An Ada implementation should support the following interface
8753 correspondences between Ada and COBOL@.
8754 @end cartouche
8755 Followed.
8756
8757 @sp 1
8758 @cartouche
8759 An Ada access @var{T} parameter is passed as a @samp{BY REFERENCE} data item of
8760 the COBOL type corresponding to @var{T}.
8761 @end cartouche
8762 Followed.
8763
8764 @sp 1
8765 @cartouche
8766 An Ada in scalar parameter is passed as a @samp{BY CONTENT} data item of
8767 the corresponding COBOL type.
8768 @end cartouche
8769 Followed.
8770
8771 @sp 1
8772 @cartouche
8773 Any other Ada parameter is passed as a @samp{BY REFERENCE} data item of the
8774 COBOL type corresponding to the Ada parameter type; for scalars, a local
8775 copy is used if necessary to ensure by-copy semantics.
8776 @end cartouche
8777 Followed.
8778
8779 @cindex Fortran, interfacing with
8780 @unnumberedsec B.5(22-26): Interfacing with Fortran
8781 @sp 1
8782 @cartouche
8783 An Ada implementation should support the following interface
8784 correspondences between Ada and Fortran:
8785 @end cartouche
8786 Followed.
8787
8788 @sp 1
8789 @cartouche
8790 An Ada procedure corresponds to a Fortran subroutine.
8791 @end cartouche
8792 Followed.
8793
8794 @sp 1
8795 @cartouche
8796 An Ada function corresponds to a Fortran function.
8797 @end cartouche
8798 Followed.
8799
8800 @sp 1
8801 @cartouche
8802 An Ada parameter of an elementary, array, or record type @var{T} is
8803 passed as a @var{T} argument to a Fortran procedure, where @var{T} is
8804 the Fortran type corresponding to the Ada type @var{T}, and where the
8805 INTENT attribute of the corresponding dummy argument matches the Ada
8806 formal parameter mode; the Fortran implementation's parameter passing
8807 conventions are used.  For elementary types, a local copy is used if
8808 necessary to ensure by-copy semantics.
8809 @end cartouche
8810 Followed.
8811
8812 @sp 1
8813 @cartouche
8814 An Ada parameter of an access-to-subprogram type is passed as a
8815 reference to a Fortran procedure whose interface corresponds to the
8816 designated subprogram's specification.
8817 @end cartouche
8818 Followed.
8819
8820 @cindex Machine operations
8821 @unnumberedsec C.1(3-5): Access to Machine Operations
8822 @sp 1
8823 @cartouche
8824 The machine code or intrinsic support should allow access to all
8825 operations normally available to assembly language programmers for the
8826 target environment, including privileged instructions, if any.
8827 @end cartouche
8828 Followed.
8829
8830 @sp 1
8831 @cartouche
8832 The interfacing pragmas (see Annex B) should support interface to
8833 assembler; the default assembler should be associated with the
8834 convention identifier @code{Assembler}.
8835 @end cartouche
8836 Followed.
8837
8838 @sp 1
8839 @cartouche
8840 If an entity is exported to assembly language, then the implementation
8841 should allocate it at an addressable location, and should ensure that it
8842 is retained by the linking process, even if not otherwise referenced
8843 from the Ada code.  The implementation should assume that any call to a
8844 machine code or assembler subprogram is allowed to read or update every
8845 object that is specified as exported.
8846 @end cartouche
8847 Followed.
8848
8849 @unnumberedsec C.1(10-16): Access to Machine Operations
8850 @sp 1
8851 @cartouche
8852 The implementation should ensure that little or no overhead is
8853 associated with calling intrinsic and machine-code subprograms.
8854 @end cartouche
8855 Followed for both intrinsics and machine-code subprograms.
8856
8857 @sp 1
8858 @cartouche
8859 It is recommended that intrinsic subprograms be provided for convenient
8860 access to any machine operations that provide special capabilities or
8861 efficiency and that are not otherwise available through the language
8862 constructs.
8863 @end cartouche
8864 Followed.  A full set of machine operation intrinsic subprograms is provided.
8865
8866 @sp 1
8867 @cartouche
8868 Atomic read-modify-write operations---e.g.@:, test and set, compare and
8869 swap, decrement and test, enqueue/dequeue.
8870 @end cartouche
8871 Followed on any target supporting such operations.
8872
8873 @sp 1
8874 @cartouche
8875 Standard numeric functions---e.g.@:, sin, log.
8876 @end cartouche
8877 Followed on any target supporting such operations.
8878
8879 @sp 1
8880 @cartouche
8881 String manipulation operations---e.g.@:, translate and test.
8882 @end cartouche
8883 Followed on any target supporting such operations.
8884
8885 @sp 1
8886 @cartouche
8887 Vector operations---e.g.@:, compare vector against thresholds.
8888 @end cartouche
8889 Followed on any target supporting such operations.
8890
8891 @sp 1
8892 @cartouche
8893 Direct operations on I/O ports.
8894 @end cartouche
8895 Followed on any target supporting such operations.
8896
8897 @cindex Interrupt support
8898 @unnumberedsec C.3(28): Interrupt Support
8899 @sp 1
8900 @cartouche
8901 If the @code{Ceiling_Locking} policy is not in effect, the
8902 implementation should provide means for the application to specify which
8903 interrupts are to be blocked during protected actions, if the underlying
8904 system allows for a finer-grain control of interrupt blocking.
8905 @end cartouche
8906 Followed.  The underlying system does not allow for finer-grain control
8907 of interrupt blocking.
8908
8909 @cindex Protected procedure handlers
8910 @unnumberedsec C.3.1(20-21): Protected Procedure Handlers
8911 @sp 1
8912 @cartouche
8913 Whenever possible, the implementation should allow interrupt handlers to
8914 be called directly by the hardware.
8915 @end cartouche
8916 @c SGI info:
8917 @ignore
8918 This is never possible under IRIX, so this is followed by default.
8919 @end ignore
8920 Followed on any target where the underlying operating system permits
8921 such direct calls.
8922
8923 @sp 1
8924 @cartouche
8925 Whenever practical, violations of any
8926 implementation-defined restrictions should be detected before run time.
8927 @end cartouche
8928 Followed.  Compile time warnings are given when possible.
8929
8930 @cindex Package @code{Interrupts}
8931 @findex Interrupts
8932 @unnumberedsec C.3.2(25): Package @code{Interrupts}
8933
8934 @sp 1
8935 @cartouche
8936 If implementation-defined forms of interrupt handler procedures are
8937 supported, such as protected procedures with parameters, then for each
8938 such form of a handler, a type analogous to @code{Parameterless_Handler}
8939 should be specified in a child package of @code{Interrupts}, with the
8940 same operations as in the predefined package Interrupts.
8941 @end cartouche
8942 Followed.
8943
8944 @cindex Pre-elaboration requirements
8945 @unnumberedsec C.4(14): Pre-elaboration Requirements
8946 @sp 1
8947 @cartouche
8948 It is recommended that pre-elaborated packages be implemented in such a
8949 way that there should be little or no code executed at run time for the
8950 elaboration of entities not already covered by the Implementation
8951 Requirements.
8952 @end cartouche
8953 Followed.  Executable code is generated in some cases, e.g.@: loops
8954 to initialize large arrays.
8955
8956 @unnumberedsec C.5(8): Pragma @code{Discard_Names}
8957 @sp 1
8958 @cartouche
8959 If the pragma applies to an entity, then the implementation should
8960 reduce the amount of storage used for storing names associated with that
8961 entity.
8962 @end cartouche
8963 Followed.
8964
8965 @cindex Package @code{Task_Attributes}
8966 @findex Task_Attributes
8967 @unnumberedsec C.7.2(30): The Package Task_Attributes
8968 @sp 1
8969 @cartouche
8970 Some implementations are targeted to domains in which memory use at run
8971 time must be completely deterministic.  For such implementations, it is
8972 recommended that the storage for task attributes will be pre-allocated
8973 statically and not from the heap.  This can be accomplished by either
8974 placing restrictions on the number and the size of the task's
8975 attributes, or by using the pre-allocated storage for the first @var{N}
8976 attribute objects, and the heap for the others.  In the latter case,
8977 @var{N} should be documented.
8978 @end cartouche
8979 Not followed.  This implementation is not targeted to such a domain.
8980
8981 @cindex Locking Policies
8982 @unnumberedsec D.3(17): Locking Policies
8983
8984 @sp 1
8985 @cartouche
8986 The implementation should use names that end with @samp{_Locking} for
8987 locking policies defined by the implementation.
8988 @end cartouche
8989 Followed.  Two implementation-defined locking policies are defined,
8990 whose names (@code{Inheritance_Locking} and
8991 @code{Concurrent_Readers_Locking}) follow this suggestion.
8992
8993 @cindex Entry queuing policies
8994 @unnumberedsec D.4(16): Entry Queuing Policies
8995 @sp 1
8996 @cartouche
8997 Names that end with @samp{_Queuing} should be used
8998 for all implementation-defined queuing policies.
8999 @end cartouche
9000 Followed.  No such implementation-defined queuing policies exist.
9001
9002 @cindex Preemptive abort
9003 @unnumberedsec D.6(9-10): Preemptive Abort
9004 @sp 1
9005 @cartouche
9006 Even though the @code{abort_statement} is included in the list of
9007 potentially blocking operations (see 9.5.1), it is recommended that this
9008 statement be implemented in a way that never requires the task executing
9009 the @code{abort_statement} to block.
9010 @end cartouche
9011 Followed.
9012
9013 @sp 1
9014 @cartouche
9015 On a multi-processor, the delay associated with aborting a task on
9016 another processor should be bounded; the implementation should use
9017 periodic polling, if necessary, to achieve this.
9018 @end cartouche
9019 Followed.
9020
9021 @cindex Tasking restrictions
9022 @unnumberedsec D.7(21): Tasking Restrictions
9023 @sp 1
9024 @cartouche
9025 When feasible, the implementation should take advantage of the specified
9026 restrictions to produce a more efficient implementation.
9027 @end cartouche
9028 GNAT currently takes advantage of these restrictions by providing an optimized
9029 run time when the Ravenscar profile and the GNAT restricted run time set
9030 of restrictions are specified.  See pragma @code{Profile (Ravenscar)} and
9031 pragma @code{Profile (Restricted)} for more details.
9032
9033 @cindex Time, monotonic
9034 @unnumberedsec D.8(47-49): Monotonic Time
9035 @sp 1
9036 @cartouche
9037 When appropriate, implementations should provide configuration
9038 mechanisms to change the value of @code{Tick}.
9039 @end cartouche
9040 Such configuration mechanisms are not appropriate to this implementation
9041 and are thus not supported.
9042
9043 @sp 1
9044 @cartouche
9045 It is recommended that @code{Calendar.Clock} and @code{Real_Time.Clock}
9046 be implemented as transformations of the same time base.
9047 @end cartouche
9048 Followed.
9049
9050 @sp 1
9051 @cartouche
9052 It is recommended that the @dfn{best} time base which exists in
9053 the underlying system be available to the application through
9054 @code{Clock}.  @dfn{Best} may mean highest accuracy or largest range.
9055 @end cartouche
9056 Followed.
9057
9058 @cindex Partition communication subsystem
9059 @cindex PCS
9060 @unnumberedsec E.5(28-29): Partition Communication Subsystem
9061 @sp 1
9062 @cartouche
9063 Whenever possible, the PCS on the called partition should allow for
9064 multiple tasks to call the RPC-receiver with different messages and
9065 should allow them to block until the corresponding subprogram body
9066 returns.
9067 @end cartouche
9068 Followed by GLADE, a separately supplied PCS that can be used with
9069 GNAT.
9070
9071 @sp 1
9072 @cartouche
9073 The @code{Write} operation on a stream of type @code{Params_Stream_Type}
9074 should raise @code{Storage_Error} if it runs out of space trying to
9075 write the @code{Item} into the stream.
9076 @end cartouche
9077 Followed by GLADE, a separately supplied PCS that can be used with
9078 GNAT@.
9079
9080 @cindex COBOL support
9081 @unnumberedsec F(7): COBOL Support
9082 @sp 1
9083 @cartouche
9084 If COBOL (respectively, C) is widely supported in the target
9085 environment, implementations supporting the Information Systems Annex
9086 should provide the child package @code{Interfaces.COBOL} (respectively,
9087 @code{Interfaces.C}) specified in Annex B and should support a
9088 @code{convention_identifier} of COBOL (respectively, C) in the interfacing
9089 pragmas (see Annex B), thus allowing Ada programs to interface with
9090 programs written in that language.
9091 @end cartouche
9092 Followed.
9093
9094 @cindex Decimal radix support
9095 @unnumberedsec F.1(2): Decimal Radix Support
9096 @sp 1
9097 @cartouche
9098 Packed decimal should be used as the internal representation for objects
9099 of subtype @var{S} when @var{S}'Machine_Radix = 10.
9100 @end cartouche
9101 Not followed.  GNAT ignores @var{S}'Machine_Radix and always uses binary
9102 representations.
9103
9104 @cindex Numerics
9105 @unnumberedsec G: Numerics
9106 @sp 2
9107 @cartouche
9108 If Fortran (respectively, C) is widely supported in the target
9109 environment, implementations supporting the Numerics Annex
9110 should provide the child package @code{Interfaces.Fortran} (respectively,
9111 @code{Interfaces.C}) specified in Annex B and should support a
9112 @code{convention_identifier} of Fortran (respectively, C) in the interfacing
9113 pragmas (see Annex B), thus allowing Ada programs to interface with
9114 programs written in that language.
9115 @end cartouche
9116 Followed.
9117
9118 @cindex Complex types
9119 @unnumberedsec G.1.1(56-58): Complex Types
9120 @sp 2
9121 @cartouche
9122 Because the usual mathematical meaning of multiplication of a complex
9123 operand and a real operand is that of the scaling of both components of
9124 the former by the latter, an implementation should not perform this
9125 operation by first promoting the real operand to complex type and then
9126 performing a full complex multiplication.  In systems that, in the
9127 future, support an Ada binding to IEC 559:1989, the latter technique
9128 will not generate the required result when one of the components of the
9129 complex operand is infinite.  (Explicit multiplication of the infinite
9130 component by the zero component obtained during promotion yields a NaN
9131 that propagates into the final result.) Analogous advice applies in the
9132 case of multiplication of a complex operand and a pure-imaginary
9133 operand, and in the case of division of a complex operand by a real or
9134 pure-imaginary operand.
9135 @end cartouche
9136 Not followed.
9137
9138 @sp 1
9139 @cartouche
9140 Similarly, because the usual mathematical meaning of addition of a
9141 complex operand and a real operand is that the imaginary operand remains
9142 unchanged, an implementation should not perform this operation by first
9143 promoting the real operand to complex type and then performing a full
9144 complex addition.  In implementations in which the @code{Signed_Zeros}
9145 attribute of the component type is @code{True} (and which therefore
9146 conform to IEC 559:1989 in regard to the handling of the sign of zero in
9147 predefined arithmetic operations), the latter technique will not
9148 generate the required result when the imaginary component of the complex
9149 operand is a negatively signed zero.  (Explicit addition of the negative
9150 zero to the zero obtained during promotion yields a positive zero.)
9151 Analogous advice applies in the case of addition of a complex operand
9152 and a pure-imaginary operand, and in the case of subtraction of a
9153 complex operand and a real or pure-imaginary operand.
9154 @end cartouche
9155 Not followed.
9156
9157 @sp 1
9158 @cartouche
9159 Implementations in which @code{Real'Signed_Zeros} is @code{True} should
9160 attempt to provide a rational treatment of the signs of zero results and
9161 result components.  As one example, the result of the @code{Argument}
9162 function should have the sign of the imaginary component of the
9163 parameter @code{X} when the point represented by that parameter lies on
9164 the positive real axis; as another, the sign of the imaginary component
9165 of the @code{Compose_From_Polar} function should be the same as
9166 (respectively, the opposite of) that of the @code{Argument} parameter when that
9167 parameter has a value of zero and the @code{Modulus} parameter has a
9168 nonnegative (respectively, negative) value.
9169 @end cartouche
9170 Followed.
9171
9172 @cindex Complex elementary functions
9173 @unnumberedsec G.1.2(49): Complex Elementary Functions
9174 @sp 1
9175 @cartouche
9176 Implementations in which @code{Complex_Types.Real'Signed_Zeros} is
9177 @code{True} should attempt to provide a rational treatment of the signs
9178 of zero results and result components.  For example, many of the complex
9179 elementary functions have components that are odd functions of one of
9180 the parameter components; in these cases, the result component should
9181 have the sign of the parameter component at the origin.  Other complex
9182 elementary functions have zero components whose sign is opposite that of
9183 a parameter component at the origin, or is always positive or always
9184 negative.
9185 @end cartouche
9186 Followed.
9187
9188 @cindex Accuracy requirements
9189 @unnumberedsec G.2.4(19): Accuracy Requirements
9190 @sp 1
9191 @cartouche
9192 The versions of the forward trigonometric functions without a
9193 @code{Cycle} parameter should not be implemented by calling the
9194 corresponding version with a @code{Cycle} parameter of
9195 @code{2.0*Numerics.Pi}, since this will not provide the required
9196 accuracy in some portions of the domain.  For the same reason, the
9197 version of @code{Log} without a @code{Base} parameter should not be
9198 implemented by calling the corresponding version with a @code{Base}
9199 parameter of @code{Numerics.e}.
9200 @end cartouche
9201 Followed.
9202
9203 @cindex Complex arithmetic accuracy
9204 @cindex Accuracy, complex arithmetic
9205 @unnumberedsec G.2.6(15): Complex Arithmetic Accuracy
9206
9207 @sp 1
9208 @cartouche
9209 The version of the @code{Compose_From_Polar} function without a
9210 @code{Cycle} parameter should not be implemented by calling the
9211 corresponding version with a @code{Cycle} parameter of
9212 @code{2.0*Numerics.Pi}, since this will not provide the required
9213 accuracy in some portions of the domain.
9214 @end cartouche
9215 Followed.
9216
9217 @c -----------------------------------------
9218 @node Implementation Defined Characteristics
9219 @chapter Implementation Defined Characteristics
9220
9221 @noindent
9222 In addition to the implementation dependent pragmas and attributes, and the
9223 implementation advice, there are a number of other Ada features that are
9224 potentially implementation dependent and are designated as
9225 implementation-defined. These are mentioned throughout the Ada Reference
9226 Manual, and are summarized in Annex M@.
9227
9228 A requirement for conforming Ada compilers is that they provide
9229 documentation describing how the implementation deals with each of these
9230 issues.  In this chapter, you will find each point in Annex M listed
9231 followed by a description in italic font of how GNAT
9232 @c SGI info:
9233 @ignore
9234 in the ProDev Ada
9235 implementation on IRIX 5.3 operating system or greater
9236 @end ignore
9237 handles the implementation dependence.
9238
9239 You can use this chapter as a guide to minimizing implementation
9240 dependent features in your programs if portability to other compilers
9241 and other operating systems is an important consideration.  The numbers
9242 in each section below correspond to the paragraph number in the Ada
9243 Reference Manual.
9244
9245 @sp 1
9246 @cartouche
9247 @noindent
9248 @strong{2}.  Whether or not each recommendation given in Implementation
9249 Advice is followed.  See 1.1.2(37).
9250 @end cartouche
9251 @noindent
9252 @xref{Implementation Advice}.
9253
9254 @sp 1
9255 @cartouche
9256 @noindent
9257 @strong{3}.  Capacity limitations of the implementation.  See 1.1.3(3).
9258 @end cartouche
9259 @noindent
9260 The complexity of programs that can be processed is limited only by the
9261 total amount of available virtual memory, and disk space for the
9262 generated object files.
9263
9264 @sp 1
9265 @cartouche
9266 @noindent
9267 @strong{4}.  Variations from the standard that are impractical to avoid
9268 given the implementation's execution environment.  See 1.1.3(6).
9269 @end cartouche
9270 @noindent
9271 There are no variations from the standard.
9272
9273 @sp 1
9274 @cartouche
9275 @noindent
9276 @strong{5}.  Which @code{code_statement}s cause external
9277 interactions.  See 1.1.3(10).
9278 @end cartouche
9279 @noindent
9280 Any @code{code_statement} can potentially cause external interactions.
9281
9282 @sp 1
9283 @cartouche
9284 @noindent
9285 @strong{6}.  The coded representation for the text of an Ada
9286 program.  See 2.1(4).
9287 @end cartouche
9288 @noindent
9289 See separate section on source representation.
9290
9291 @sp 1
9292 @cartouche
9293 @noindent
9294 @strong{7}.  The control functions allowed in comments.  See 2.1(14).
9295 @end cartouche
9296 @noindent
9297 See separate section on source representation.
9298
9299 @sp 1
9300 @cartouche
9301 @noindent
9302 @strong{8}.  The representation for an end of line.  See 2.2(2).
9303 @end cartouche
9304 @noindent
9305 See separate section on source representation.
9306
9307 @sp 1
9308 @cartouche
9309 @noindent
9310 @strong{9}.  Maximum supported line length and lexical element
9311 length.  See 2.2(15).
9312 @end cartouche
9313 @noindent
9314 The maximum line length is 255 characters and the maximum length of a
9315 lexical element is also 255 characters.
9316
9317 @sp 1
9318 @cartouche
9319 @noindent
9320 @strong{10}.  Implementation defined pragmas.  See 2.8(14).
9321 @end cartouche
9322 @noindent
9323
9324 @xref{Implementation Defined Pragmas}.
9325
9326 @sp 1
9327 @cartouche
9328 @noindent
9329 @strong{11}.  Effect of pragma @code{Optimize}.  See 2.8(27).
9330 @end cartouche
9331 @noindent
9332 Pragma @code{Optimize}, if given with a @code{Time} or @code{Space}
9333 parameter, checks that the optimization flag is set, and aborts if it is
9334 not.
9335
9336 @sp 1
9337 @cartouche
9338 @noindent
9339 @strong{12}.  The sequence of characters of the value returned by
9340 @code{@var{S}'Image} when some of the graphic characters of
9341 @code{@var{S}'Wide_Image} are not defined in @code{Character}.  See
9342 3.5(37).
9343 @end cartouche
9344 @noindent
9345 The sequence of characters is as defined by the wide character encoding
9346 method used for the source.  See section on source representation for
9347 further details.
9348
9349 @sp 1
9350 @cartouche
9351 @noindent
9352 @strong{13}.  The predefined integer types declared in
9353 @code{Standard}.  See 3.5.4(25).
9354 @end cartouche
9355 @noindent
9356 @table @code
9357 @item Short_Short_Integer
9358 8 bit signed
9359 @item Short_Integer
9360 (Short) 16 bit signed
9361 @item Integer
9362 32 bit signed
9363 @item Long_Integer
9364 64 bit signed (on most 64 bit targets, depending on the C definition of long).
9365 32 bit signed (all other targets)
9366 @item Long_Long_Integer
9367 64 bit signed
9368 @end table
9369
9370 @sp 1
9371 @cartouche
9372 @noindent
9373 @strong{14}.  Any nonstandard integer types and the operators defined
9374 for them.  See 3.5.4(26).
9375 @end cartouche
9376 @noindent
9377 There are no nonstandard integer types.
9378
9379 @sp 1
9380 @cartouche
9381 @noindent
9382 @strong{15}.  Any nonstandard real types and the operators defined for
9383 them.  See 3.5.6(8).
9384 @end cartouche
9385 @noindent
9386 There are no nonstandard real types.
9387
9388 @sp 1
9389 @cartouche
9390 @noindent
9391 @strong{16}.  What combinations of requested decimal precision and range
9392 are supported for floating point types.  See 3.5.7(7).
9393 @end cartouche
9394 @noindent
9395 The precision and range is as defined by the IEEE standard.
9396
9397 @sp 1
9398 @cartouche
9399 @noindent
9400 @strong{17}.  The predefined floating point types declared in
9401 @code{Standard}.  See 3.5.7(16).
9402 @end cartouche
9403 @noindent
9404 @table @code
9405 @item Short_Float
9406 32 bit IEEE short
9407 @item Float
9408 (Short) 32 bit IEEE short
9409 @item Long_Float
9410 64 bit IEEE long
9411 @item Long_Long_Float
9412 64 bit IEEE long (80 bit IEEE long on x86 processors)
9413 @end table
9414
9415 @sp 1
9416 @cartouche
9417 @noindent
9418 @strong{18}.  The small of an ordinary fixed point type.  See 3.5.9(8).
9419 @end cartouche
9420 @noindent
9421 @code{Fine_Delta} is 2**(@minus{}63)
9422
9423 @sp 1
9424 @cartouche
9425 @noindent
9426 @strong{19}.  What combinations of small, range, and digits are
9427 supported for fixed point types.  See 3.5.9(10).
9428 @end cartouche
9429 @noindent
9430 Any combinations are permitted that do not result in a small less than
9431 @code{Fine_Delta} and do not result in a mantissa larger than 63 bits.
9432 If the mantissa is larger than 53 bits on machines where Long_Long_Float
9433 is 64 bits (true of all architectures except ia32), then the output from
9434 Text_IO is accurate to only 53 bits, rather than the full mantissa.  This
9435 is because floating-point conversions are used to convert fixed point.
9436
9437 @sp 1
9438 @cartouche
9439 @noindent
9440 @strong{20}.  The result of @code{Tags.Expanded_Name} for types declared
9441 within an unnamed @code{block_statement}.  See 3.9(10).
9442 @end cartouche
9443 @noindent
9444 Block numbers of the form @code{B@var{nnn}}, where @var{nnn} is a
9445 decimal integer are allocated.
9446
9447 @sp 1
9448 @cartouche
9449 @noindent
9450 @strong{21}.  Implementation-defined attributes.  See 4.1.4(12).
9451 @end cartouche
9452 @noindent
9453 @xref{Implementation Defined Attributes}.
9454
9455 @sp 1
9456 @cartouche
9457 @noindent
9458 @strong{22}.  Any implementation-defined time types.  See 9.6(6).
9459 @end cartouche
9460 @noindent
9461 There are no implementation-defined time types.
9462
9463 @sp 1
9464 @cartouche
9465 @noindent
9466 @strong{23}.  The time base associated with relative delays.
9467 @end cartouche
9468 @noindent
9469 See 9.6(20).  The time base used is that provided by the C library
9470 function @code{gettimeofday}.
9471
9472 @sp 1
9473 @cartouche
9474 @noindent
9475 @strong{24}.  The time base of the type @code{Calendar.Time}.  See
9476 9.6(23).
9477 @end cartouche
9478 @noindent
9479 The time base used is that provided by the C library function
9480 @code{gettimeofday}.
9481
9482 @sp 1
9483 @cartouche
9484 @noindent
9485 @strong{25}.  The time zone used for package @code{Calendar}
9486 operations.  See 9.6(24).
9487 @end cartouche
9488 @noindent
9489 The time zone used by package @code{Calendar} is the current system time zone
9490 setting for local time, as accessed by the C library function
9491 @code{localtime}.
9492
9493 @sp 1
9494 @cartouche
9495 @noindent
9496 @strong{26}.  Any limit on @code{delay_until_statements} of
9497 @code{select_statements}.  See 9.6(29).
9498 @end cartouche
9499 @noindent
9500 There are no such limits.
9501
9502 @sp 1
9503 @cartouche
9504 @noindent
9505 @strong{27}.  Whether or not two non-overlapping parts of a composite
9506 object are independently addressable, in the case where packing, record
9507 layout, or @code{Component_Size} is specified for the object.  See
9508 9.10(1).
9509 @end cartouche
9510 @noindent
9511 Separate components are independently addressable if they do not share
9512 overlapping storage units.
9513
9514 @sp 1
9515 @cartouche
9516 @noindent
9517 @strong{28}.  The representation for a compilation.  See 10.1(2).
9518 @end cartouche
9519 @noindent
9520 A compilation is represented by a sequence of files presented to the
9521 compiler in a single invocation of the @command{gcc} command.
9522
9523 @sp 1
9524 @cartouche
9525 @noindent
9526 @strong{29}.  Any restrictions on compilations that contain multiple
9527 compilation_units.  See 10.1(4).
9528 @end cartouche
9529 @noindent
9530 No single file can contain more than one compilation unit, but any
9531 sequence of files can be presented to the compiler as a single
9532 compilation.
9533
9534 @sp 1
9535 @cartouche
9536 @noindent
9537 @strong{30}.  The mechanisms for creating an environment and for adding
9538 and replacing compilation units.  See 10.1.4(3).
9539 @end cartouche
9540 @noindent
9541 See separate section on compilation model.
9542
9543 @sp 1
9544 @cartouche
9545 @noindent
9546 @strong{31}.  The manner of explicitly assigning library units to a
9547 partition.  See 10.2(2).
9548 @end cartouche
9549 @noindent
9550 If a unit contains an Ada main program, then the Ada units for the partition
9551 are determined by recursive application of the rules in the Ada Reference
9552 Manual section 10.2(2-6).  In other words, the Ada units will be those that
9553 are needed by the main program, and then this definition of need is applied
9554 recursively to those units, and the partition contains the transitive
9555 closure determined by this relationship.  In short, all the necessary units
9556 are included, with no need to explicitly specify the list.  If additional
9557 units are required, e.g.@: by foreign language units, then all units must be
9558 mentioned in the context clause of one of the needed Ada units.
9559
9560 If the partition contains no main program, or if the main program is in
9561 a language other than Ada, then GNAT
9562 provides the binder options @option{-z} and @option{-n} respectively, and in
9563 this case a list of units can be explicitly supplied to the binder for
9564 inclusion in the partition (all units needed by these units will also
9565 be included automatically).  For full details on the use of these
9566 options, refer to @ref{The GNAT Make Program gnatmake,,, gnat_ugn,
9567 @value{EDITION} User's Guide}.
9568
9569 @sp 1
9570 @cartouche
9571 @noindent
9572 @strong{32}.  The implementation-defined means, if any, of specifying
9573 which compilation units are needed by a given compilation unit.  See
9574 10.2(2).
9575 @end cartouche
9576 @noindent
9577 The units needed by a given compilation unit are as defined in
9578 the Ada Reference Manual section 10.2(2-6).  There are no
9579 implementation-defined pragmas or other implementation-defined
9580 means for specifying needed units.
9581
9582 @sp 1
9583 @cartouche
9584 @noindent
9585 @strong{33}.  The manner of designating the main subprogram of a
9586 partition.  See 10.2(7).
9587 @end cartouche
9588 @noindent
9589 The main program is designated by providing the name of the
9590 corresponding @file{ALI} file as the input parameter to the binder.
9591
9592 @sp 1
9593 @cartouche
9594 @noindent
9595 @strong{34}.  The order of elaboration of @code{library_items}.  See
9596 10.2(18).
9597 @end cartouche
9598 @noindent
9599 The first constraint on ordering is that it meets the requirements of
9600 Chapter 10 of the Ada Reference Manual.  This still leaves some
9601 implementation dependent choices, which are resolved by first
9602 elaborating bodies as early as possible (i.e., in preference to specs
9603 where there is a choice), and second by evaluating the immediate with
9604 clauses of a unit to determine the probably best choice, and
9605 third by elaborating in alphabetical order of unit names
9606 where a choice still remains.
9607
9608 @sp 1
9609 @cartouche
9610 @noindent
9611 @strong{35}.  Parameter passing and function return for the main
9612 subprogram.  See 10.2(21).
9613 @end cartouche
9614 @noindent
9615 The main program has no parameters.  It may be a procedure, or a function
9616 returning an integer type.  In the latter case, the returned integer
9617 value is the return code of the program (overriding any value that
9618 may have been set by a call to @code{Ada.Command_Line.Set_Exit_Status}).
9619
9620 @sp 1
9621 @cartouche
9622 @noindent
9623 @strong{36}.  The mechanisms for building and running partitions.  See
9624 10.2(24).
9625 @end cartouche
9626 @noindent
9627 GNAT itself supports programs with only a single partition.  The GNATDIST
9628 tool provided with the GLADE package (which also includes an implementation
9629 of the PCS) provides a completely flexible method for building and running
9630 programs consisting of multiple partitions.  See the separate GLADE manual
9631 for details.
9632
9633 @sp 1
9634 @cartouche
9635 @noindent
9636 @strong{37}.  The details of program execution, including program
9637 termination.  See 10.2(25).
9638 @end cartouche
9639 @noindent
9640 See separate section on compilation model.
9641
9642 @sp 1
9643 @cartouche
9644 @noindent
9645 @strong{38}.  The semantics of any non-active partitions supported by the
9646 implementation.  See 10.2(28).
9647 @end cartouche
9648 @noindent
9649 Passive partitions are supported on targets where shared memory is
9650 provided by the operating system.  See the GLADE reference manual for
9651 further details.
9652
9653 @sp 1
9654 @cartouche
9655 @noindent
9656 @strong{39}.  The information returned by @code{Exception_Message}.  See
9657 11.4.1(10).
9658 @end cartouche
9659 @noindent
9660 Exception message returns the null string unless a specific message has
9661 been passed by the program.
9662
9663 @sp 1
9664 @cartouche
9665 @noindent
9666 @strong{40}.  The result of @code{Exceptions.Exception_Name} for types
9667 declared within an unnamed @code{block_statement}.  See 11.4.1(12).
9668 @end cartouche
9669 @noindent
9670 Blocks have implementation defined names of the form @code{B@var{nnn}}
9671 where @var{nnn} is an integer.
9672
9673 @sp 1
9674 @cartouche
9675 @noindent
9676 @strong{41}.  The information returned by
9677 @code{Exception_Information}.  See 11.4.1(13).
9678 @end cartouche
9679 @noindent
9680 @code{Exception_Information} returns a string in the following format:
9681
9682 @smallexample
9683 @emph{Exception_Name:} nnnnn
9684 @emph{Message:} mmmmm
9685 @emph{PID:} ppp
9686 @emph{Call stack traceback locations:}
9687 0xhhhh 0xhhhh 0xhhhh ... 0xhhh
9688 @end smallexample
9689
9690 @noindent
9691 where
9692
9693 @itemize @bullet
9694 @item
9695 @code{nnnn} is the fully qualified name of the exception in all upper
9696 case letters. This line is always present.
9697
9698 @item
9699 @code{mmmm} is the message (this line present only if message is non-null)
9700
9701 @item
9702 @code{ppp} is the Process Id value as a decimal integer (this line is
9703 present only if the Process Id is nonzero). Currently we are
9704 not making use of this field.
9705
9706 @item
9707 The Call stack traceback locations line and the following values
9708 are present only if at least one traceback location was recorded.
9709 The values are given in C style format, with lower case letters
9710 for a-f, and only as many digits present as are necessary.
9711 @end itemize
9712
9713 @noindent
9714 The line terminator sequence at the end of each line, including
9715 the last line is a single @code{LF} character (@code{16#0A#}).
9716
9717 @sp 1
9718 @cartouche
9719 @noindent
9720 @strong{42}.  Implementation-defined check names.  See 11.5(27).
9721 @end cartouche
9722 @noindent
9723 The implementation defined check name Alignment_Check controls checking of
9724 address clause values for proper alignment (that is, the address supplied
9725 must be consistent with the alignment of the type).
9726
9727 In addition, a user program can add implementation-defined check names
9728 by means of the pragma Check_Name.
9729
9730 @sp 1
9731 @cartouche
9732 @noindent
9733 @strong{43}.  The interpretation of each aspect of representation.  See
9734 13.1(20).
9735 @end cartouche
9736 @noindent
9737 See separate section on data representations.
9738
9739 @sp 1
9740 @cartouche
9741 @noindent
9742 @strong{44}.  Any restrictions placed upon representation items.  See
9743 13.1(20).
9744 @end cartouche
9745 @noindent
9746 See separate section on data representations.
9747
9748 @sp 1
9749 @cartouche
9750 @noindent
9751 @strong{45}.  The meaning of @code{Size} for indefinite subtypes.  See
9752 13.3(48).
9753 @end cartouche
9754 @noindent
9755 Size for an indefinite subtype is the maximum possible size, except that
9756 for the case of a subprogram parameter, the size of the parameter object
9757 is the actual size.
9758
9759 @sp 1
9760 @cartouche
9761 @noindent
9762 @strong{46}.  The default external representation for a type tag.  See
9763 13.3(75).
9764 @end cartouche
9765 @noindent
9766 The default external representation for a type tag is the fully expanded
9767 name of the type in upper case letters.
9768
9769 @sp 1
9770 @cartouche
9771 @noindent
9772 @strong{47}.  What determines whether a compilation unit is the same in
9773 two different partitions.  See 13.3(76).
9774 @end cartouche
9775 @noindent
9776 A compilation unit is the same in two different partitions if and only
9777 if it derives from the same source file.
9778
9779 @sp 1
9780 @cartouche
9781 @noindent
9782 @strong{48}.  Implementation-defined components.  See 13.5.1(15).
9783 @end cartouche
9784 @noindent
9785 The only implementation defined component is the tag for a tagged type,
9786 which contains a pointer to the dispatching table.
9787
9788 @sp 1
9789 @cartouche
9790 @noindent
9791 @strong{49}.  If @code{Word_Size} = @code{Storage_Unit}, the default bit
9792 ordering.  See 13.5.3(5).
9793 @end cartouche
9794 @noindent
9795 @code{Word_Size} (32) is not the same as @code{Storage_Unit} (8) for this
9796 implementation, so no non-default bit ordering is supported.  The default
9797 bit ordering corresponds to the natural endianness of the target architecture.
9798
9799 @sp 1
9800 @cartouche
9801 @noindent
9802 @strong{50}.  The contents of the visible part of package @code{System}
9803 and its language-defined children.  See 13.7(2).
9804 @end cartouche
9805 @noindent
9806 See the definition of these packages in files @file{system.ads} and
9807 @file{s-stoele.ads}.
9808
9809 @sp 1
9810 @cartouche
9811 @noindent
9812 @strong{51}.  The contents of the visible part of package
9813 @code{System.Machine_Code}, and the meaning of
9814 @code{code_statements}.  See 13.8(7).
9815 @end cartouche
9816 @noindent
9817 See the definition and documentation in file @file{s-maccod.ads}.
9818
9819 @sp 1
9820 @cartouche
9821 @noindent
9822 @strong{52}.  The effect of unchecked conversion.  See 13.9(11).
9823 @end cartouche
9824 @noindent
9825 Unchecked conversion between types of the same size
9826 results in an uninterpreted transmission of the bits from one type
9827 to the other.  If the types are of unequal sizes, then in the case of
9828 discrete types, a shorter source is first zero or sign extended as
9829 necessary, and a shorter target is simply truncated on the left.
9830 For all non-discrete types, the source is first copied if necessary
9831 to ensure that the alignment requirements of the target are met, then
9832 a pointer is constructed to the source value, and the result is obtained
9833 by dereferencing this pointer after converting it to be a pointer to the
9834 target type. Unchecked conversions where the target subtype is an
9835 unconstrained array are not permitted. If the target alignment is
9836 greater than the source alignment, then a copy of the result is
9837 made with appropriate alignment
9838
9839 @sp 1
9840 @cartouche
9841 @noindent
9842 @strong{53}. The semantics of operations on invalid representations.
9843 See 13.9.2(10-11).
9844 @end cartouche
9845 @noindent
9846 For assignments and other operations where the use of invalid values cannot
9847 result in erroneous behavior, the compiler ignores the possibility of invalid
9848 values. An exception is raised at the point where an invalid value would
9849 result in erroneous behavior. For example executing:
9850
9851 @smallexample @c ada
9852 procedure invalidvals is
9853    X : Integer := -1;
9854    Y : Natural range 1 .. 10;
9855    for Y'Address use X'Address;
9856    Z : Natural range 1 .. 10;
9857    A : array (Natural range 1 .. 10) of Integer;
9858 begin
9859    Z := Y;     -- no exception
9860    A (Z) := 3; -- exception raised;
9861 end;
9862 @end smallexample
9863
9864 @noindent
9865 As indicated, an exception is raised on the array assignment, but not
9866 on the simple assignment of the invalid negative value from Y to Z.
9867
9868 @sp 1
9869 @cartouche
9870 @noindent
9871 @strong{53}.  The manner of choosing a storage pool for an access type
9872 when @code{Storage_Pool} is not specified for the type.  See 13.11(17).
9873 @end cartouche
9874 @noindent
9875 There are 3 different standard pools used by the compiler when
9876 @code{Storage_Pool} is not specified depending whether the type is local
9877 to a subprogram or defined at the library level and whether
9878 @code{Storage_Size}is specified or not.  See documentation in the runtime
9879 library units @code{System.Pool_Global}, @code{System.Pool_Size} and
9880 @code{System.Pool_Local} in files @file{s-poosiz.ads},
9881 @file{s-pooglo.ads} and @file{s-pooloc.ads} for full details on the
9882 default pools used.
9883
9884 @sp 1
9885 @cartouche
9886 @noindent
9887 @strong{54}.  Whether or not the implementation provides user-accessible
9888 names for the standard pool type(s).  See 13.11(17).
9889 @end cartouche
9890 @noindent
9891
9892 See documentation in the sources of the run time mentioned in paragraph
9893 @strong{53} .  All these pools are accessible by means of @code{with}'ing
9894 these units.
9895
9896 @sp 1
9897 @cartouche
9898 @noindent
9899 @strong{55}.  The meaning of @code{Storage_Size}.  See 13.11(18).
9900 @end cartouche
9901 @noindent
9902 @code{Storage_Size} is measured in storage units, and refers to the
9903 total space available for an access type collection, or to the primary
9904 stack space for a task.
9905
9906 @sp 1
9907 @cartouche
9908 @noindent
9909 @strong{56}.  Implementation-defined aspects of storage pools.  See
9910 13.11(22).
9911 @end cartouche
9912 @noindent
9913 See documentation in the sources of the run time mentioned in paragraph
9914 @strong{53} for details on GNAT-defined aspects of storage pools.
9915
9916 @sp 1
9917 @cartouche
9918 @noindent
9919 @strong{57}.  The set of restrictions allowed in a pragma
9920 @code{Restrictions}.  See 13.12(7).
9921 @end cartouche
9922 @noindent
9923 @xref{Implementation Defined Restrictions}.
9924
9925 @sp 1
9926 @cartouche
9927 @noindent
9928 @strong{58}.  The consequences of violating limitations on
9929 @code{Restrictions} pragmas.  See 13.12(9).
9930 @end cartouche
9931 @noindent
9932 Restrictions that can be checked at compile time result in illegalities
9933 if violated.  Currently there are no other consequences of violating
9934 restrictions.
9935
9936 @sp 1
9937 @cartouche
9938 @noindent
9939 @strong{59}.  The representation used by the @code{Read} and
9940 @code{Write} attributes of elementary types in terms of stream
9941 elements.  See 13.13.2(9).
9942 @end cartouche
9943 @noindent
9944 The representation is the in-memory representation of the base type of
9945 the type, using the number of bits corresponding to the
9946 @code{@var{type}'Size} value, and the natural ordering of the machine.
9947
9948 @sp 1
9949 @cartouche
9950 @noindent
9951 @strong{60}.  The names and characteristics of the numeric subtypes
9952 declared in the visible part of package @code{Standard}.  See A.1(3).
9953 @end cartouche
9954 @noindent
9955 See items describing the integer and floating-point types supported.
9956
9957 @sp 1
9958 @cartouche
9959 @noindent
9960 @strong{61}.  The accuracy actually achieved by the elementary
9961 functions.  See A.5.1(1).
9962 @end cartouche
9963 @noindent
9964 The elementary functions correspond to the functions available in the C
9965 library.  Only fast math mode is implemented.
9966
9967 @sp 1
9968 @cartouche
9969 @noindent
9970 @strong{62}.  The sign of a zero result from some of the operators or
9971 functions in @code{Numerics.Generic_Elementary_Functions}, when
9972 @code{Float_Type'Signed_Zeros} is @code{True}.  See A.5.1(46).
9973 @end cartouche
9974 @noindent
9975 The sign of zeroes follows the requirements of the IEEE 754 standard on
9976 floating-point.
9977
9978 @sp 1
9979 @cartouche
9980 @noindent
9981 @strong{63}.  The value of
9982 @code{Numerics.Float_Random.Max_Image_Width}.  See A.5.2(27).
9983 @end cartouche
9984 @noindent
9985 Maximum image width is 6864, see library file @file{s-rannum.ads}.
9986
9987 @sp 1
9988 @cartouche
9989 @noindent
9990 @strong{64}.  The value of
9991 @code{Numerics.Discrete_Random.Max_Image_Width}.  See A.5.2(27).
9992 @end cartouche
9993 @noindent
9994 Maximum image width is 6864, see library file @file{s-rannum.ads}.
9995
9996 @sp 1
9997 @cartouche
9998 @noindent
9999 @strong{65}.  The algorithms for random number generation.  See
10000 A.5.2(32).
10001 @end cartouche
10002 @noindent
10003 The algorithm is the Mersenne Twister, as documented in the source file
10004 @file{s-rannum.adb}. This version of the algorithm has a period of
10005 2**19937-1.
10006
10007 @sp 1
10008 @cartouche
10009 @noindent
10010 @strong{66}.  The string representation of a random number generator's
10011 state.  See A.5.2(38).
10012 @end cartouche
10013 @noindent
10014 The value returned by the Image function is the concatenation of
10015 the fixed-width decimal representations of the 624 32-bit integers
10016 of the state vector.
10017
10018 @sp 1
10019 @cartouche
10020 @noindent
10021 @strong{67}.  The minimum time interval between calls to the
10022 time-dependent Reset procedure that are guaranteed to initiate different
10023 random number sequences.  See A.5.2(45).
10024 @end cartouche
10025 @noindent
10026 The minimum period between reset calls to guarantee distinct series of
10027 random numbers is one microsecond.
10028
10029 @sp 1
10030 @cartouche
10031 @noindent
10032 @strong{68}.  The values of the @code{Model_Mantissa},
10033 @code{Model_Emin}, @code{Model_Epsilon}, @code{Model},
10034 @code{Safe_First}, and @code{Safe_Last} attributes, if the Numerics
10035 Annex is not supported.  See A.5.3(72).
10036 @end cartouche
10037 @noindent
10038 Run the compiler with @option{-gnatS} to produce a listing of package
10039 @code{Standard}, has the values of all numeric attributes.
10040
10041 @sp 1
10042 @cartouche
10043 @noindent
10044 @strong{69}.  Any implementation-defined characteristics of the
10045 input-output packages.  See A.7(14).
10046 @end cartouche
10047 @noindent
10048 There are no special implementation defined characteristics for these
10049 packages.
10050
10051 @sp 1
10052 @cartouche
10053 @noindent
10054 @strong{70}.  The value of @code{Buffer_Size} in @code{Storage_IO}.  See
10055 A.9(10).
10056 @end cartouche
10057 @noindent
10058 All type representations are contiguous, and the @code{Buffer_Size} is
10059 the value of @code{@var{type}'Size} rounded up to the next storage unit
10060 boundary.
10061
10062 @sp 1
10063 @cartouche
10064 @noindent
10065 @strong{71}.  External files for standard input, standard output, and
10066 standard error See A.10(5).
10067 @end cartouche
10068 @noindent
10069 These files are mapped onto the files provided by the C streams
10070 libraries.  See source file @file{i-cstrea.ads} for further details.
10071
10072 @sp 1
10073 @cartouche
10074 @noindent
10075 @strong{72}.  The accuracy of the value produced by @code{Put}.  See
10076 A.10.9(36).
10077 @end cartouche
10078 @noindent
10079 If more digits are requested in the output than are represented by the
10080 precision of the value, zeroes are output in the corresponding least
10081 significant digit positions.
10082
10083 @sp 1
10084 @cartouche
10085 @noindent
10086 @strong{73}.  The meaning of @code{Argument_Count}, @code{Argument}, and
10087 @code{Command_Name}.  See A.15(1).
10088 @end cartouche
10089 @noindent
10090 These are mapped onto the @code{argv} and @code{argc} parameters of the
10091 main program in the natural manner.
10092
10093 @sp 1
10094 @cartouche
10095 @noindent
10096 @strong{74}.  The interpretation of the @code{Form} parameter in procedure
10097 @code{Create_Directory}.  See A.16(56).
10098 @end cartouche
10099 @noindent
10100 The @code{Form} parameter is not used.
10101
10102 @sp 1
10103 @cartouche
10104 @noindent
10105 @strong{75}.  The interpretation of the @code{Form} parameter in procedure
10106 @code{Create_Path}.  See A.16(60).
10107 @end cartouche
10108 @noindent
10109 The @code{Form} parameter is not used.
10110
10111 @sp 1
10112 @cartouche
10113 @noindent
10114 @strong{76}.  The interpretation of the @code{Form} parameter in procedure
10115 @code{Copy_File}.  See A.16(68).
10116 @end cartouche
10117 @noindent
10118 The @code{Form} parameter is case-insensitive.
10119
10120 Two fields are recognized in the @code{Form} parameter:
10121
10122 @table @code
10123
10124 @item preserve=<value>
10125
10126 @item mode=<value>
10127
10128 @end table
10129
10130 @noindent
10131 <value> starts immediately after the character '=' and ends with the
10132 character immediately preceding the next comma (',') or with the last
10133 character of the parameter.
10134
10135 The only possible values for preserve= are:
10136
10137 @table @code
10138
10139 @item no_attributes
10140 Do not try to preserve any file attributes. This is the default if no
10141 preserve= is found in Form.
10142
10143 @item all_attributes
10144 Try to preserve all file attributes (timestamps, access rights).
10145
10146 @item timestamps
10147 Preserve the timestamp of the copied file, but not the other file attributes.
10148
10149 @end table
10150
10151 @noindent
10152 The only possible values for mode= are:
10153
10154 @table @code
10155
10156 @item copy
10157 Only do the copy if the destination file does not already exist. If it already
10158 exists, Copy_File fails.
10159
10160 @item overwrite
10161 Copy the file in all cases. Overwrite an already existing destination file.
10162
10163 @item append
10164 Append the original file to the destination file. If the destination file does
10165 not exist, the destination file is a copy of the source file. When mode=append,
10166 the field preserve=, if it exists, is not taken into account.
10167
10168 @end table
10169
10170 @noindent
10171 If the Form parameter includes one or both of the fields and the value or
10172 values are incorrect, Copy_file fails with Use_Error.
10173
10174 Examples of correct Forms:
10175
10176 @smallexample
10177 Form => "preserve=no_attributes,mode=overwrite" (the default)
10178 Form => "mode=append"
10179 Form => "mode=copy, preserve=all_attributes"
10180 @end smallexample
10181
10182 @noindent
10183 Examples of incorrect Forms
10184
10185 @smallexample
10186 Form => "preserve=junk"
10187 Form => "mode=internal, preserve=timestamps"
10188 @end smallexample
10189
10190 @sp 1
10191 @cartouche
10192 @noindent
10193 @strong{77}.  Implementation-defined convention names.  See B.1(11).
10194 @end cartouche
10195 @noindent
10196 The following convention names are supported
10197
10198 @table @code
10199 @item  Ada
10200 Ada
10201 @item Ada_Pass_By_Copy
10202 Allowed for any types except by-reference types such as limited
10203 records. Compatible with convention Ada, but causes any parameters
10204 with this convention to be passed by copy.
10205 @item Ada_Pass_By_Reference
10206 Allowed for any types except by-copy types such as scalars.
10207 Compatible with convention Ada, but causes any parameters
10208 with this convention to be passed by reference.
10209 @item Assembler
10210 Assembly language
10211 @item Asm
10212 Synonym for Assembler
10213 @item Assembly
10214 Synonym for Assembler
10215 @item C
10216 C
10217 @item C_Pass_By_Copy
10218 Allowed only for record types, like C, but also notes that record
10219 is to be passed by copy rather than reference.
10220 @item COBOL
10221 COBOL
10222 @item C_Plus_Plus (or CPP)
10223 C++
10224 @item Default
10225 Treated the same as C
10226 @item External
10227 Treated the same as C
10228 @item Fortran
10229 Fortran
10230 @item Intrinsic
10231 For support of pragma @code{Import} with convention Intrinsic, see
10232 separate section on Intrinsic Subprograms.
10233 @item Stdcall
10234 Stdcall (used for Windows implementations only).  This convention correspond
10235 to the WINAPI (previously called Pascal convention) C/C++ convention under
10236 Windows.  A routine with this convention cleans the stack before
10237 exit. This pragma cannot be applied to a dispatching call.
10238 @item DLL
10239 Synonym for Stdcall
10240 @item Win32
10241 Synonym for Stdcall
10242 @item Stubbed
10243 Stubbed is a special convention used to indicate that the body of the
10244 subprogram will be entirely ignored.  Any call to the subprogram
10245 is converted into a raise of the @code{Program_Error} exception.  If a
10246 pragma @code{Import} specifies convention @code{stubbed} then no body need
10247 be present at all.  This convention is useful during development for the
10248 inclusion of subprograms whose body has not yet been written.
10249
10250 @end table
10251 @noindent
10252 In addition, all otherwise unrecognized convention names are also
10253 treated as being synonymous with convention C@.  In all implementations
10254 except for VMS, use of such other names results in a warning.  In VMS
10255 implementations, these names are accepted silently.
10256
10257 @sp 1
10258 @cartouche
10259 @noindent
10260 @strong{78}.  The meaning of link names.  See B.1(36).
10261 @end cartouche
10262 @noindent
10263 Link names are the actual names used by the linker.
10264
10265 @sp 1
10266 @cartouche
10267 @noindent
10268 @strong{79}.  The manner of choosing link names when neither the link
10269 name nor the address of an imported or exported entity is specified.  See
10270 B.1(36).
10271 @end cartouche
10272 @noindent
10273 The default linker name is that which would be assigned by the relevant
10274 external language, interpreting the Ada name as being in all lower case
10275 letters.
10276
10277 @sp 1
10278 @cartouche
10279 @noindent
10280 @strong{80}.  The effect of pragma @code{Linker_Options}.  See B.1(37).
10281 @end cartouche
10282 @noindent
10283 The string passed to @code{Linker_Options} is presented uninterpreted as
10284 an argument to the link command, unless it contains ASCII.NUL characters.
10285 NUL characters if they appear act as argument separators, so for example
10286
10287 @smallexample @c ada
10288 pragma Linker_Options ("-labc" & ASCII.NUL & "-ldef");
10289 @end smallexample
10290
10291 @noindent
10292 causes two separate arguments @code{-labc} and @code{-ldef} to be passed to the
10293 linker. The order of linker options is preserved for a given unit. The final
10294 list of options passed to the linker is in reverse order of the elaboration
10295 order. For example, linker options for a body always appear before the options
10296 from the corresponding package spec.
10297
10298 @sp 1
10299 @cartouche
10300 @noindent
10301 @strong{81}.  The contents of the visible part of package
10302 @code{Interfaces} and its language-defined descendants.  See B.2(1).
10303 @end cartouche
10304 @noindent
10305 See files with prefix @file{i-} in the distributed library.
10306
10307 @sp 1
10308 @cartouche
10309 @noindent
10310 @strong{82}.  Implementation-defined children of package
10311 @code{Interfaces}.  The contents of the visible part of package
10312 @code{Interfaces}.  See B.2(11).
10313 @end cartouche
10314 @noindent
10315 See files with prefix @file{i-} in the distributed library.
10316
10317 @sp 1
10318 @cartouche
10319 @noindent
10320 @strong{83}.  The types @code{Floating}, @code{Long_Floating},
10321 @code{Binary}, @code{Long_Binary}, @code{Decimal_ Element}, and
10322 @code{COBOL_Character}; and the initialization of the variables
10323 @code{Ada_To_COBOL} and @code{COBOL_To_Ada}, in
10324 @code{Interfaces.COBOL}.  See B.4(50).
10325 @end cartouche
10326 @noindent
10327 @table @code
10328 @item Floating
10329 Float
10330 @item Long_Floating
10331 (Floating) Long_Float
10332 @item Binary
10333 Integer
10334 @item Long_Binary
10335 Long_Long_Integer
10336 @item Decimal_Element
10337 Character
10338 @item COBOL_Character
10339 Character
10340 @end table
10341
10342 @noindent
10343 For initialization, see the file @file{i-cobol.ads} in the distributed library.
10344
10345 @sp 1
10346 @cartouche
10347 @noindent
10348 @strong{84}.  Support for access to machine instructions.  See C.1(1).
10349 @end cartouche
10350 @noindent
10351 See documentation in file @file{s-maccod.ads} in the distributed library.
10352
10353 @sp 1
10354 @cartouche
10355 @noindent
10356 @strong{85}.  Implementation-defined aspects of access to machine
10357 operations.  See C.1(9).
10358 @end cartouche
10359 @noindent
10360 See documentation in file @file{s-maccod.ads} in the distributed library.
10361
10362 @sp 1
10363 @cartouche
10364 @noindent
10365 @strong{86}.  Implementation-defined aspects of interrupts.  See C.3(2).
10366 @end cartouche
10367 @noindent
10368 Interrupts are mapped to signals or conditions as appropriate.  See
10369 definition of unit
10370 @code{Ada.Interrupt_Names} in source file @file{a-intnam.ads} for details
10371 on the interrupts supported on a particular target.
10372
10373 @sp 1
10374 @cartouche
10375 @noindent
10376 @strong{87}.  Implementation-defined aspects of pre-elaboration.  See
10377 C.4(13).
10378 @end cartouche
10379 @noindent
10380 GNAT does not permit a partition to be restarted without reloading,
10381 except under control of the debugger.
10382
10383 @sp 1
10384 @cartouche
10385 @noindent
10386 @strong{88}.  The semantics of pragma @code{Discard_Names}.  See C.5(7).
10387 @end cartouche
10388 @noindent
10389 Pragma @code{Discard_Names} causes names of enumeration literals to
10390 be suppressed.  In the presence of this pragma, the Image attribute
10391 provides the image of the Pos of the literal, and Value accepts
10392 Pos values.
10393
10394 @sp 1
10395 @cartouche
10396 @noindent
10397 @strong{89}.  The result of the @code{Task_Identification.Image}
10398 attribute.  See C.7.1(7).
10399 @end cartouche
10400 @noindent
10401 The result of this attribute is a string that identifies
10402 the object or component that denotes a given task. If a variable @code{Var}
10403 has a task type, the image for this task will have the form @code{Var_@var{XXXXXXXX}},
10404 where the suffix
10405 is the hexadecimal representation of the virtual address of the corresponding
10406 task control block. If the variable is an array of tasks, the image of each
10407 task will have the form of an indexed component indicating the position of a
10408 given task in the array, e.g.@: @code{Group(5)_@var{XXXXXXX}}. If the task is a
10409 component of a record, the image of the task will have the form of a selected
10410 component. These rules are fully recursive, so that the image of a task that
10411 is a subcomponent of a composite object corresponds to the expression that
10412 designates this task.
10413 @noindent
10414 If a task is created by an allocator, its image depends on the context. If the
10415 allocator is part of an object declaration, the rules described above are used
10416 to construct its image, and this image is not affected by subsequent
10417 assignments. If the allocator appears within an expression, the image
10418 includes only the name of the task type.
10419 @noindent
10420 If the configuration pragma Discard_Names is present, or if the restriction
10421 No_Implicit_Heap_Allocation is in effect,  the image reduces to
10422 the numeric suffix, that is to say the hexadecimal representation of the
10423 virtual address of the control block of the task.
10424 @sp 1
10425 @cartouche
10426 @noindent
10427 @strong{90}.  The value of @code{Current_Task} when in a protected entry
10428 or interrupt handler.  See C.7.1(17).
10429 @end cartouche
10430 @noindent
10431 Protected entries or interrupt handlers can be executed by any
10432 convenient thread, so the value of @code{Current_Task} is undefined.
10433
10434 @sp 1
10435 @cartouche
10436 @noindent
10437 @strong{91}.  The effect of calling @code{Current_Task} from an entry
10438 body or interrupt handler.  See C.7.1(19).
10439 @end cartouche
10440 @noindent
10441 The effect of calling @code{Current_Task} from an entry body or
10442 interrupt handler is to return the identification of the task currently
10443 executing the code.
10444
10445 @sp 1
10446 @cartouche
10447 @noindent
10448 @strong{92}.  Implementation-defined aspects of
10449 @code{Task_Attributes}.  See C.7.2(19).
10450 @end cartouche
10451 @noindent
10452 There are no implementation-defined aspects of @code{Task_Attributes}.
10453
10454 @sp 1
10455 @cartouche
10456 @noindent
10457 @strong{93}.  Values of all @code{Metrics}.  See D(2).
10458 @end cartouche
10459 @noindent
10460 The metrics information for GNAT depends on the performance of the
10461 underlying operating system.  The sources of the run-time for tasking
10462 implementation, together with the output from @option{-gnatG} can be
10463 used to determine the exact sequence of operating systems calls made
10464 to implement various tasking constructs.  Together with appropriate
10465 information on the performance of the underlying operating system,
10466 on the exact target in use, this information can be used to determine
10467 the required metrics.
10468
10469 @sp 1
10470 @cartouche
10471 @noindent
10472 @strong{94}.  The declarations of @code{Any_Priority} and
10473 @code{Priority}.  See D.1(11).
10474 @end cartouche
10475 @noindent
10476 See declarations in file @file{system.ads}.
10477
10478 @sp 1
10479 @cartouche
10480 @noindent
10481 @strong{95}.  Implementation-defined execution resources.  See D.1(15).
10482 @end cartouche
10483 @noindent
10484 There are no implementation-defined execution resources.
10485
10486 @sp 1
10487 @cartouche
10488 @noindent
10489 @strong{96}.  Whether, on a multiprocessor, a task that is waiting for
10490 access to a protected object keeps its processor busy.  See D.2.1(3).
10491 @end cartouche
10492 @noindent
10493 On a multi-processor, a task that is waiting for access to a protected
10494 object does not keep its processor busy.
10495
10496 @sp 1
10497 @cartouche
10498 @noindent
10499 @strong{97}.  The affect of implementation defined execution resources
10500 on task dispatching.  See D.2.1(9).
10501 @end cartouche
10502 @noindent
10503 @c SGI info
10504 @ignore
10505 Tasks map to IRIX threads, and the dispatching policy is as defined by
10506 the IRIX implementation of threads.
10507 @end ignore
10508 Tasks map to threads in the threads package used by GNAT@.  Where possible
10509 and appropriate, these threads correspond to native threads of the
10510 underlying operating system.
10511
10512 @sp 1
10513 @cartouche
10514 @noindent
10515 @strong{98}.  Implementation-defined @code{policy_identifiers} allowed
10516 in a pragma @code{Task_Dispatching_Policy}.  See D.2.2(3).
10517 @end cartouche
10518 @noindent
10519 There are no implementation-defined policy-identifiers allowed in this
10520 pragma.
10521
10522 @sp 1
10523 @cartouche
10524 @noindent
10525 @strong{99}.  Implementation-defined aspects of priority inversion.  See
10526 D.2.2(16).
10527 @end cartouche
10528 @noindent
10529 Execution of a task cannot be preempted by the implementation processing
10530 of delay expirations for lower priority tasks.
10531
10532 @sp 1
10533 @cartouche
10534 @noindent
10535 @strong{100}.  Implementation-defined task dispatching.  See D.2.2(18).
10536 @end cartouche
10537 @noindent
10538 @c SGI info:
10539 @ignore
10540 Tasks map to IRIX threads, and the dispatching policy is as defined by
10541 the IRIX implementation of threads.
10542 @end ignore
10543 The policy is the same as that of the underlying threads implementation.
10544
10545 @sp 1
10546 @cartouche
10547 @noindent
10548 @strong{101}.  Implementation-defined @code{policy_identifiers} allowed
10549 in a pragma @code{Locking_Policy}.  See D.3(4).
10550 @end cartouche
10551 @noindent
10552 The two implementation defined policies permitted in GNAT are
10553 @code{Inheritance_Locking} and  @code{Conccurent_Readers_Locking}.  On
10554 targets that support the @code{Inheritance_Locking} policy, locking is
10555 implemented by inheritance, i.e.@: the task owning the lock operates
10556 at a priority equal to the highest priority of any task currently
10557 requesting the lock.  On targets that support the
10558 @code{Conccurent_Readers_Locking} policy, locking is implemented with a
10559 read/write lock allowing multiple propected object functions to enter
10560 concurrently.
10561
10562 @sp 1
10563 @cartouche
10564 @noindent
10565 @strong{102}.  Default ceiling priorities.  See D.3(10).
10566 @end cartouche
10567 @noindent
10568 The ceiling priority of protected objects of the type
10569 @code{System.Interrupt_Priority'Last} as described in the Ada
10570 Reference Manual D.3(10),
10571
10572 @sp 1
10573 @cartouche
10574 @noindent
10575 @strong{103}.  The ceiling of any protected object used internally by
10576 the implementation.  See D.3(16).
10577 @end cartouche
10578 @noindent
10579 The ceiling priority of internal protected objects is
10580 @code{System.Priority'Last}.
10581
10582 @sp 1
10583 @cartouche
10584 @noindent
10585 @strong{104}.  Implementation-defined queuing policies.  See D.4(1).
10586 @end cartouche
10587 @noindent
10588 There are no implementation-defined queuing policies.
10589
10590 @sp 1
10591 @cartouche
10592 @noindent
10593 @strong{105}.  On a multiprocessor, any conditions that cause the
10594 completion of an aborted construct to be delayed later than what is
10595 specified for a single processor.  See D.6(3).
10596 @end cartouche
10597 @noindent
10598 The semantics for abort on a multi-processor is the same as on a single
10599 processor, there are no further delays.
10600
10601 @sp 1
10602 @cartouche
10603 @noindent
10604 @strong{106}.  Any operations that implicitly require heap storage
10605 allocation.  See D.7(8).
10606 @end cartouche
10607 @noindent
10608 The only operation that implicitly requires heap storage allocation is
10609 task creation.
10610
10611 @sp 1
10612 @cartouche
10613 @noindent
10614 @strong{107}.  Implementation-defined aspects of pragma
10615 @code{Restrictions}.  See D.7(20).
10616 @end cartouche
10617 @noindent
10618 There are no such implementation-defined aspects.
10619
10620 @sp 1
10621 @cartouche
10622 @noindent
10623 @strong{108}.  Implementation-defined aspects of package
10624 @code{Real_Time}.  See D.8(17).
10625 @end cartouche
10626 @noindent
10627 There are no implementation defined aspects of package @code{Real_Time}.
10628
10629 @sp 1
10630 @cartouche
10631 @noindent
10632 @strong{109}.  Implementation-defined aspects of
10633 @code{delay_statements}.  See D.9(8).
10634 @end cartouche
10635 @noindent
10636 Any difference greater than one microsecond will cause the task to be
10637 delayed (see D.9(7)).
10638
10639 @sp 1
10640 @cartouche
10641 @noindent
10642 @strong{110}.  The upper bound on the duration of interrupt blocking
10643 caused by the implementation.  See D.12(5).
10644 @end cartouche
10645 @noindent
10646 The upper bound is determined by the underlying operating system.  In
10647 no cases is it more than 10 milliseconds.
10648
10649 @sp 1
10650 @cartouche
10651 @noindent
10652 @strong{111}.  The means for creating and executing distributed
10653 programs.  See E(5).
10654 @end cartouche
10655 @noindent
10656 The GLADE package provides a utility GNATDIST for creating and executing
10657 distributed programs.  See the GLADE reference manual for further details.
10658
10659 @sp 1
10660 @cartouche
10661 @noindent
10662 @strong{112}.  Any events that can result in a partition becoming
10663 inaccessible.  See E.1(7).
10664 @end cartouche
10665 @noindent
10666 See the GLADE reference manual for full details on such events.
10667
10668 @sp 1
10669 @cartouche
10670 @noindent
10671 @strong{113}.  The scheduling policies, treatment of priorities, and
10672 management of shared resources between partitions in certain cases.  See
10673 E.1(11).
10674 @end cartouche
10675 @noindent
10676 See the GLADE reference manual for full details on these aspects of
10677 multi-partition execution.
10678
10679 @sp 1
10680 @cartouche
10681 @noindent
10682 @strong{114}.  Events that cause the version of a compilation unit to
10683 change.  See E.3(5).
10684 @end cartouche
10685 @noindent
10686 Editing the source file of a compilation unit, or the source files of
10687 any units on which it is dependent in a significant way cause the version
10688 to change.  No other actions cause the version number to change.  All changes
10689 are significant except those which affect only layout, capitalization or
10690 comments.
10691
10692 @sp 1
10693 @cartouche
10694 @noindent
10695 @strong{115}.  Whether the execution of the remote subprogram is
10696 immediately aborted as a result of cancellation.  See E.4(13).
10697 @end cartouche
10698 @noindent
10699 See the GLADE reference manual for details on the effect of abort in
10700 a distributed application.
10701
10702 @sp 1
10703 @cartouche
10704 @noindent
10705 @strong{116}.  Implementation-defined aspects of the PCS@.  See E.5(25).
10706 @end cartouche
10707 @noindent
10708 See the GLADE reference manual for a full description of all implementation
10709 defined aspects of the PCS@.
10710
10711 @sp 1
10712 @cartouche
10713 @noindent
10714 @strong{117}.  Implementation-defined interfaces in the PCS@.  See
10715 E.5(26).
10716 @end cartouche
10717 @noindent
10718 See the GLADE reference manual for a full description of all
10719 implementation defined interfaces.
10720
10721 @sp 1
10722 @cartouche
10723 @noindent
10724 @strong{118}.  The values of named numbers in the package
10725 @code{Decimal}.  See F.2(7).
10726 @end cartouche
10727 @noindent
10728 @table @code
10729 @item Max_Scale
10730 +18
10731 @item Min_Scale
10732 -18
10733 @item Min_Delta
10734 1.0E-18
10735 @item Max_Delta
10736 1.0E+18
10737 @item Max_Decimal_Digits
10738 18
10739 @end table
10740
10741 @sp 1
10742 @cartouche
10743 @noindent
10744 @strong{119}.  The value of @code{Max_Picture_Length} in the package
10745 @code{Text_IO.Editing}.  See F.3.3(16).
10746 @end cartouche
10747 @noindent
10748 64
10749
10750 @sp 1
10751 @cartouche
10752 @noindent
10753 @strong{120}.  The value of @code{Max_Picture_Length} in the package
10754 @code{Wide_Text_IO.Editing}.  See F.3.4(5).
10755 @end cartouche
10756 @noindent
10757 64
10758
10759 @sp 1
10760 @cartouche
10761 @noindent
10762 @strong{121}.  The accuracy actually achieved by the complex elementary
10763 functions and by other complex arithmetic operations.  See G.1(1).
10764 @end cartouche
10765 @noindent
10766 Standard library functions are used for the complex arithmetic
10767 operations.  Only fast math mode is currently supported.
10768
10769 @sp 1
10770 @cartouche
10771 @noindent
10772 @strong{122}.  The sign of a zero result (or a component thereof) from
10773 any operator or function in @code{Numerics.Generic_Complex_Types}, when
10774 @code{Real'Signed_Zeros} is True.  See G.1.1(53).
10775 @end cartouche
10776 @noindent
10777 The signs of zero values are as recommended by the relevant
10778 implementation advice.
10779
10780 @sp 1
10781 @cartouche
10782 @noindent
10783 @strong{123}.  The sign of a zero result (or a component thereof) from
10784 any operator or function in
10785 @code{Numerics.Generic_Complex_Elementary_Functions}, when
10786 @code{Real'Signed_Zeros} is @code{True}.  See G.1.2(45).
10787 @end cartouche
10788 @noindent
10789 The signs of zero values are as recommended by the relevant
10790 implementation advice.
10791
10792 @sp 1
10793 @cartouche
10794 @noindent
10795 @strong{124}.  Whether the strict mode or the relaxed mode is the
10796 default.  See G.2(2).
10797 @end cartouche
10798 @noindent
10799 The strict mode is the default.  There is no separate relaxed mode.  GNAT
10800 provides a highly efficient implementation of strict mode.
10801
10802 @sp 1
10803 @cartouche
10804 @noindent
10805 @strong{125}.  The result interval in certain cases of fixed-to-float
10806 conversion.  See G.2.1(10).
10807 @end cartouche
10808 @noindent
10809 For cases where the result interval is implementation dependent, the
10810 accuracy is that provided by performing all operations in 64-bit IEEE
10811 floating-point format.
10812
10813 @sp 1
10814 @cartouche
10815 @noindent
10816 @strong{126}.  The result of a floating point arithmetic operation in
10817 overflow situations, when the @code{Machine_Overflows} attribute of the
10818 result type is @code{False}.  See G.2.1(13).
10819 @end cartouche
10820 @noindent
10821 Infinite and NaN values are produced as dictated by the IEEE
10822 floating-point standard.
10823
10824 Note that on machines that are not fully compliant with the IEEE
10825 floating-point standard, such as Alpha, the @option{-mieee} compiler flag
10826 must be used for achieving IEEE conforming behavior (although at the cost
10827 of a significant performance penalty), so infinite and NaN values are
10828 properly generated.
10829
10830 @sp 1
10831 @cartouche
10832 @noindent
10833 @strong{127}.  The result interval for division (or exponentiation by a
10834 negative exponent), when the floating point hardware implements division
10835 as multiplication by a reciprocal.  See G.2.1(16).
10836 @end cartouche
10837 @noindent
10838 Not relevant, division is IEEE exact.
10839
10840 @sp 1
10841 @cartouche
10842 @noindent
10843 @strong{128}.  The definition of close result set, which determines the
10844 accuracy of certain fixed point multiplications and divisions.  See
10845 G.2.3(5).
10846 @end cartouche
10847 @noindent
10848 Operations in the close result set are performed using IEEE long format
10849 floating-point arithmetic.  The input operands are converted to
10850 floating-point, the operation is done in floating-point, and the result
10851 is converted to the target type.
10852
10853 @sp 1
10854 @cartouche
10855 @noindent
10856 @strong{129}.  Conditions on a @code{universal_real} operand of a fixed
10857 point multiplication or division for which the result shall be in the
10858 perfect result set.  See G.2.3(22).
10859 @end cartouche
10860 @noindent
10861 The result is only defined to be in the perfect result set if the result
10862 can be computed by a single scaling operation involving a scale factor
10863 representable in 64-bits.
10864
10865 @sp 1
10866 @cartouche
10867 @noindent
10868 @strong{130}.  The result of a fixed point arithmetic operation in
10869 overflow situations, when the @code{Machine_Overflows} attribute of the
10870 result type is @code{False}.  See G.2.3(27).
10871 @end cartouche
10872 @noindent
10873 Not relevant, @code{Machine_Overflows} is @code{True} for fixed-point
10874 types.
10875
10876 @sp 1
10877 @cartouche
10878 @noindent
10879 @strong{131}.  The result of an elementary function reference in
10880 overflow situations, when the @code{Machine_Overflows} attribute of the
10881 result type is @code{False}.  See G.2.4(4).
10882 @end cartouche
10883 @noindent
10884 IEEE infinite and Nan values are produced as appropriate.
10885
10886 @sp 1
10887 @cartouche
10888 @noindent
10889 @strong{132}.  The value of the angle threshold, within which certain
10890 elementary functions, complex arithmetic operations, and complex
10891 elementary functions yield results conforming to a maximum relative
10892 error bound.  See G.2.4(10).
10893 @end cartouche
10894 @noindent
10895 Information on this subject is not yet available.
10896
10897 @sp 1
10898 @cartouche
10899 @noindent
10900 @strong{133}.  The accuracy of certain elementary functions for
10901 parameters beyond the angle threshold.  See G.2.4(10).
10902 @end cartouche
10903 @noindent
10904 Information on this subject is not yet available.
10905
10906 @sp 1
10907 @cartouche
10908 @noindent
10909 @strong{134}.  The result of a complex arithmetic operation or complex
10910 elementary function reference in overflow situations, when the
10911 @code{Machine_Overflows} attribute of the corresponding real type is
10912 @code{False}.  See G.2.6(5).
10913 @end cartouche
10914 @noindent
10915 IEEE infinite and Nan values are produced as appropriate.
10916
10917 @sp 1
10918 @cartouche
10919 @noindent
10920 @strong{135}.  The accuracy of certain complex arithmetic operations and
10921 certain complex elementary functions for parameters (or components
10922 thereof) beyond the angle threshold.  See G.2.6(8).
10923 @end cartouche
10924 @noindent
10925 Information on those subjects is not yet available.
10926
10927 @sp 1
10928 @cartouche
10929 @noindent
10930 @strong{136}.  Information regarding bounded errors and erroneous
10931 execution.  See H.2(1).
10932 @end cartouche
10933 @noindent
10934 Information on this subject is not yet available.
10935
10936 @sp 1
10937 @cartouche
10938 @noindent
10939 @strong{137}.  Implementation-defined aspects of pragma
10940 @code{Inspection_Point}.  See H.3.2(8).
10941 @end cartouche
10942 @noindent
10943 Pragma @code{Inspection_Point} ensures that the variable is live and can
10944 be examined by the debugger at the inspection point.
10945
10946 @sp 1
10947 @cartouche
10948 @noindent
10949 @strong{138}.  Implementation-defined aspects of pragma
10950 @code{Restrictions}.  See H.4(25).
10951 @end cartouche
10952 @noindent
10953 There are no implementation-defined aspects of pragma @code{Restrictions}.  The
10954 use of pragma @code{Restrictions [No_Exceptions]} has no effect on the
10955 generated code.  Checks must suppressed by use of pragma @code{Suppress}.
10956
10957 @sp 1
10958 @cartouche
10959 @noindent
10960 @strong{139}.  Any restrictions on pragma @code{Restrictions}.  See
10961 H.4(27).
10962 @end cartouche
10963 @noindent
10964 There are no restrictions on pragma @code{Restrictions}.
10965
10966 @node Intrinsic Subprograms
10967 @chapter Intrinsic Subprograms
10968 @cindex Intrinsic Subprograms
10969
10970 @menu
10971 * Intrinsic Operators::
10972 * Enclosing_Entity::
10973 * Exception_Information::
10974 * Exception_Message::
10975 * Exception_Name::
10976 * File::
10977 * Line::
10978 * Shifts and Rotates::
10979 * Source_Location::
10980 @end menu
10981
10982 @noindent
10983 GNAT allows a user application program to write the declaration:
10984
10985 @smallexample @c ada
10986    pragma Import (Intrinsic, name);
10987 @end smallexample
10988
10989 @noindent
10990 providing that the name corresponds to one of the implemented intrinsic
10991 subprograms in GNAT, and that the parameter profile of the referenced
10992 subprogram meets the requirements.  This chapter describes the set of
10993 implemented intrinsic subprograms, and the requirements on parameter profiles.
10994 Note that no body is supplied; as with other uses of pragma Import, the
10995 body is supplied elsewhere (in this case by the compiler itself).  Note
10996 that any use of this feature is potentially non-portable, since the
10997 Ada standard does not require Ada compilers to implement this feature.
10998
10999 @node Intrinsic Operators
11000 @section Intrinsic Operators
11001 @cindex Intrinsic operator
11002
11003 @noindent
11004 All the predefined numeric operators in package Standard
11005 in @code{pragma Import (Intrinsic,..)}
11006 declarations.  In the binary operator case, the operands must have the same
11007 size.  The operand or operands must also be appropriate for
11008 the operator.  For example, for addition, the operands must
11009 both be floating-point or both be fixed-point, and the
11010 right operand for @code{"**"} must have a root type of
11011 @code{Standard.Integer'Base}.
11012 You can use an intrinsic operator declaration as in the following example:
11013
11014 @smallexample @c ada
11015    type Int1 is new Integer;
11016    type Int2 is new Integer;
11017
11018    function "+" (X1 : Int1; X2 : Int2) return Int1;
11019    function "+" (X1 : Int1; X2 : Int2) return Int2;
11020    pragma Import (Intrinsic, "+");
11021 @end smallexample
11022
11023 @noindent
11024 This declaration would permit ``mixed mode'' arithmetic on items
11025 of the differing types @code{Int1} and @code{Int2}.
11026 It is also possible to specify such operators for private types, if the
11027 full views are appropriate arithmetic types.
11028
11029 @node Enclosing_Entity
11030 @section Enclosing_Entity
11031 @cindex Enclosing_Entity
11032 @noindent
11033 This intrinsic subprogram is used in the implementation of the
11034 library routine @code{GNAT.Source_Info}.  The only useful use of the
11035 intrinsic import in this case is the one in this unit, so an
11036 application program should simply call the function
11037 @code{GNAT.Source_Info.Enclosing_Entity} to obtain the name of
11038 the current subprogram, package, task, entry, or protected subprogram.
11039
11040 @node Exception_Information
11041 @section Exception_Information
11042 @cindex Exception_Information'
11043 @noindent
11044 This intrinsic subprogram is used in the implementation of the
11045 library routine @code{GNAT.Current_Exception}.  The only useful
11046 use of the intrinsic import in this case is the one in this unit,
11047 so an application program should simply call the function
11048 @code{GNAT.Current_Exception.Exception_Information} to obtain
11049 the exception information associated with the current exception.
11050
11051 @node Exception_Message
11052 @section Exception_Message
11053 @cindex Exception_Message
11054 @noindent
11055 This intrinsic subprogram is used in the implementation of the
11056 library routine @code{GNAT.Current_Exception}.  The only useful
11057 use of the intrinsic import in this case is the one in this unit,
11058 so an application program should simply call the function
11059 @code{GNAT.Current_Exception.Exception_Message} to obtain
11060 the message associated with the current exception.
11061
11062 @node Exception_Name
11063 @section Exception_Name
11064 @cindex Exception_Name
11065 @noindent
11066 This intrinsic subprogram is used in the implementation of the
11067 library routine @code{GNAT.Current_Exception}.  The only useful
11068 use of the intrinsic import in this case is the one in this unit,
11069 so an application program should simply call the function
11070 @code{GNAT.Current_Exception.Exception_Name} to obtain
11071 the name of the current exception.
11072
11073 @node File
11074 @section File
11075 @cindex File
11076 @noindent
11077 This intrinsic subprogram is used in the implementation of the
11078 library routine @code{GNAT.Source_Info}.  The only useful use of the
11079 intrinsic import in this case is the one in this unit, so an
11080 application program should simply call the function
11081 @code{GNAT.Source_Info.File} to obtain the name of the current
11082 file.
11083
11084 @node Line
11085 @section Line
11086 @cindex Line
11087 @noindent
11088 This intrinsic subprogram is used in the implementation of the
11089 library routine @code{GNAT.Source_Info}.  The only useful use of the
11090 intrinsic import in this case is the one in this unit, so an
11091 application program should simply call the function
11092 @code{GNAT.Source_Info.Line} to obtain the number of the current
11093 source line.
11094
11095 @node Shifts and Rotates
11096 @section Shifts and Rotates
11097 @cindex Shift_Left
11098 @cindex Shift_Right
11099 @cindex Shift_Right_Arithmetic
11100 @cindex Rotate_Left
11101 @cindex Rotate_Right
11102 @noindent
11103 In standard Ada, the shift and rotate functions are available only
11104 for the predefined modular types in package @code{Interfaces}.  However, in
11105 GNAT it is possible to define these functions for any integer
11106 type (signed or modular), as in this example:
11107
11108 @smallexample @c ada
11109    function Shift_Left
11110      (Value  : T;
11111       Amount : Natural)
11112       return   T;
11113 @end smallexample
11114
11115 @noindent
11116 The function name must be one of
11117 Shift_Left, Shift_Right, Shift_Right_Arithmetic, Rotate_Left, or
11118 Rotate_Right. T must be an integer type. T'Size must be
11119 8, 16, 32 or 64 bits; if T is modular, the modulus
11120 must be 2**8, 2**16, 2**32 or 2**64.
11121 The result type must be the same as the type of @code{Value}.
11122 The shift amount must be Natural.
11123 The formal parameter names can be anything.
11124
11125 @node Source_Location
11126 @section Source_Location
11127 @cindex Source_Location
11128 @noindent
11129 This intrinsic subprogram is used in the implementation of the
11130 library routine @code{GNAT.Source_Info}.  The only useful use of the
11131 intrinsic import in this case is the one in this unit, so an
11132 application program should simply call the function
11133 @code{GNAT.Source_Info.Source_Location} to obtain the current
11134 source file location.
11135
11136 @node Representation Clauses and Pragmas
11137 @chapter Representation Clauses and Pragmas
11138 @cindex Representation Clauses
11139
11140 @menu
11141 * Alignment Clauses::
11142 * Size Clauses::
11143 * Storage_Size Clauses::
11144 * Size of Variant Record Objects::
11145 * Biased Representation ::
11146 * Value_Size and Object_Size Clauses::
11147 * Component_Size Clauses::
11148 * Bit_Order Clauses::
11149 * Effect of Bit_Order on Byte Ordering::
11150 * Pragma Pack for Arrays::
11151 * Pragma Pack for Records::
11152 * Record Representation Clauses::
11153 * Enumeration Clauses::
11154 * Address Clauses::
11155 * Effect of Convention on Representation::
11156 * Determining the Representations chosen by GNAT::
11157 @end menu
11158
11159 @noindent
11160 @cindex Representation Clause
11161 @cindex Representation Pragma
11162 @cindex Pragma, representation
11163 This section describes the representation clauses accepted by GNAT, and
11164 their effect on the representation of corresponding data objects.
11165
11166 GNAT fully implements Annex C (Systems Programming).  This means that all
11167 the implementation advice sections in chapter 13 are fully implemented.
11168 However, these sections only require a minimal level of support for
11169 representation clauses.  GNAT provides much more extensive capabilities,
11170 and this section describes the additional capabilities provided.
11171
11172 @node Alignment Clauses
11173 @section Alignment Clauses
11174 @cindex Alignment Clause
11175
11176 @noindent
11177 GNAT requires that all alignment clauses specify a power of 2, and all
11178 default alignments are always a power of 2.  The default alignment
11179 values are as follows:
11180
11181 @itemize @bullet
11182 @item @emph{Primitive Types}.
11183 For primitive types, the alignment is the minimum of the actual size of
11184 objects of the type divided by @code{Storage_Unit},
11185 and the maximum alignment supported by the target.
11186 (This maximum alignment is given by the GNAT-specific attribute
11187 @code{Standard'Maximum_Alignment}; see @ref{Maximum_Alignment}.)
11188 @cindex @code{Maximum_Alignment} attribute
11189 For example, for type @code{Long_Float}, the object size is 8 bytes, and the
11190 default alignment will be 8 on any target that supports alignments
11191 this large, but on some targets, the maximum alignment may be smaller
11192 than 8, in which case objects of type @code{Long_Float} will be maximally
11193 aligned.
11194
11195 @item @emph{Arrays}.
11196 For arrays, the alignment is equal to the alignment of the component type
11197 for the normal case where no packing or component size is given.  If the
11198 array is packed, and the packing is effective (see separate section on
11199 packed arrays), then the alignment will be one for long packed arrays,
11200 or arrays whose length is not known at compile time.  For short packed
11201 arrays, which are handled internally as modular types, the alignment
11202 will be as described for primitive types, e.g.@: a packed array of length
11203 31 bits will have an object size of four bytes, and an alignment of 4.
11204
11205 @item @emph{Records}.
11206 For the normal non-packed case, the alignment of a record is equal to
11207 the maximum alignment of any of its components.  For tagged records, this
11208 includes the implicit access type used for the tag.  If a pragma @code{Pack}
11209 is used and all components are packable (see separate section on pragma
11210 @code{Pack}), then the resulting alignment is 1, unless the layout of the
11211 record makes it profitable to increase it.
11212
11213 A special case is when:
11214 @itemize @bullet
11215 @item
11216 the size of the record is given explicitly, or a
11217 full record representation clause is given, and
11218 @item
11219 the size of the record is 2, 4, or 8 bytes.
11220 @end itemize
11221 @noindent
11222 In this case, an alignment is chosen to match the
11223 size of the record. For example, if we have:
11224
11225 @smallexample @c ada
11226    type Small is record
11227       A, B : Character;
11228    end record;
11229    for Small'Size use 16;
11230 @end smallexample
11231
11232 @noindent
11233 then the default alignment of the record type @code{Small} is 2, not 1. This
11234 leads to more efficient code when the record is treated as a unit, and also
11235 allows the type to specified as @code{Atomic} on architectures requiring
11236 strict alignment.
11237
11238 @end itemize
11239
11240 @noindent
11241 An alignment clause may specify a larger alignment than the default value
11242 up to some maximum value dependent on the target (obtainable by using the
11243 attribute reference @code{Standard'Maximum_Alignment}). It may also specify
11244 a smaller alignment than the default value for enumeration, integer and
11245 fixed point types, as well as for record types, for example
11246
11247 @smallexample @c ada
11248   type V is record
11249      A : Integer;
11250   end record;
11251
11252   for V'alignment use 1;
11253 @end smallexample
11254
11255 @noindent
11256 @cindex Alignment, default
11257 The default alignment for the type @code{V} is 4, as a result of the
11258 Integer field in the record, but it is permissible, as shown, to
11259 override the default alignment of the record with a smaller value.
11260
11261 @node Size Clauses
11262 @section Size Clauses
11263 @cindex Size Clause
11264
11265 @noindent
11266 The default size for a type @code{T} is obtainable through the
11267 language-defined attribute @code{T'Size} and also through the
11268 equivalent GNAT-defined attribute @code{T'Value_Size}.
11269 For objects of type @code{T}, GNAT will generally increase the type size
11270 so that the object size (obtainable through the GNAT-defined attribute
11271 @code{T'Object_Size})
11272 is a multiple of @code{T'Alignment * Storage_Unit}.
11273 For example
11274
11275 @smallexample @c ada
11276    type Smallint is range 1 .. 6;
11277
11278    type Rec is record
11279       Y1 : integer;
11280       Y2 : boolean;
11281    end record;
11282 @end smallexample
11283
11284 @noindent
11285 In this example, @code{Smallint'Size} = @code{Smallint'Value_Size} = 3,
11286 as specified by the RM rules,
11287 but objects of this type will have a size of 8
11288 (@code{Smallint'Object_Size} = 8),
11289 since objects by default occupy an integral number
11290 of storage units.  On some targets, notably older
11291 versions of the Digital Alpha, the size of stand
11292 alone objects of this type may be 32, reflecting
11293 the inability of the hardware to do byte load/stores.
11294
11295 Similarly, the size of type @code{Rec} is 40 bits
11296 (@code{Rec'Size} = @code{Rec'Value_Size} = 40), but
11297 the alignment is 4, so objects of this type will have
11298 their size increased to 64 bits so that it is a multiple
11299 of the alignment (in bits).  This decision is
11300 in accordance with the specific Implementation Advice in RM 13.3(43):
11301
11302 @quotation
11303 A @code{Size} clause should be supported for an object if the specified
11304 @code{Size} is at least as large as its subtype's @code{Size}, and corresponds
11305 to a size in storage elements that is a multiple of the object's
11306 @code{Alignment} (if the @code{Alignment} is nonzero).
11307 @end quotation
11308
11309 @noindent
11310 An explicit size clause may be used to override the default size by
11311 increasing it.  For example, if we have:
11312
11313 @smallexample @c ada
11314    type My_Boolean is new Boolean;
11315    for My_Boolean'Size use 32;
11316 @end smallexample
11317
11318 @noindent
11319 then values of this type will always be 32 bits long.  In the case of
11320 discrete types, the size can be increased up to 64 bits, with the effect
11321 that the entire specified field is used to hold the value, sign- or
11322 zero-extended as appropriate.  If more than 64 bits is specified, then
11323 padding space is allocated after the value, and a warning is issued that
11324 there are unused bits.
11325
11326 Similarly the size of records and arrays may be increased, and the effect
11327 is to add padding bits after the value.  This also causes a warning message
11328 to be generated.
11329
11330 The largest Size value permitted in GNAT is 2**31@minus{}1.  Since this is a
11331 Size in bits, this corresponds to an object of size 256 megabytes (minus
11332 one).  This limitation is true on all targets.  The reason for this
11333 limitation is that it improves the quality of the code in many cases
11334 if it is known that a Size value can be accommodated in an object of
11335 type Integer.
11336
11337 @node Storage_Size Clauses
11338 @section Storage_Size Clauses
11339 @cindex Storage_Size Clause
11340
11341 @noindent
11342 For tasks, the @code{Storage_Size} clause specifies the amount of space
11343 to be allocated for the task stack.  This cannot be extended, and if the
11344 stack is exhausted, then @code{Storage_Error} will be raised (if stack
11345 checking is enabled).  Use a @code{Storage_Size} attribute definition clause,
11346 or a @code{Storage_Size} pragma in the task definition to set the
11347 appropriate required size.  A useful technique is to include in every
11348 task definition a pragma of the form:
11349
11350 @smallexample @c ada
11351    pragma Storage_Size (Default_Stack_Size);
11352 @end smallexample
11353
11354 @noindent
11355 Then @code{Default_Stack_Size} can be defined in a global package, and
11356 modified as required. Any tasks requiring stack sizes different from the
11357 default can have an appropriate alternative reference in the pragma.
11358
11359 You can also use the @option{-d} binder switch to modify the default stack
11360 size.
11361
11362 For access types, the @code{Storage_Size} clause specifies the maximum
11363 space available for allocation of objects of the type.  If this space is
11364 exceeded then @code{Storage_Error} will be raised by an allocation attempt.
11365 In the case where the access type is declared local to a subprogram, the
11366 use of a @code{Storage_Size} clause triggers automatic use of a special
11367 predefined storage pool (@code{System.Pool_Size}) that ensures that all
11368 space for the pool is automatically reclaimed on exit from the scope in
11369 which the type is declared.
11370
11371 A special case recognized by the compiler is the specification of a
11372 @code{Storage_Size} of zero for an access type.  This means that no
11373 items can be allocated from the pool, and this is recognized at compile
11374 time, and all the overhead normally associated with maintaining a fixed
11375 size storage pool is eliminated.  Consider the following example:
11376
11377 @smallexample @c ada
11378    procedure p is
11379       type R is array (Natural) of Character;
11380       type P is access all R;
11381       for P'Storage_Size use 0;
11382       --  Above access type intended only for interfacing purposes
11383
11384       y : P;
11385
11386       procedure g (m : P);
11387       pragma Import (C, g);
11388
11389       --  @dots{}
11390
11391    begin
11392       --  @dots{}
11393       y := new R;
11394    end;
11395 @end smallexample
11396
11397 @noindent
11398 As indicated in this example, these dummy storage pools are often useful in
11399 connection with interfacing where no object will ever be allocated.  If you
11400 compile the above example, you get the warning:
11401
11402 @smallexample
11403    p.adb:16:09: warning: allocation from empty storage pool
11404    p.adb:16:09: warning: Storage_Error will be raised at run time
11405 @end smallexample
11406
11407 @noindent
11408 Of course in practice, there will not be any explicit allocators in the
11409 case of such an access declaration.
11410
11411 @node Size of Variant Record Objects
11412 @section Size of Variant Record Objects
11413 @cindex Size, variant record objects
11414 @cindex Variant record objects, size
11415
11416 @noindent
11417 In the case of variant record objects, there is a question whether Size gives
11418 information about a particular variant, or the maximum size required
11419 for any variant.  Consider the following program
11420
11421 @smallexample @c ada
11422 with Text_IO; use Text_IO;
11423 procedure q is
11424    type R1 (A : Boolean := False) is record
11425      case A is
11426        when True  => X : Character;
11427        when False => null;
11428      end case;
11429    end record;
11430
11431    V1 : R1 (False);
11432    V2 : R1;
11433
11434 begin
11435    Put_Line (Integer'Image (V1'Size));
11436    Put_Line (Integer'Image (V2'Size));
11437 end q;
11438 @end smallexample
11439
11440 @noindent
11441 Here we are dealing with a variant record, where the True variant
11442 requires 16 bits, and the False variant requires 8 bits.
11443 In the above example, both V1 and V2 contain the False variant,
11444 which is only 8 bits long.  However, the result of running the
11445 program is:
11446
11447 @smallexample
11448 8
11449 16
11450 @end smallexample
11451
11452 @noindent
11453 The reason for the difference here is that the discriminant value of
11454 V1 is fixed, and will always be False.  It is not possible to assign
11455 a True variant value to V1, therefore 8 bits is sufficient.  On the
11456 other hand, in the case of V2, the initial discriminant value is
11457 False (from the default), but it is possible to assign a True
11458 variant value to V2, therefore 16 bits must be allocated for V2
11459 in the general case, even fewer bits may be needed at any particular
11460 point during the program execution.
11461
11462 As can be seen from the output of this program, the @code{'Size}
11463 attribute applied to such an object in GNAT gives the actual allocated
11464 size of the variable, which is the largest size of any of the variants.
11465 The Ada Reference Manual is not completely clear on what choice should
11466 be made here, but the GNAT behavior seems most consistent with the
11467 language in the RM@.
11468
11469 In some cases, it may be desirable to obtain the size of the current
11470 variant, rather than the size of the largest variant.  This can be
11471 achieved in GNAT by making use of the fact that in the case of a
11472 subprogram parameter, GNAT does indeed return the size of the current
11473 variant (because a subprogram has no way of knowing how much space
11474 is actually allocated for the actual).
11475
11476 Consider the following modified version of the above program:
11477
11478 @smallexample @c ada
11479 with Text_IO; use Text_IO;
11480 procedure q is
11481    type R1 (A : Boolean := False) is record
11482      case A is
11483        when True  => X : Character;
11484        when False => null;
11485      end case;
11486    end record;
11487
11488    V2 : R1;
11489
11490    function Size (V : R1) return Integer is
11491    begin
11492       return V'Size;
11493    end Size;
11494
11495 begin
11496    Put_Line (Integer'Image (V2'Size));
11497    Put_Line (Integer'IMage (Size (V2)));
11498    V2 := (True, 'x');
11499    Put_Line (Integer'Image (V2'Size));
11500    Put_Line (Integer'IMage (Size (V2)));
11501 end q;
11502 @end smallexample
11503
11504 @noindent
11505 The output from this program is
11506
11507 @smallexample
11508 16
11509 8
11510 16
11511 16
11512 @end smallexample
11513
11514 @noindent
11515 Here we see that while the @code{'Size} attribute always returns
11516 the maximum size, regardless of the current variant value, the
11517 @code{Size} function does indeed return the size of the current
11518 variant value.
11519
11520 @node Biased Representation
11521 @section Biased Representation
11522 @cindex Size for biased representation
11523 @cindex Biased representation
11524
11525 @noindent
11526 In the case of scalars with a range starting at other than zero, it is
11527 possible in some cases to specify a size smaller than the default minimum
11528 value, and in such cases, GNAT uses an unsigned biased representation,
11529 in which zero is used to represent the lower bound, and successive values
11530 represent successive values of the type.
11531
11532 For example, suppose we have the declaration:
11533
11534 @smallexample @c ada
11535    type Small is range -7 .. -4;
11536    for Small'Size use 2;
11537 @end smallexample
11538
11539 @noindent
11540 Although the default size of type @code{Small} is 4, the @code{Size}
11541 clause is accepted by GNAT and results in the following representation
11542 scheme:
11543
11544 @smallexample
11545   -7 is represented as 2#00#
11546   -6 is represented as 2#01#
11547   -5 is represented as 2#10#
11548   -4 is represented as 2#11#
11549 @end smallexample
11550
11551 @noindent
11552 Biased representation is only used if the specified @code{Size} clause
11553 cannot be accepted in any other manner.  These reduced sizes that force
11554 biased representation can be used for all discrete types except for
11555 enumeration types for which a representation clause is given.
11556
11557 @node Value_Size and Object_Size Clauses
11558 @section Value_Size and Object_Size Clauses
11559 @findex Value_Size
11560 @findex Object_Size
11561 @cindex Size, of objects
11562
11563 @noindent
11564 In Ada 95 and Ada 2005, @code{T'Size} for a type @code{T} is the minimum
11565 number of bits required to hold values of type @code{T}.
11566 Although this interpretation was allowed in Ada 83, it was not required,
11567 and this requirement in practice can cause some significant difficulties.
11568 For example, in most Ada 83 compilers, @code{Natural'Size} was 32.
11569 However, in Ada 95 and Ada 2005,
11570 @code{Natural'Size} is
11571 typically 31.  This means that code may change in behavior when moving
11572 from Ada 83 to Ada 95 or Ada 2005.  For example, consider:
11573
11574 @smallexample @c ada
11575    type Rec is record;
11576       A : Natural;
11577       B : Natural;
11578    end record;
11579
11580    for Rec use record
11581       at 0  range 0 .. Natural'Size - 1;
11582       at 0  range Natural'Size .. 2 * Natural'Size - 1;
11583    end record;
11584 @end smallexample
11585
11586 @noindent
11587 In the above code, since the typical size of @code{Natural} objects
11588 is 32 bits and @code{Natural'Size} is 31, the above code can cause
11589 unexpected inefficient packing in Ada 95 and Ada 2005, and in general
11590 there are cases where the fact that the object size can exceed the
11591 size of the type causes surprises.
11592
11593 To help get around this problem GNAT provides two implementation
11594 defined attributes, @code{Value_Size} and @code{Object_Size}.  When
11595 applied to a type, these attributes yield the size of the type
11596 (corresponding to the RM defined size attribute), and the size of
11597 objects of the type respectively.
11598
11599 The @code{Object_Size} is used for determining the default size of
11600 objects and components.  This size value can be referred to using the
11601 @code{Object_Size} attribute.  The phrase ``is used'' here means that it is
11602 the basis of the determination of the size.  The backend is free to
11603 pad this up if necessary for efficiency, e.g.@: an 8-bit stand-alone
11604 character might be stored in 32 bits on a machine with no efficient
11605 byte access instructions such as the Alpha.
11606
11607 The default rules for the value of @code{Object_Size} for
11608 discrete types are as follows:
11609
11610 @itemize @bullet
11611 @item
11612 The @code{Object_Size} for base subtypes reflect the natural hardware
11613 size in bits (run the compiler with @option{-gnatS} to find those values
11614 for numeric types). Enumeration types and fixed-point base subtypes have
11615 8, 16, 32 or 64 bits for this size, depending on the range of values
11616 to be stored.
11617
11618 @item
11619 The @code{Object_Size} of a subtype is the same as the
11620 @code{Object_Size} of
11621 the type from which it is obtained.
11622
11623 @item
11624 The @code{Object_Size} of a derived base type is copied from the parent
11625 base type, and the @code{Object_Size} of a derived first subtype is copied
11626 from the parent first subtype.
11627 @end itemize
11628
11629 @noindent
11630 The @code{Value_Size} attribute
11631 is the (minimum) number of bits required to store a value
11632 of the type.
11633 This value is used to determine how tightly to pack
11634 records or arrays with components of this type, and also affects
11635 the semantics of unchecked conversion (unchecked conversions where
11636 the @code{Value_Size} values differ generate a warning, and are potentially
11637 target dependent).
11638
11639 The default rules for the value of @code{Value_Size} are as follows:
11640
11641 @itemize @bullet
11642 @item
11643 The @code{Value_Size} for a base subtype is the minimum number of bits
11644 required to store all values of the type (including the sign bit
11645 only if negative values are possible).
11646
11647 @item
11648 If a subtype statically matches the first subtype of a given type, then it has
11649 by default the same @code{Value_Size} as the first subtype.  This is a
11650 consequence of RM 13.1(14) (``if two subtypes statically match,
11651 then their subtype-specific aspects are the same''.)
11652
11653 @item
11654 All other subtypes have a @code{Value_Size} corresponding to the minimum
11655 number of bits required to store all values of the subtype.  For
11656 dynamic bounds, it is assumed that the value can range down or up
11657 to the corresponding bound of the ancestor
11658 @end itemize
11659
11660 @noindent
11661 The RM defined attribute @code{Size} corresponds to the
11662 @code{Value_Size} attribute.
11663
11664 The @code{Size} attribute may be defined for a first-named subtype.  This sets
11665 the @code{Value_Size} of
11666 the first-named subtype to the given value, and the
11667 @code{Object_Size} of this first-named subtype to the given value padded up
11668 to an appropriate boundary.  It is a consequence of the default rules
11669 above that this @code{Object_Size} will apply to all further subtypes.  On the
11670 other hand, @code{Value_Size} is affected only for the first subtype, any
11671 dynamic subtypes obtained from it directly, and any statically matching
11672 subtypes.  The @code{Value_Size} of any other static subtypes is not affected.
11673
11674 @code{Value_Size} and
11675 @code{Object_Size} may be explicitly set for any subtype using
11676 an attribute definition clause.  Note that the use of these attributes
11677 can cause the RM 13.1(14) rule to be violated.  If two access types
11678 reference aliased objects whose subtypes have differing @code{Object_Size}
11679 values as a result of explicit attribute definition clauses, then it
11680 is erroneous to convert from one access subtype to the other.
11681
11682 At the implementation level, Esize stores the Object_Size and the
11683 RM_Size field stores the @code{Value_Size} (and hence the value of the
11684 @code{Size} attribute,
11685 which, as noted above, is equivalent to @code{Value_Size}).
11686
11687 To get a feel for the difference, consider the following examples (note
11688 that in each case the base is @code{Short_Short_Integer} with a size of 8):
11689
11690 @smallexample
11691                                        Object_Size     Value_Size
11692
11693 type x1 is range 0 .. 5;                    8               3
11694
11695 type x2 is range 0 .. 5;
11696 for x2'size use 12;                        16              12
11697
11698 subtype x3 is x2 range 0 .. 3;             16               2
11699
11700 subtype x4 is x2'base range 0 .. 10;        8               4
11701
11702 subtype x5 is x2 range 0 .. dynamic;       16               3*
11703
11704 subtype x6 is x2'base range 0 .. dynamic;   8               3*
11705
11706 @end smallexample
11707
11708 @noindent
11709 Note: the entries marked ``3*'' are not actually specified by the Ada
11710 Reference Manual, but it seems in the spirit of the RM rules to allocate
11711 the minimum number of bits (here 3, given the range for @code{x2})
11712 known to be large enough to hold the given range of values.
11713
11714 So far, so good, but GNAT has to obey the RM rules, so the question is
11715 under what conditions must the RM @code{Size} be used.
11716 The following is a list
11717 of the occasions on which the RM @code{Size} must be used:
11718
11719 @itemize @bullet
11720 @item
11721 Component size for packed arrays or records
11722
11723 @item
11724 Value of the attribute @code{Size} for a type
11725
11726 @item
11727 Warning about sizes not matching for unchecked conversion
11728 @end itemize
11729
11730 @noindent
11731 For record types, the @code{Object_Size} is always a multiple of the
11732 alignment of the type (this is true for all types). In some cases the
11733 @code{Value_Size} can be smaller. Consider:
11734
11735 @smallexample
11736    type R is record
11737      X : Integer;
11738      Y : Character;
11739    end record;
11740 @end smallexample
11741
11742 @noindent
11743 On a typical 32-bit architecture, the X component will be four bytes, and
11744 require four-byte alignment, and the Y component will be one byte. In this
11745 case @code{R'Value_Size} will be 40 (bits) since this is the minimum size
11746 required to store a value of this type, and for example, it is permissible
11747 to have a component of type R in an outer array whose component size is
11748 specified to be 48 bits. However, @code{R'Object_Size} will be 64 (bits),
11749 since it must be rounded up so that this value is a multiple of the
11750 alignment (4 bytes = 32 bits).
11751
11752 @noindent
11753 For all other types, the @code{Object_Size}
11754 and Value_Size are the same (and equivalent to the RM attribute @code{Size}).
11755 Only @code{Size} may be specified for such types.
11756
11757 @node Component_Size Clauses
11758 @section Component_Size Clauses
11759 @cindex Component_Size Clause
11760
11761 @noindent
11762 Normally, the value specified in a component size clause must be consistent
11763 with the subtype of the array component with regard to size and alignment.
11764 In other words, the value specified must be at least equal to the size
11765 of this subtype, and must be a multiple of the alignment value.
11766
11767 In addition, component size clauses are allowed which cause the array
11768 to be packed, by specifying a smaller value.  A first case is for
11769 component size values in the range 1 through 63.  The value specified
11770 must not be smaller than the Size of the subtype.  GNAT will accurately
11771 honor all packing requests in this range.  For example, if we have:
11772
11773 @smallexample @c ada
11774 type r is array (1 .. 8) of Natural;
11775 for r'Component_Size use 31;
11776 @end smallexample
11777
11778 @noindent
11779 then the resulting array has a length of 31 bytes (248 bits = 8 * 31).
11780 Of course access to the components of such an array is considerably
11781 less efficient than if the natural component size of 32 is used.
11782 A second case is when the subtype of the component is a record type
11783 padded because of its default alignment.  For example, if we have:
11784
11785 @smallexample @c ada
11786 type r is record
11787   i : Integer;
11788   j : Integer;
11789   b : Boolean;
11790 end record;
11791
11792 type a is array (1 .. 8) of r;
11793 for a'Component_Size use 72;
11794 @end smallexample
11795
11796 @noindent
11797 then the resulting array has a length of 72 bytes, instead of 96 bytes
11798 if the alignment of the record (4) was obeyed.
11799
11800 Note that there is no point in giving both a component size clause
11801 and a pragma Pack for the same array type. if such duplicate
11802 clauses are given, the pragma Pack will be ignored.
11803
11804 @node Bit_Order Clauses
11805 @section Bit_Order Clauses
11806 @cindex Bit_Order Clause
11807 @cindex bit ordering
11808 @cindex ordering, of bits
11809
11810 @noindent
11811 For record subtypes, GNAT permits the specification of the @code{Bit_Order}
11812 attribute.  The specification may either correspond to the default bit
11813 order for the target, in which case the specification has no effect and
11814 places no additional restrictions, or it may be for the non-standard
11815 setting (that is the opposite of the default).
11816
11817 In the case where the non-standard value is specified, the effect is
11818 to renumber bits within each byte, but the ordering of bytes is not
11819 affected.  There are certain
11820 restrictions placed on component clauses as follows:
11821
11822 @itemize @bullet
11823
11824 @item Components fitting within a single storage unit.
11825 @noindent
11826 These are unrestricted, and the effect is merely to renumber bits.  For
11827 example if we are on a little-endian machine with @code{Low_Order_First}
11828 being the default, then the following two declarations have exactly
11829 the same effect:
11830
11831 @smallexample @c ada
11832    type R1 is record
11833       A : Boolean;
11834       B : Integer range 1 .. 120;
11835    end record;
11836
11837    for R1 use record
11838       A at 0 range 0 .. 0;
11839       B at 0 range 1 .. 7;
11840    end record;
11841
11842    type R2 is record
11843       A : Boolean;
11844       B : Integer range 1 .. 120;
11845    end record;
11846
11847    for R2'Bit_Order use High_Order_First;
11848
11849    for R2 use record
11850       A at 0 range 7 .. 7;
11851       B at 0 range 0 .. 6;
11852    end record;
11853 @end smallexample
11854
11855 @noindent
11856 The useful application here is to write the second declaration with the
11857 @code{Bit_Order} attribute definition clause, and know that it will be treated
11858 the same, regardless of whether the target is little-endian or big-endian.
11859
11860 @item Components occupying an integral number of bytes.
11861 @noindent
11862 These are components that exactly fit in two or more bytes.  Such component
11863 declarations are allowed, but have no effect, since it is important to realize
11864 that the @code{Bit_Order} specification does not affect the ordering of bytes.
11865 In particular, the following attempt at getting an endian-independent integer
11866 does not work:
11867
11868 @smallexample @c ada
11869    type R2 is record
11870       A : Integer;
11871    end record;
11872
11873    for R2'Bit_Order use High_Order_First;
11874
11875    for R2 use record
11876       A at 0 range 0 .. 31;
11877    end record;
11878 @end smallexample
11879
11880 @noindent
11881 This declaration will result in a little-endian integer on a
11882 little-endian machine, and a big-endian integer on a big-endian machine.
11883 If byte flipping is required for interoperability between big- and
11884 little-endian machines, this must be explicitly programmed.  This capability
11885 is not provided by @code{Bit_Order}.
11886
11887 @item Components that are positioned across byte boundaries
11888 @noindent
11889 but do not occupy an integral number of bytes.  Given that bytes are not
11890 reordered, such fields would occupy a non-contiguous sequence of bits
11891 in memory, requiring non-trivial code to reassemble.  They are for this
11892 reason not permitted, and any component clause specifying such a layout
11893 will be flagged as illegal by GNAT@.
11894
11895 @end itemize
11896
11897 @noindent
11898 Since the misconception that Bit_Order automatically deals with all
11899 endian-related incompatibilities is a common one, the specification of
11900 a component field that is an integral number of bytes will always
11901 generate a warning.  This warning may be suppressed using @code{pragma
11902 Warnings (Off)} if desired.  The following section contains additional
11903 details regarding the issue of byte ordering.
11904
11905 @node Effect of Bit_Order on Byte Ordering
11906 @section Effect of Bit_Order on Byte Ordering
11907 @cindex byte ordering
11908 @cindex ordering, of bytes
11909
11910 @noindent
11911 In this section we will review the effect of the @code{Bit_Order} attribute
11912 definition clause on byte ordering.  Briefly, it has no effect at all, but
11913 a detailed example will be helpful.  Before giving this
11914 example, let us review the precise
11915 definition of the effect of defining @code{Bit_Order}.  The effect of a
11916 non-standard bit order is described in section 15.5.3 of the Ada
11917 Reference Manual:
11918
11919 @quotation
11920 2   A bit ordering is a method of interpreting the meaning of
11921 the storage place attributes.
11922 @end quotation
11923
11924 @noindent
11925 To understand the precise definition of storage place attributes in
11926 this context, we visit section 13.5.1 of the manual:
11927
11928 @quotation
11929 13   A record_representation_clause (without the mod_clause)
11930 specifies the layout.  The storage place attributes (see 13.5.2)
11931 are taken from the values of the position, first_bit, and last_bit
11932 expressions after normalizing those values so that first_bit is
11933 less than Storage_Unit.
11934 @end quotation
11935
11936 @noindent
11937 The critical point here is that storage places are taken from
11938 the values after normalization, not before.  So the @code{Bit_Order}
11939 interpretation applies to normalized values.  The interpretation
11940 is described in the later part of the 15.5.3 paragraph:
11941
11942 @quotation
11943 2   A bit ordering is a method of interpreting the meaning of
11944 the storage place attributes.  High_Order_First (known in the
11945 vernacular as ``big endian'') means that the first bit of a
11946 storage element (bit 0) is the most significant bit (interpreting
11947 the sequence of bits that represent a component as an unsigned
11948 integer value).  Low_Order_First (known in the vernacular as
11949 ``little endian'') means the opposite: the first bit is the
11950 least significant.
11951 @end quotation
11952
11953 @noindent
11954 Note that the numbering is with respect to the bits of a storage
11955 unit.  In other words, the specification affects only the numbering
11956 of bits within a single storage unit.
11957
11958 We can make the effect clearer by giving an example.
11959
11960 Suppose that we have an external device which presents two bytes, the first
11961 byte presented, which is the first (low addressed byte) of the two byte
11962 record is called Master, and the second byte is called Slave.
11963
11964 The left most (most significant bit is called Control for each byte, and
11965 the remaining 7 bits are called V1, V2, @dots{} V7, where V7 is the rightmost
11966 (least significant) bit.
11967
11968 On a big-endian machine, we can write the following representation clause
11969
11970 @smallexample @c ada
11971    type Data is record
11972       Master_Control : Bit;
11973       Master_V1      : Bit;
11974       Master_V2      : Bit;
11975       Master_V3      : Bit;
11976       Master_V4      : Bit;
11977       Master_V5      : Bit;
11978       Master_V6      : Bit;
11979       Master_V7      : Bit;
11980       Slave_Control  : Bit;
11981       Slave_V1       : Bit;
11982       Slave_V2       : Bit;
11983       Slave_V3       : Bit;
11984       Slave_V4       : Bit;
11985       Slave_V5       : Bit;
11986       Slave_V6       : Bit;
11987       Slave_V7       : Bit;
11988    end record;
11989
11990    for Data use record
11991       Master_Control at 0 range 0 .. 0;
11992       Master_V1      at 0 range 1 .. 1;
11993       Master_V2      at 0 range 2 .. 2;
11994       Master_V3      at 0 range 3 .. 3;
11995       Master_V4      at 0 range 4 .. 4;
11996       Master_V5      at 0 range 5 .. 5;
11997       Master_V6      at 0 range 6 .. 6;
11998       Master_V7      at 0 range 7 .. 7;
11999       Slave_Control  at 1 range 0 .. 0;
12000       Slave_V1       at 1 range 1 .. 1;
12001       Slave_V2       at 1 range 2 .. 2;
12002       Slave_V3       at 1 range 3 .. 3;
12003       Slave_V4       at 1 range 4 .. 4;
12004       Slave_V5       at 1 range 5 .. 5;
12005       Slave_V6       at 1 range 6 .. 6;
12006       Slave_V7       at 1 range 7 .. 7;
12007    end record;
12008 @end smallexample
12009
12010 @noindent
12011 Now if we move this to a little endian machine, then the bit ordering within
12012 the byte is backwards, so we have to rewrite the record rep clause as:
12013
12014 @smallexample @c ada
12015    for Data use record
12016       Master_Control at 0 range 7 .. 7;
12017       Master_V1      at 0 range 6 .. 6;
12018       Master_V2      at 0 range 5 .. 5;
12019       Master_V3      at 0 range 4 .. 4;
12020       Master_V4      at 0 range 3 .. 3;
12021       Master_V5      at 0 range 2 .. 2;
12022       Master_V6      at 0 range 1 .. 1;
12023       Master_V7      at 0 range 0 .. 0;
12024       Slave_Control  at 1 range 7 .. 7;
12025       Slave_V1       at 1 range 6 .. 6;
12026       Slave_V2       at 1 range 5 .. 5;
12027       Slave_V3       at 1 range 4 .. 4;
12028       Slave_V4       at 1 range 3 .. 3;
12029       Slave_V5       at 1 range 2 .. 2;
12030       Slave_V6       at 1 range 1 .. 1;
12031       Slave_V7       at 1 range 0 .. 0;
12032    end record;
12033 @end smallexample
12034
12035 @noindent
12036 It is a nuisance to have to rewrite the clause, especially if
12037 the code has to be maintained on both machines.  However,
12038 this is a case that we can handle with the
12039 @code{Bit_Order} attribute if it is implemented.
12040 Note that the implementation is not required on byte addressed
12041 machines, but it is indeed implemented in GNAT.
12042 This means that we can simply use the
12043 first record clause, together with the declaration
12044
12045 @smallexample @c ada
12046    for Data'Bit_Order use High_Order_First;
12047 @end smallexample
12048
12049 @noindent
12050 and the effect is what is desired, namely the layout is exactly the same,
12051 independent of whether the code is compiled on a big-endian or little-endian
12052 machine.
12053
12054 The important point to understand is that byte ordering is not affected.
12055 A @code{Bit_Order} attribute definition never affects which byte a field
12056 ends up in, only where it ends up in that byte.
12057 To make this clear, let us rewrite the record rep clause of the previous
12058 example as:
12059
12060 @smallexample @c ada
12061    for Data'Bit_Order use High_Order_First;
12062    for Data use record
12063       Master_Control at 0 range  0 .. 0;
12064       Master_V1      at 0 range  1 .. 1;
12065       Master_V2      at 0 range  2 .. 2;
12066       Master_V3      at 0 range  3 .. 3;
12067       Master_V4      at 0 range  4 .. 4;
12068       Master_V5      at 0 range  5 .. 5;
12069       Master_V6      at 0 range  6 .. 6;
12070       Master_V7      at 0 range  7 .. 7;
12071       Slave_Control  at 0 range  8 .. 8;
12072       Slave_V1       at 0 range  9 .. 9;
12073       Slave_V2       at 0 range 10 .. 10;
12074       Slave_V3       at 0 range 11 .. 11;
12075       Slave_V4       at 0 range 12 .. 12;
12076       Slave_V5       at 0 range 13 .. 13;
12077       Slave_V6       at 0 range 14 .. 14;
12078       Slave_V7       at 0 range 15 .. 15;
12079    end record;
12080 @end smallexample
12081
12082 @noindent
12083 This is exactly equivalent to saying (a repeat of the first example):
12084
12085 @smallexample @c ada
12086    for Data'Bit_Order use High_Order_First;
12087    for Data use record
12088       Master_Control at 0 range 0 .. 0;
12089       Master_V1      at 0 range 1 .. 1;
12090       Master_V2      at 0 range 2 .. 2;
12091       Master_V3      at 0 range 3 .. 3;
12092       Master_V4      at 0 range 4 .. 4;
12093       Master_V5      at 0 range 5 .. 5;
12094       Master_V6      at 0 range 6 .. 6;
12095       Master_V7      at 0 range 7 .. 7;
12096       Slave_Control  at 1 range 0 .. 0;
12097       Slave_V1       at 1 range 1 .. 1;
12098       Slave_V2       at 1 range 2 .. 2;
12099       Slave_V3       at 1 range 3 .. 3;
12100       Slave_V4       at 1 range 4 .. 4;
12101       Slave_V5       at 1 range 5 .. 5;
12102       Slave_V6       at 1 range 6 .. 6;
12103       Slave_V7       at 1 range 7 .. 7;
12104    end record;
12105 @end smallexample
12106
12107 @noindent
12108 Why are they equivalent? Well take a specific field, the @code{Slave_V2}
12109 field.  The storage place attributes are obtained by normalizing the
12110 values given so that the @code{First_Bit} value is less than 8.  After
12111 normalizing the values (0,10,10) we get (1,2,2) which is exactly what
12112 we specified in the other case.
12113
12114 Now one might expect that the @code{Bit_Order} attribute might affect
12115 bit numbering within the entire record component (two bytes in this
12116 case, thus affecting which byte fields end up in), but that is not
12117 the way this feature is defined, it only affects numbering of bits,
12118 not which byte they end up in.
12119
12120 Consequently it never makes sense to specify a starting bit number
12121 greater than 7 (for a byte addressable field) if an attribute
12122 definition for @code{Bit_Order} has been given, and indeed it
12123 may be actively confusing to specify such a value, so the compiler
12124 generates a warning for such usage.
12125
12126 If you do need to control byte ordering then appropriate conditional
12127 values must be used.  If in our example, the slave byte came first on
12128 some machines we might write:
12129
12130 @smallexample @c ada
12131    Master_Byte_First constant Boolean := @dots{};
12132
12133    Master_Byte : constant Natural :=
12134                    1 - Boolean'Pos (Master_Byte_First);
12135    Slave_Byte  : constant Natural :=
12136                    Boolean'Pos (Master_Byte_First);
12137
12138    for Data'Bit_Order use High_Order_First;
12139    for Data use record
12140       Master_Control at Master_Byte range 0 .. 0;
12141       Master_V1      at Master_Byte range 1 .. 1;
12142       Master_V2      at Master_Byte range 2 .. 2;
12143       Master_V3      at Master_Byte range 3 .. 3;
12144       Master_V4      at Master_Byte range 4 .. 4;
12145       Master_V5      at Master_Byte range 5 .. 5;
12146       Master_V6      at Master_Byte range 6 .. 6;
12147       Master_V7      at Master_Byte range 7 .. 7;
12148       Slave_Control  at Slave_Byte  range 0 .. 0;
12149       Slave_V1       at Slave_Byte  range 1 .. 1;
12150       Slave_V2       at Slave_Byte  range 2 .. 2;
12151       Slave_V3       at Slave_Byte  range 3 .. 3;
12152       Slave_V4       at Slave_Byte  range 4 .. 4;
12153       Slave_V5       at Slave_Byte  range 5 .. 5;
12154       Slave_V6       at Slave_Byte  range 6 .. 6;
12155       Slave_V7       at Slave_Byte  range 7 .. 7;
12156    end record;
12157 @end smallexample
12158
12159 @noindent
12160 Now to switch between machines, all that is necessary is
12161 to set the boolean constant @code{Master_Byte_First} in
12162 an appropriate manner.
12163
12164 @node Pragma Pack for Arrays
12165 @section Pragma Pack for Arrays
12166 @cindex Pragma Pack (for arrays)
12167
12168 @noindent
12169 Pragma @code{Pack} applied to an array has no effect unless the component type
12170 is packable.  For a component type to be packable, it must be one of the
12171 following cases:
12172
12173 @itemize @bullet
12174 @item
12175 Any scalar type
12176 @item
12177 Any type whose size is specified with a size clause
12178 @item
12179 Any packed array type with a static size
12180 @item
12181 Any record type padded because of its default alignment
12182 @end itemize
12183
12184 @noindent
12185 For all these cases, if the component subtype size is in the range
12186 1 through 63, then the effect of the pragma @code{Pack} is exactly as though a
12187 component size were specified giving the component subtype size.
12188 For example if we have:
12189
12190 @smallexample @c ada
12191    type r is range 0 .. 17;
12192
12193    type ar is array (1 .. 8) of r;
12194    pragma Pack (ar);
12195 @end smallexample
12196
12197 @noindent
12198 Then the component size of @code{ar} will be set to 5 (i.e.@: to @code{r'size},
12199 and the size of the array @code{ar} will be exactly 40 bits.
12200
12201 Note that in some cases this rather fierce approach to packing can produce
12202 unexpected effects.  For example, in Ada 95 and Ada 2005,
12203 subtype @code{Natural} typically has a size of 31, meaning that if you
12204 pack an array of @code{Natural}, you get 31-bit
12205 close packing, which saves a few bits, but results in far less efficient
12206 access.  Since many other Ada compilers will ignore such a packing request,
12207 GNAT will generate a warning on some uses of pragma @code{Pack} that it guesses
12208 might not be what is intended.  You can easily remove this warning by
12209 using an explicit @code{Component_Size} setting instead, which never generates
12210 a warning, since the intention of the programmer is clear in this case.
12211
12212 GNAT treats packed arrays in one of two ways.  If the size of the array is
12213 known at compile time and is less than 64 bits, then internally the array
12214 is represented as a single modular type, of exactly the appropriate number
12215 of bits.  If the length is greater than 63 bits, or is not known at compile
12216 time, then the packed array is represented as an array of bytes, and the
12217 length is always a multiple of 8 bits.
12218
12219 Note that to represent a packed array as a modular type, the alignment must
12220 be suitable for the modular type involved. For example, on typical machines
12221 a 32-bit packed array will be represented by a 32-bit modular integer with
12222 an alignment of four bytes. If you explicitly override the default alignment
12223 with an alignment clause that is too small, the modular representation
12224 cannot be used. For example, consider the following set of declarations:
12225
12226 @smallexample @c ada
12227    type R is range 1 .. 3;
12228    type S is array (1 .. 31) of R;
12229    for S'Component_Size use 2;
12230    for S'Size use 62;
12231    for S'Alignment use 1;
12232 @end smallexample
12233
12234 @noindent
12235 If the alignment clause were not present, then a 62-bit modular
12236 representation would be chosen (typically with an alignment of 4 or 8
12237 bytes depending on the target). But the default alignment is overridden
12238 with the explicit alignment clause. This means that the modular
12239 representation cannot be used, and instead the array of bytes
12240 representation must be used, meaning that the length must be a multiple
12241 of 8. Thus the above set of declarations will result in a diagnostic
12242 rejecting the size clause and noting that the minimum size allowed is 64.
12243
12244 @cindex Pragma Pack (for type Natural)
12245 @cindex Pragma Pack warning
12246
12247 One special case that is worth noting occurs when the base type of the
12248 component size is 8/16/32 and the subtype is one bit less. Notably this
12249 occurs with subtype @code{Natural}. Consider:
12250
12251 @smallexample @c ada
12252    type Arr is array (1 .. 32) of Natural;
12253    pragma Pack (Arr);
12254 @end smallexample
12255
12256 @noindent
12257 In all commonly used Ada 83 compilers, this pragma Pack would be ignored,
12258 since typically @code{Natural'Size} is 32 in Ada 83, and in any case most
12259 Ada 83 compilers did not attempt 31 bit packing.
12260
12261 In Ada 95 and Ada 2005, @code{Natural'Size} is required to be 31. Furthermore,
12262 GNAT really does pack 31-bit subtype to 31 bits. This may result in a
12263 substantial unintended performance penalty when porting legacy Ada 83 code.
12264 To help prevent this, GNAT generates a warning in such cases. If you really
12265 want 31 bit packing in a case like this, you can set the component size
12266 explicitly:
12267
12268 @smallexample @c ada
12269    type Arr is array (1 .. 32) of Natural;
12270    for Arr'Component_Size use 31;
12271 @end smallexample
12272
12273 @noindent
12274 Here 31-bit packing is achieved as required, and no warning is generated,
12275 since in this case the programmer intention is clear.
12276
12277 @node Pragma Pack for Records
12278 @section Pragma Pack for Records
12279 @cindex Pragma Pack (for records)
12280
12281 @noindent
12282 Pragma @code{Pack} applied to a record will pack the components to reduce
12283 wasted space from alignment gaps and by reducing the amount of space
12284 taken by components.  We distinguish between @emph{packable} components and
12285 @emph{non-packable} components.
12286 Components of the following types are considered packable:
12287 @itemize @bullet
12288 @item
12289 All primitive types are packable.
12290
12291 @item
12292 Small packed arrays, whose size does not exceed 64 bits, and where the
12293 size is statically known at compile time, are represented internally
12294 as modular integers, and so they are also packable.
12295
12296 @end itemize
12297
12298 @noindent
12299 All packable components occupy the exact number of bits corresponding to
12300 their @code{Size} value, and are packed with no padding bits, i.e.@: they
12301 can start on an arbitrary bit boundary.
12302
12303 All other types are non-packable, they occupy an integral number of
12304 storage units, and
12305 are placed at a boundary corresponding to their alignment requirements.
12306
12307 For example, consider the record
12308
12309 @smallexample @c ada
12310    type Rb1 is array (1 .. 13) of Boolean;
12311    pragma Pack (rb1);
12312
12313    type Rb2 is array (1 .. 65) of Boolean;
12314    pragma Pack (rb2);
12315
12316    type x2 is record
12317       l1 : Boolean;
12318       l2 : Duration;
12319       l3 : Float;
12320       l4 : Boolean;
12321       l5 : Rb1;
12322       l6 : Rb2;
12323    end record;
12324    pragma Pack (x2);
12325 @end smallexample
12326
12327 @noindent
12328 The representation for the record x2 is as follows:
12329
12330 @smallexample @c ada
12331 for x2'Size use 224;
12332 for x2 use record
12333    l1 at  0 range  0 .. 0;
12334    l2 at  0 range  1 .. 64;
12335    l3 at 12 range  0 .. 31;
12336    l4 at 16 range  0 .. 0;
12337    l5 at 16 range  1 .. 13;
12338    l6 at 18 range  0 .. 71;
12339 end record;
12340 @end smallexample
12341
12342 @noindent
12343 Studying this example, we see that the packable fields @code{l1}
12344 and @code{l2} are
12345 of length equal to their sizes, and placed at specific bit boundaries (and
12346 not byte boundaries) to
12347 eliminate padding.  But @code{l3} is of a non-packable float type, so
12348 it is on the next appropriate alignment boundary.
12349
12350 The next two fields are fully packable, so @code{l4} and @code{l5} are
12351 minimally packed with no gaps.  However, type @code{Rb2} is a packed
12352 array that is longer than 64 bits, so it is itself non-packable.  Thus
12353 the @code{l6} field is aligned to the next byte boundary, and takes an
12354 integral number of bytes, i.e.@: 72 bits.
12355
12356 @node Record Representation Clauses
12357 @section Record Representation Clauses
12358 @cindex Record Representation Clause
12359
12360 @noindent
12361 Record representation clauses may be given for all record types, including
12362 types obtained by record extension.  Component clauses are allowed for any
12363 static component.  The restrictions on component clauses depend on the type
12364 of the component.
12365
12366 @cindex Component Clause
12367 For all components of an elementary type, the only restriction on component
12368 clauses is that the size must be at least the 'Size value of the type
12369 (actually the Value_Size).  There are no restrictions due to alignment,
12370 and such components may freely cross storage boundaries.
12371
12372 Packed arrays with a size up to and including 64 bits are represented
12373 internally using a modular type with the appropriate number of bits, and
12374 thus the same lack of restriction applies.  For example, if you declare:
12375
12376 @smallexample @c ada
12377    type R is array (1 .. 49) of Boolean;
12378    pragma Pack (R);
12379    for R'Size use 49;
12380 @end smallexample
12381
12382 @noindent
12383 then a component clause for a component of type R may start on any
12384 specified bit boundary, and may specify a value of 49 bits or greater.
12385
12386 For packed bit arrays that are longer than 64 bits, there are two
12387 cases. If the component size is a power of 2 (1,2,4,8,16,32 bits),
12388 including the important case of single bits or boolean values, then
12389 there are no limitations on placement of such components, and they
12390 may start and end at arbitrary bit boundaries.
12391
12392 If the component size is not a power of 2 (e.g.@: 3 or 5), then
12393 an array of this type longer than 64 bits must always be placed on
12394 on a storage unit (byte) boundary and occupy an integral number
12395 of storage units (bytes). Any component clause that does not
12396 meet this requirement will be rejected.
12397
12398 Any aliased component, or component of an aliased type, must
12399 have its normal alignment and size. A component clause that
12400 does not meet this requirement will be rejected.
12401
12402 The tag field of a tagged type always occupies an address sized field at
12403 the start of the record.  No component clause may attempt to overlay this
12404 tag. When a tagged type appears as a component, the tag field must have
12405 proper alignment
12406
12407 In the case of a record extension T1, of a type T, no component clause applied
12408 to the type T1 can specify a storage location that would overlap the first
12409 T'Size bytes of the record.
12410
12411 For all other component types, including non-bit-packed arrays,
12412 the component can be placed at an arbitrary bit boundary,
12413 so for example, the following is permitted:
12414
12415 @smallexample @c ada
12416    type R is array (1 .. 10) of Boolean;
12417    for R'Size use 80;
12418
12419    type Q is record
12420       G, H : Boolean;
12421       L, M : R;
12422    end record;
12423
12424    for Q use record
12425       G at 0 range  0 ..   0;
12426       H at 0 range  1 ..   1;
12427       L at 0 range  2 ..  81;
12428       R at 0 range 82 .. 161;
12429    end record;
12430 @end smallexample
12431
12432 @noindent
12433 Note: the above rules apply to recent releases of GNAT 5.
12434 In GNAT 3, there are more severe restrictions on larger components.
12435 For non-primitive types, including packed arrays with a size greater than
12436 64 bits, component clauses must respect the alignment requirement of the
12437 type, in particular, always starting on a byte boundary, and the length
12438 must be a multiple of the storage unit.
12439
12440 @node Enumeration Clauses
12441 @section Enumeration Clauses
12442
12443 The only restriction on enumeration clauses is that the range of values
12444 must be representable.  For the signed case, if one or more of the
12445 representation values are negative, all values must be in the range:
12446
12447 @smallexample @c ada
12448    System.Min_Int .. System.Max_Int
12449 @end smallexample
12450
12451 @noindent
12452 For the unsigned case, where all values are nonnegative, the values must
12453 be in the range:
12454
12455 @smallexample @c ada
12456    0 .. System.Max_Binary_Modulus;
12457 @end smallexample
12458
12459 @noindent
12460 A @emph{confirming} representation clause is one in which the values range
12461 from 0 in sequence, i.e.@: a clause that confirms the default representation
12462 for an enumeration type.
12463 Such a confirming representation
12464 is permitted by these rules, and is specially recognized by the compiler so
12465 that no extra overhead results from the use of such a clause.
12466
12467 If an array has an index type which is an enumeration type to which an
12468 enumeration clause has been applied, then the array is stored in a compact
12469 manner.  Consider the declarations:
12470
12471 @smallexample @c ada
12472    type r is (A, B, C);
12473    for r use (A => 1, B => 5, C => 10);
12474    type t is array (r) of Character;
12475 @end smallexample
12476
12477 @noindent
12478 The array type t corresponds to a vector with exactly three elements and
12479 has a default size equal to @code{3*Character'Size}.  This ensures efficient
12480 use of space, but means that accesses to elements of the array will incur
12481 the overhead of converting representation values to the corresponding
12482 positional values, (i.e.@: the value delivered by the @code{Pos} attribute).
12483
12484 @node Address Clauses
12485 @section Address Clauses
12486 @cindex Address Clause
12487
12488 The reference manual allows a general restriction on representation clauses,
12489 as found in RM 13.1(22):
12490
12491 @quotation
12492 An implementation need not support representation
12493 items containing nonstatic expressions, except that
12494 an implementation should support a representation item
12495 for a given entity if each nonstatic expression in the
12496 representation item is a name that statically denotes
12497 a constant declared before the entity.
12498 @end quotation
12499
12500 @noindent
12501 In practice this is applicable only to address clauses, since this is the
12502 only case in which a non-static expression is permitted by the syntax.  As
12503 the AARM notes in sections 13.1 (22.a-22.h):
12504
12505 @display
12506   22.a   Reason: This is to avoid the following sort of thing:
12507
12508   22.b        X : Integer := F(@dots{});
12509               Y : Address := G(@dots{});
12510               for X'Address use Y;
12511
12512   22.c   In the above, we have to evaluate the
12513          initialization expression for X before we
12514          know where to put the result.  This seems
12515          like an unreasonable implementation burden.
12516
12517   22.d   The above code should instead be written
12518          like this:
12519
12520   22.e        Y : constant Address := G(@dots{});
12521               X : Integer := F(@dots{});
12522               for X'Address use Y;
12523
12524   22.f   This allows the expression ``Y'' to be safely
12525          evaluated before X is created.
12526
12527   22.g   The constant could be a formal parameter of mode in.
12528
12529   22.h   An implementation can support other nonstatic
12530          expressions if it wants to.  Expressions of type
12531          Address are hardly ever static, but their value
12532          might be known at compile time anyway in many
12533          cases.
12534 @end display
12535
12536 @noindent
12537 GNAT does indeed permit many additional cases of non-static expressions.  In
12538 particular, if the type involved is elementary there are no restrictions
12539 (since in this case, holding a temporary copy of the initialization value,
12540 if one is present, is inexpensive).  In addition, if there is no implicit or
12541 explicit initialization, then there are no restrictions.  GNAT will reject
12542 only the case where all three of these conditions hold:
12543
12544 @itemize @bullet
12545
12546 @item
12547 The type of the item is non-elementary (e.g.@: a record or array).
12548
12549 @item
12550 There is explicit or implicit initialization required for the object.
12551 Note that access values are always implicitly initialized.
12552
12553 @item
12554 The address value is non-static.  Here GNAT is more permissive than the
12555 RM, and allows the address value to be the address of a previously declared
12556 stand-alone variable, as long as it does not itself have an address clause.
12557
12558 @smallexample @c ada
12559            Anchor  : Some_Initialized_Type;
12560            Overlay : Some_Initialized_Type;
12561            for Overlay'Address use Anchor'Address;
12562 @end smallexample
12563
12564 @noindent
12565 However, the prefix of the address clause cannot be an array component, or
12566 a component of a discriminated record.
12567
12568 @end itemize
12569
12570 @noindent
12571 As noted above in section 22.h, address values are typically non-static.  In
12572 particular the To_Address function, even if applied to a literal value, is
12573 a non-static function call.  To avoid this minor annoyance, GNAT provides
12574 the implementation defined attribute 'To_Address.  The following two
12575 expressions have identical values:
12576
12577 @findex Attribute
12578 @findex To_Address
12579 @smallexample @c ada
12580    To_Address (16#1234_0000#)
12581    System'To_Address (16#1234_0000#);
12582 @end smallexample
12583
12584 @noindent
12585 except that the second form is considered to be a static expression, and
12586 thus when used as an address clause value is always permitted.
12587
12588 @noindent
12589 Additionally, GNAT treats as static an address clause that is an
12590 unchecked_conversion of a static integer value.  This simplifies the porting
12591 of legacy code, and provides a portable equivalent to the GNAT attribute
12592 @code{To_Address}.
12593
12594 Another issue with address clauses is the interaction with alignment
12595 requirements.  When an address clause is given for an object, the address
12596 value must be consistent with the alignment of the object (which is usually
12597 the same as the alignment of the type of the object).  If an address clause
12598 is given that specifies an inappropriately aligned address value, then the
12599 program execution is erroneous.
12600
12601 Since this source of erroneous behavior can have unfortunate effects, GNAT
12602 checks (at compile time if possible, generating a warning, or at execution
12603 time with a run-time check) that the alignment is appropriate.  If the
12604 run-time check fails, then @code{Program_Error} is raised.  This run-time
12605 check is suppressed if range checks are suppressed, or if the special GNAT
12606 check Alignment_Check is suppressed, or if
12607 @code{pragma Restrictions (No_Elaboration_Code)} is in effect.
12608
12609 Finally, GNAT does not permit overlaying of objects of controlled types or
12610 composite types containing a controlled component. In most cases, the compiler
12611 can detect an attempt at such overlays and will generate a warning at compile
12612 time and a Program_Error exception at run time.
12613
12614 @findex Export
12615 An address clause cannot be given for an exported object.  More
12616 understandably the real restriction is that objects with an address
12617 clause cannot be exported.  This is because such variables are not
12618 defined by the Ada program, so there is no external object to export.
12619
12620 @findex Import
12621 It is permissible to give an address clause and a pragma Import for the
12622 same object.  In this case, the variable is not really defined by the
12623 Ada program, so there is no external symbol to be linked.  The link name
12624 and the external name are ignored in this case.  The reason that we allow this
12625 combination is that it provides a useful idiom to avoid unwanted
12626 initializations on objects with address clauses.
12627
12628 When an address clause is given for an object that has implicit or
12629 explicit initialization, then by default initialization takes place.  This
12630 means that the effect of the object declaration is to overwrite the
12631 memory at the specified address.  This is almost always not what the
12632 programmer wants, so GNAT will output a warning:
12633
12634 @smallexample
12635   with System;
12636   package G is
12637      type R is record
12638         M : Integer := 0;
12639      end record;
12640
12641      Ext : R;
12642      for Ext'Address use System'To_Address (16#1234_1234#);
12643          |
12644   >>> warning: implicit initialization of "Ext" may
12645       modify overlaid storage
12646   >>> warning: use pragma Import for "Ext" to suppress
12647       initialization (RM B(24))
12648
12649   end G;
12650 @end smallexample
12651
12652 @noindent
12653 As indicated by the warning message, the solution is to use a (dummy) pragma
12654 Import to suppress this initialization.  The pragma tell the compiler that the
12655 object is declared and initialized elsewhere.  The following package compiles
12656 without warnings (and the initialization is suppressed):
12657
12658 @smallexample @c ada
12659    with System;
12660    package G is
12661       type R is record
12662          M : Integer := 0;
12663       end record;
12664
12665       Ext : R;
12666       for Ext'Address use System'To_Address (16#1234_1234#);
12667       pragma Import (Ada, Ext);
12668    end G;
12669 @end smallexample
12670
12671 @noindent
12672 A final issue with address clauses involves their use for overlaying
12673 variables, as in the following example:
12674 @cindex Overlaying of objects
12675
12676 @smallexample @c ada
12677   A : Integer;
12678   B : Integer;
12679   for B'Address use A'Address;
12680 @end smallexample
12681
12682 @noindent
12683 or alternatively, using the form recommended by the RM:
12684
12685 @smallexample @c ada
12686   A    : Integer;
12687   Addr : constant Address := A'Address;
12688   B    : Integer;
12689   for B'Address use Addr;
12690 @end smallexample
12691
12692 @noindent
12693 In both of these cases, @code{A}
12694 and @code{B} become aliased to one another via the
12695 address clause. This use of address clauses to overlay
12696 variables, achieving an effect similar to unchecked
12697 conversion was erroneous in Ada 83, but in Ada 95 and Ada 2005
12698 the effect is implementation defined. Furthermore, the
12699 Ada RM specifically recommends that in a situation
12700 like this, @code{B} should be subject to the following
12701 implementation advice (RM 13.3(19)):
12702
12703 @quotation
12704 19  If the Address of an object is specified, or it is imported
12705     or exported, then the implementation should not perform
12706     optimizations based on assumptions of no aliases.
12707 @end quotation
12708
12709 @noindent
12710 GNAT follows this recommendation, and goes further by also applying
12711 this recommendation to the overlaid variable (@code{A}
12712 in the above example) in this case. This means that the overlay
12713 works "as expected", in that a modification to one of the variables
12714 will affect the value of the other.
12715
12716 @node Effect of Convention on Representation
12717 @section Effect of Convention on Representation
12718 @cindex Convention, effect on representation
12719
12720 @noindent
12721 Normally the specification of a foreign language convention for a type or
12722 an object has no effect on the chosen representation.  In particular, the
12723 representation chosen for data in GNAT generally meets the standard system
12724 conventions, and for example records are laid out in a manner that is
12725 consistent with C@.  This means that specifying convention C (for example)
12726 has no effect.
12727
12728 There are four exceptions to this general rule:
12729
12730 @itemize @bullet
12731
12732 @item Convention Fortran and array subtypes
12733 If pragma Convention Fortran is specified for an array subtype, then in
12734 accordance with the implementation advice in section 3.6.2(11) of the
12735 Ada Reference Manual, the array will be stored in a Fortran-compatible
12736 column-major manner, instead of the normal default row-major order.
12737
12738 @item Convention C and enumeration types
12739 GNAT normally stores enumeration types in 8, 16, or 32 bits as required
12740 to accommodate all values of the type.  For example, for the enumeration
12741 type declared by:
12742
12743 @smallexample @c ada
12744    type Color is (Red, Green, Blue);
12745 @end smallexample
12746
12747 @noindent
12748 8 bits is sufficient to store all values of the type, so by default, objects
12749 of type @code{Color} will be represented using 8 bits.  However, normal C
12750 convention is to use 32 bits for all enum values in C, since enum values
12751 are essentially of type int.  If pragma @code{Convention C} is specified for an
12752 Ada enumeration type, then the size is modified as necessary (usually to
12753 32 bits) to be consistent with the C convention for enum values.
12754
12755 Note that this treatment applies only to types. If Convention C is given for
12756 an enumeration object, where the enumeration type is not Convention C, then
12757 Object_Size bits are allocated. For example, for a normal enumeration type,
12758 with less than 256 elements, only 8 bits will be allocated for the object.
12759 Since this may be a surprise in terms of what C expects, GNAT will issue a
12760 warning in this situation. The warning can be suppressed by giving an explicit
12761 size clause specifying the desired size.
12762
12763 @item Convention C/Fortran and Boolean types
12764 In C, the usual convention for boolean values, that is values used for
12765 conditions, is that zero represents false, and nonzero values represent
12766 true.  In Ada, the normal convention is that two specific values, typically
12767 0/1, are used to represent false/true respectively.
12768
12769 Fortran has a similar convention for @code{LOGICAL} values (any nonzero
12770 value represents true).
12771
12772 To accommodate the Fortran and C conventions, if a pragma Convention specifies
12773 C or Fortran convention for a derived Boolean, as in the following example:
12774
12775 @smallexample @c ada
12776    type C_Switch is new Boolean;
12777    pragma Convention (C, C_Switch);
12778 @end smallexample
12779
12780 @noindent
12781 then the GNAT generated code will treat any nonzero value as true.  For truth
12782 values generated by GNAT, the conventional value 1 will be used for True, but
12783 when one of these values is read, any nonzero value is treated as True.
12784
12785 @item Access types on OpenVMS
12786 For 64-bit OpenVMS systems, access types (other than those for unconstrained
12787 arrays) are 64-bits long. An exception to this rule is for the case of
12788 C-convention access types where there is no explicit size clause present (or
12789 inherited for derived types). In this case, GNAT chooses to make these
12790 pointers 32-bits, which provides an easier path for migration of 32-bit legacy
12791 code. size clause specifying 64-bits must be used to obtain a 64-bit pointer.
12792
12793 @end itemize
12794
12795 @node Determining the Representations chosen by GNAT
12796 @section Determining the Representations chosen by GNAT
12797 @cindex Representation, determination of
12798 @cindex @option{-gnatR} switch
12799
12800 @noindent
12801 Although the descriptions in this section are intended to be complete, it is
12802 often easier to simply experiment to see what GNAT accepts and what the
12803 effect is on the layout of types and objects.
12804
12805 As required by the Ada RM, if a representation clause is not accepted, then
12806 it must be rejected as illegal by the compiler.  However, when a
12807 representation clause or pragma is accepted, there can still be questions
12808 of what the compiler actually does.  For example, if a partial record
12809 representation clause specifies the location of some components and not
12810 others, then where are the non-specified components placed? Or if pragma
12811 @code{Pack} is used on a record, then exactly where are the resulting
12812 fields placed? The section on pragma @code{Pack} in this chapter can be
12813 used to answer the second question, but it is often easier to just see
12814 what the compiler does.
12815
12816 For this purpose, GNAT provides the option @option{-gnatR}.  If you compile
12817 with this option, then the compiler will output information on the actual
12818 representations chosen, in a format similar to source representation
12819 clauses.  For example, if we compile the package:
12820
12821 @smallexample @c ada
12822 package q is
12823    type r (x : boolean) is tagged record
12824       case x is
12825          when True => S : String (1 .. 100);
12826          when False => null;
12827       end case;
12828    end record;
12829
12830    type r2 is new r (false) with record
12831       y2 : integer;
12832    end record;
12833
12834    for r2 use record
12835       y2 at 16 range 0 .. 31;
12836    end record;
12837
12838    type x is record
12839       y : character;
12840    end record;
12841
12842    type x1 is array (1 .. 10) of x;
12843    for x1'component_size use 11;
12844
12845    type ia is access integer;
12846
12847    type Rb1 is array (1 .. 13) of Boolean;
12848    pragma Pack (rb1);
12849
12850    type Rb2 is array (1 .. 65) of Boolean;
12851    pragma Pack (rb2);
12852
12853    type x2 is record
12854       l1 : Boolean;
12855       l2 : Duration;
12856       l3 : Float;
12857       l4 : Boolean;
12858       l5 : Rb1;
12859       l6 : Rb2;
12860    end record;
12861    pragma Pack (x2);
12862 end q;
12863 @end smallexample
12864
12865 @noindent
12866 using the switch @option{-gnatR} we obtain the following output:
12867
12868 @smallexample
12869 Representation information for unit q
12870 -------------------------------------
12871
12872 for r'Size use ??;
12873 for r'Alignment use 4;
12874 for r use record
12875    x    at 4 range  0 .. 7;
12876    _tag at 0 range  0 .. 31;
12877    s    at 5 range  0 .. 799;
12878 end record;
12879
12880 for r2'Size use 160;
12881 for r2'Alignment use 4;
12882 for r2 use record
12883    x       at  4 range  0 .. 7;
12884    _tag    at  0 range  0 .. 31;
12885    _parent at  0 range  0 .. 63;
12886    y2      at 16 range  0 .. 31;
12887 end record;
12888
12889 for x'Size use 8;
12890 for x'Alignment use 1;
12891 for x use record
12892    y at 0 range  0 .. 7;
12893 end record;
12894
12895 for x1'Size use 112;
12896 for x1'Alignment use 1;
12897 for x1'Component_Size use 11;
12898
12899 for rb1'Size use 13;
12900 for rb1'Alignment use 2;
12901 for rb1'Component_Size use 1;
12902
12903 for rb2'Size use 72;
12904 for rb2'Alignment use 1;
12905 for rb2'Component_Size use 1;
12906
12907 for x2'Size use 224;
12908 for x2'Alignment use 4;
12909 for x2 use record
12910    l1 at  0 range  0 .. 0;
12911    l2 at  0 range  1 .. 64;
12912    l3 at 12 range  0 .. 31;
12913    l4 at 16 range  0 .. 0;
12914    l5 at 16 range  1 .. 13;
12915    l6 at 18 range  0 .. 71;
12916 end record;
12917 @end smallexample
12918
12919 @noindent
12920 The Size values are actually the Object_Size, i.e.@: the default size that
12921 will be allocated for objects of the type.
12922 The ?? size for type r indicates that we have a variant record, and the
12923 actual size of objects will depend on the discriminant value.
12924
12925 The Alignment values show the actual alignment chosen by the compiler
12926 for each record or array type.
12927
12928 The record representation clause for type r shows where all fields
12929 are placed, including the compiler generated tag field (whose location
12930 cannot be controlled by the programmer).
12931
12932 The record representation clause for the type extension r2 shows all the
12933 fields present, including the parent field, which is a copy of the fields
12934 of the parent type of r2, i.e.@: r1.
12935
12936 The component size and size clauses for types rb1 and rb2 show
12937 the exact effect of pragma @code{Pack} on these arrays, and the record
12938 representation clause for type x2 shows how pragma @code{Pack} affects
12939 this record type.
12940
12941 In some cases, it may be useful to cut and paste the representation clauses
12942 generated by the compiler into the original source to fix and guarantee
12943 the actual representation to be used.
12944
12945 @node Standard Library Routines
12946 @chapter Standard Library Routines
12947
12948 @noindent
12949 The Ada Reference Manual contains in Annex A a full description of an
12950 extensive set of standard library routines that can be used in any Ada
12951 program, and which must be provided by all Ada compilers.  They are
12952 analogous to the standard C library used by C programs.
12953
12954 GNAT implements all of the facilities described in annex A, and for most
12955 purposes the description in the Ada Reference Manual, or appropriate Ada
12956 text book, will be sufficient for making use of these facilities.
12957
12958 In the case of the input-output facilities,
12959 @xref{The Implementation of Standard I/O},
12960 gives details on exactly how GNAT interfaces to the
12961 file system.  For the remaining packages, the Ada Reference Manual
12962 should be sufficient.  The following is a list of the packages included,
12963 together with a brief description of the functionality that is provided.
12964
12965 For completeness, references are included to other predefined library
12966 routines defined in other sections of the Ada Reference Manual (these are
12967 cross-indexed from Annex A).
12968
12969 @table @code
12970 @item Ada (A.2)
12971 This is a parent package for all the standard library packages.  It is
12972 usually included implicitly in your program, and itself contains no
12973 useful data or routines.
12974
12975 @item Ada.Calendar (9.6)
12976 @code{Calendar} provides time of day access, and routines for
12977 manipulating times and durations.
12978
12979 @item Ada.Characters (A.3.1)
12980 This is a dummy parent package that contains no useful entities
12981
12982 @item Ada.Characters.Handling (A.3.2)
12983 This package provides some basic character handling capabilities,
12984 including classification functions for classes of characters (e.g.@: test
12985 for letters, or digits).
12986
12987 @item Ada.Characters.Latin_1 (A.3.3)
12988 This package includes a complete set of definitions of the characters
12989 that appear in type CHARACTER@.  It is useful for writing programs that
12990 will run in international environments.  For example, if you want an
12991 upper case E with an acute accent in a string, it is often better to use
12992 the definition of @code{UC_E_Acute} in this package.  Then your program
12993 will print in an understandable manner even if your environment does not
12994 support these extended characters.
12995
12996 @item Ada.Command_Line (A.15)
12997 This package provides access to the command line parameters and the name
12998 of the current program (analogous to the use of @code{argc} and @code{argv}
12999 in C), and also allows the exit status for the program to be set in a
13000 system-independent manner.
13001
13002 @item Ada.Decimal (F.2)
13003 This package provides constants describing the range of decimal numbers
13004 implemented, and also a decimal divide routine (analogous to the COBOL
13005 verb DIVIDE @dots{} GIVING @dots{} REMAINDER @dots{})
13006
13007 @item Ada.Direct_IO (A.8.4)
13008 This package provides input-output using a model of a set of records of
13009 fixed-length, containing an arbitrary definite Ada type, indexed by an
13010 integer record number.
13011
13012 @item Ada.Dynamic_Priorities (D.5)
13013 This package allows the priorities of a task to be adjusted dynamically
13014 as the task is running.
13015
13016 @item Ada.Exceptions (11.4.1)
13017 This package provides additional information on exceptions, and also
13018 contains facilities for treating exceptions as data objects, and raising
13019 exceptions with associated messages.
13020
13021 @item Ada.Finalization (7.6)
13022 This package contains the declarations and subprograms to support the
13023 use of controlled types, providing for automatic initialization and
13024 finalization (analogous to the constructors and destructors of C++)
13025
13026 @item Ada.Interrupts (C.3.2)
13027 This package provides facilities for interfacing to interrupts, which
13028 includes the set of signals or conditions that can be raised and
13029 recognized as interrupts.
13030
13031 @item Ada.Interrupts.Names (C.3.2)
13032 This package provides the set of interrupt names (actually signal
13033 or condition names) that can be handled by GNAT@.
13034
13035 @item Ada.IO_Exceptions (A.13)
13036 This package defines the set of exceptions that can be raised by use of
13037 the standard IO packages.
13038
13039 @item Ada.Numerics
13040 This package contains some standard constants and exceptions used
13041 throughout the numerics packages.  Note that the constants pi and e are
13042 defined here, and it is better to use these definitions than rolling
13043 your own.
13044
13045 @item Ada.Numerics.Complex_Elementary_Functions
13046 Provides the implementation of standard elementary functions (such as
13047 log and trigonometric functions) operating on complex numbers using the
13048 standard @code{Float} and the @code{Complex} and @code{Imaginary} types
13049 created by the package @code{Numerics.Complex_Types}.
13050
13051 @item Ada.Numerics.Complex_Types
13052 This is a predefined instantiation of
13053 @code{Numerics.Generic_Complex_Types} using @code{Standard.Float} to
13054 build the type @code{Complex} and @code{Imaginary}.
13055
13056 @item Ada.Numerics.Discrete_Random
13057 This generic package provides a random number generator suitable for generating
13058 uniformly distributed values of a specified discrete subtype.
13059
13060 @item Ada.Numerics.Float_Random
13061 This package provides a random number generator suitable for generating
13062 uniformly distributed floating point values in the unit interval.
13063
13064 @item Ada.Numerics.Generic_Complex_Elementary_Functions
13065 This is a generic version of the package that provides the
13066 implementation of standard elementary functions (such as log and
13067 trigonometric functions) for an arbitrary complex type.
13068
13069 The following predefined instantiations of this package are provided:
13070
13071 @table @code
13072 @item Short_Float
13073 @code{Ada.Numerics.Short_Complex_Elementary_Functions}
13074 @item Float
13075 @code{Ada.Numerics.Complex_Elementary_Functions}
13076 @item Long_Float
13077 @code{Ada.Numerics.Long_Complex_Elementary_Functions}
13078 @end table
13079
13080 @item Ada.Numerics.Generic_Complex_Types
13081 This is a generic package that allows the creation of complex types,
13082 with associated complex arithmetic operations.
13083
13084 The following predefined instantiations of this package exist
13085 @table @code
13086 @item Short_Float
13087 @code{Ada.Numerics.Short_Complex_Complex_Types}
13088 @item Float
13089 @code{Ada.Numerics.Complex_Complex_Types}
13090 @item Long_Float
13091 @code{Ada.Numerics.Long_Complex_Complex_Types}
13092 @end table
13093
13094 @item Ada.Numerics.Generic_Elementary_Functions
13095 This is a generic package that provides the implementation of standard
13096 elementary functions (such as log an trigonometric functions) for an
13097 arbitrary float type.
13098
13099 The following predefined instantiations of this package exist
13100
13101 @table @code
13102 @item Short_Float
13103 @code{Ada.Numerics.Short_Elementary_Functions}
13104 @item Float
13105 @code{Ada.Numerics.Elementary_Functions}
13106 @item Long_Float
13107 @code{Ada.Numerics.Long_Elementary_Functions}
13108 @end table
13109
13110 @item Ada.Real_Time (D.8)
13111 This package provides facilities similar to those of @code{Calendar}, but
13112 operating with a finer clock suitable for real time control. Note that
13113 annex D requires that there be no backward clock jumps, and GNAT generally
13114 guarantees this behavior, but of course if the external clock on which
13115 the GNAT runtime depends is deliberately reset by some external event,
13116 then such a backward jump may occur.
13117
13118 @item Ada.Sequential_IO (A.8.1)
13119 This package provides input-output facilities for sequential files,
13120 which can contain a sequence of values of a single type, which can be
13121 any Ada type, including indefinite (unconstrained) types.
13122
13123 @item Ada.Storage_IO (A.9)
13124 This package provides a facility for mapping arbitrary Ada types to and
13125 from a storage buffer.  It is primarily intended for the creation of new
13126 IO packages.
13127
13128 @item Ada.Streams (13.13.1)
13129 This is a generic package that provides the basic support for the
13130 concept of streams as used by the stream attributes (@code{Input},
13131 @code{Output}, @code{Read} and @code{Write}).
13132
13133 @item Ada.Streams.Stream_IO (A.12.1)
13134 This package is a specialization of the type @code{Streams} defined in
13135 package @code{Streams} together with a set of operations providing
13136 Stream_IO capability.  The Stream_IO model permits both random and
13137 sequential access to a file which can contain an arbitrary set of values
13138 of one or more Ada types.
13139
13140 @item Ada.Strings (A.4.1)
13141 This package provides some basic constants used by the string handling
13142 packages.
13143
13144 @item Ada.Strings.Bounded (A.4.4)
13145 This package provides facilities for handling variable length
13146 strings.  The bounded model requires a maximum length.  It is thus
13147 somewhat more limited than the unbounded model, but avoids the use of
13148 dynamic allocation or finalization.
13149
13150 @item Ada.Strings.Fixed (A.4.3)
13151 This package provides facilities for handling fixed length strings.
13152
13153 @item Ada.Strings.Maps (A.4.2)
13154 This package provides facilities for handling character mappings and
13155 arbitrarily defined subsets of characters.  For instance it is useful in
13156 defining specialized translation tables.
13157
13158 @item Ada.Strings.Maps.Constants (A.4.6)
13159 This package provides a standard set of predefined mappings and
13160 predefined character sets.  For example, the standard upper to lower case
13161 conversion table is found in this package.  Note that upper to lower case
13162 conversion is non-trivial if you want to take the entire set of
13163 characters, including extended characters like E with an acute accent,
13164 into account.  You should use the mappings in this package (rather than
13165 adding 32 yourself) to do case mappings.
13166
13167 @item Ada.Strings.Unbounded (A.4.5)
13168 This package provides facilities for handling variable length
13169 strings.  The unbounded model allows arbitrary length strings, but
13170 requires the use of dynamic allocation and finalization.
13171
13172 @item Ada.Strings.Wide_Bounded (A.4.7)
13173 @itemx Ada.Strings.Wide_Fixed (A.4.7)
13174 @itemx Ada.Strings.Wide_Maps (A.4.7)
13175 @itemx Ada.Strings.Wide_Maps.Constants (A.4.7)
13176 @itemx Ada.Strings.Wide_Unbounded (A.4.7)
13177 These packages provide analogous capabilities to the corresponding
13178 packages without @samp{Wide_} in the name, but operate with the types
13179 @code{Wide_String} and @code{Wide_Character} instead of @code{String}
13180 and @code{Character}.
13181
13182 @item Ada.Strings.Wide_Wide_Bounded (A.4.7)
13183 @itemx Ada.Strings.Wide_Wide_Fixed (A.4.7)
13184 @itemx Ada.Strings.Wide_Wide_Maps (A.4.7)
13185 @itemx Ada.Strings.Wide_Wide_Maps.Constants (A.4.7)
13186 @itemx Ada.Strings.Wide_Wide_Unbounded (A.4.7)
13187 These packages provide analogous capabilities to the corresponding
13188 packages without @samp{Wide_} in the name, but operate with the types
13189 @code{Wide_Wide_String} and @code{Wide_Wide_Character} instead
13190 of @code{String} and @code{Character}.
13191
13192 @item Ada.Synchronous_Task_Control (D.10)
13193 This package provides some standard facilities for controlling task
13194 communication in a synchronous manner.
13195
13196 @item Ada.Tags
13197 This package contains definitions for manipulation of the tags of tagged
13198 values.
13199
13200 @item Ada.Task_Attributes
13201 This package provides the capability of associating arbitrary
13202 task-specific data with separate tasks.
13203
13204 @item Ada.Text_IO
13205 This package provides basic text input-output capabilities for
13206 character, string and numeric data.  The subpackages of this
13207 package are listed next.
13208
13209 @item Ada.Text_IO.Decimal_IO
13210 Provides input-output facilities for decimal fixed-point types
13211
13212 @item Ada.Text_IO.Enumeration_IO
13213 Provides input-output facilities for enumeration types.
13214
13215 @item Ada.Text_IO.Fixed_IO
13216 Provides input-output facilities for ordinary fixed-point types.
13217
13218 @item Ada.Text_IO.Float_IO
13219 Provides input-output facilities for float types.  The following
13220 predefined instantiations of this generic package are available:
13221
13222 @table @code
13223 @item Short_Float
13224 @code{Short_Float_Text_IO}
13225 @item Float
13226 @code{Float_Text_IO}
13227 @item Long_Float
13228 @code{Long_Float_Text_IO}
13229 @end table
13230
13231 @item Ada.Text_IO.Integer_IO
13232 Provides input-output facilities for integer types.  The following
13233 predefined instantiations of this generic package are available:
13234
13235 @table @code
13236 @item Short_Short_Integer
13237 @code{Ada.Short_Short_Integer_Text_IO}
13238 @item Short_Integer
13239 @code{Ada.Short_Integer_Text_IO}
13240 @item Integer
13241 @code{Ada.Integer_Text_IO}
13242 @item Long_Integer
13243 @code{Ada.Long_Integer_Text_IO}
13244 @item Long_Long_Integer
13245 @code{Ada.Long_Long_Integer_Text_IO}
13246 @end table
13247
13248 @item Ada.Text_IO.Modular_IO
13249 Provides input-output facilities for modular (unsigned) types
13250
13251 @item Ada.Text_IO.Complex_IO (G.1.3)
13252 This package provides basic text input-output capabilities for complex
13253 data.
13254
13255 @item Ada.Text_IO.Editing (F.3.3)
13256 This package contains routines for edited output, analogous to the use
13257 of pictures in COBOL@.  The picture formats used by this package are a
13258 close copy of the facility in COBOL@.
13259
13260 @item Ada.Text_IO.Text_Streams (A.12.2)
13261 This package provides a facility that allows Text_IO files to be treated
13262 as streams, so that the stream attributes can be used for writing
13263 arbitrary data, including binary data, to Text_IO files.
13264
13265 @item Ada.Unchecked_Conversion (13.9)
13266 This generic package allows arbitrary conversion from one type to
13267 another of the same size, providing for breaking the type safety in
13268 special circumstances.
13269
13270 If the types have the same Size (more accurately the same Value_Size),
13271 then the effect is simply to transfer the bits from the source to the
13272 target type without any modification.  This usage is well defined, and
13273 for simple types whose representation is typically the same across
13274 all implementations, gives a portable method of performing such
13275 conversions.
13276
13277 If the types do not have the same size, then the result is implementation
13278 defined, and thus may be non-portable.  The following describes how GNAT
13279 handles such unchecked conversion cases.
13280
13281 If the types are of different sizes, and are both discrete types, then
13282 the effect is of a normal type conversion without any constraint checking.
13283 In particular if the result type has a larger size, the result will be
13284 zero or sign extended.  If the result type has a smaller size, the result
13285 will be truncated by ignoring high order bits.
13286
13287 If the types are of different sizes, and are not both discrete types,
13288 then the conversion works as though pointers were created to the source
13289 and target, and the pointer value is converted.  The effect is that bits
13290 are copied from successive low order storage units and bits of the source
13291 up to the length of the target type.
13292
13293 A warning is issued if the lengths differ, since the effect in this
13294 case is implementation dependent, and the above behavior may not match
13295 that of some other compiler.
13296
13297 A pointer to one type may be converted to a pointer to another type using
13298 unchecked conversion.  The only case in which the effect is undefined is
13299 when one or both pointers are pointers to unconstrained array types.  In
13300 this case, the bounds information may get incorrectly transferred, and in
13301 particular, GNAT uses double size pointers for such types, and it is
13302 meaningless to convert between such pointer types.  GNAT will issue a
13303 warning if the alignment of the target designated type is more strict
13304 than the alignment of the source designated type (since the result may
13305 be unaligned in this case).
13306
13307 A pointer other than a pointer to an unconstrained array type may be
13308 converted to and from System.Address.  Such usage is common in Ada 83
13309 programs, but note that Ada.Address_To_Access_Conversions is the
13310 preferred method of performing such conversions in Ada 95 and Ada 2005.
13311 Neither
13312 unchecked conversion nor Ada.Address_To_Access_Conversions should be
13313 used in conjunction with pointers to unconstrained objects, since
13314 the bounds information cannot be handled correctly in this case.
13315
13316 @item Ada.Unchecked_Deallocation (13.11.2)
13317 This generic package allows explicit freeing of storage previously
13318 allocated by use of an allocator.
13319
13320 @item Ada.Wide_Text_IO (A.11)
13321 This package is similar to @code{Ada.Text_IO}, except that the external
13322 file supports wide character representations, and the internal types are
13323 @code{Wide_Character} and @code{Wide_String} instead of @code{Character}
13324 and @code{String}.  It contains generic subpackages listed next.
13325
13326 @item Ada.Wide_Text_IO.Decimal_IO
13327 Provides input-output facilities for decimal fixed-point types
13328
13329 @item Ada.Wide_Text_IO.Enumeration_IO
13330 Provides input-output facilities for enumeration types.
13331
13332 @item Ada.Wide_Text_IO.Fixed_IO
13333 Provides input-output facilities for ordinary fixed-point types.
13334
13335 @item Ada.Wide_Text_IO.Float_IO
13336 Provides input-output facilities for float types.  The following
13337 predefined instantiations of this generic package are available:
13338
13339 @table @code
13340 @item Short_Float
13341 @code{Short_Float_Wide_Text_IO}
13342 @item Float
13343 @code{Float_Wide_Text_IO}
13344 @item Long_Float
13345 @code{Long_Float_Wide_Text_IO}
13346 @end table
13347
13348 @item Ada.Wide_Text_IO.Integer_IO
13349 Provides input-output facilities for integer types.  The following
13350 predefined instantiations of this generic package are available:
13351
13352 @table @code
13353 @item Short_Short_Integer
13354 @code{Ada.Short_Short_Integer_Wide_Text_IO}
13355 @item Short_Integer
13356 @code{Ada.Short_Integer_Wide_Text_IO}
13357 @item Integer
13358 @code{Ada.Integer_Wide_Text_IO}
13359 @item Long_Integer
13360 @code{Ada.Long_Integer_Wide_Text_IO}
13361 @item Long_Long_Integer
13362 @code{Ada.Long_Long_Integer_Wide_Text_IO}
13363 @end table
13364
13365 @item Ada.Wide_Text_IO.Modular_IO
13366 Provides input-output facilities for modular (unsigned) types
13367
13368 @item Ada.Wide_Text_IO.Complex_IO (G.1.3)
13369 This package is similar to @code{Ada.Text_IO.Complex_IO}, except that the
13370 external file supports wide character representations.
13371
13372 @item Ada.Wide_Text_IO.Editing (F.3.4)
13373 This package is similar to @code{Ada.Text_IO.Editing}, except that the
13374 types are @code{Wide_Character} and @code{Wide_String} instead of
13375 @code{Character} and @code{String}.
13376
13377 @item Ada.Wide_Text_IO.Streams (A.12.3)
13378 This package is similar to @code{Ada.Text_IO.Streams}, except that the
13379 types are @code{Wide_Character} and @code{Wide_String} instead of
13380 @code{Character} and @code{String}.
13381
13382 @item Ada.Wide_Wide_Text_IO (A.11)
13383 This package is similar to @code{Ada.Text_IO}, except that the external
13384 file supports wide character representations, and the internal types are
13385 @code{Wide_Character} and @code{Wide_String} instead of @code{Character}
13386 and @code{String}.  It contains generic subpackages listed next.
13387
13388 @item Ada.Wide_Wide_Text_IO.Decimal_IO
13389 Provides input-output facilities for decimal fixed-point types
13390
13391 @item Ada.Wide_Wide_Text_IO.Enumeration_IO
13392 Provides input-output facilities for enumeration types.
13393
13394 @item Ada.Wide_Wide_Text_IO.Fixed_IO
13395 Provides input-output facilities for ordinary fixed-point types.
13396
13397 @item Ada.Wide_Wide_Text_IO.Float_IO
13398 Provides input-output facilities for float types.  The following
13399 predefined instantiations of this generic package are available:
13400
13401 @table @code
13402 @item Short_Float
13403 @code{Short_Float_Wide_Wide_Text_IO}
13404 @item Float
13405 @code{Float_Wide_Wide_Text_IO}
13406 @item Long_Float
13407 @code{Long_Float_Wide_Wide_Text_IO}
13408 @end table
13409
13410 @item Ada.Wide_Wide_Text_IO.Integer_IO
13411 Provides input-output facilities for integer types.  The following
13412 predefined instantiations of this generic package are available:
13413
13414 @table @code
13415 @item Short_Short_Integer
13416 @code{Ada.Short_Short_Integer_Wide_Wide_Text_IO}
13417 @item Short_Integer
13418 @code{Ada.Short_Integer_Wide_Wide_Text_IO}
13419 @item Integer
13420 @code{Ada.Integer_Wide_Wide_Text_IO}
13421 @item Long_Integer
13422 @code{Ada.Long_Integer_Wide_Wide_Text_IO}
13423 @item Long_Long_Integer
13424 @code{Ada.Long_Long_Integer_Wide_Wide_Text_IO}
13425 @end table
13426
13427 @item Ada.Wide_Wide_Text_IO.Modular_IO
13428 Provides input-output facilities for modular (unsigned) types
13429
13430 @item Ada.Wide_Wide_Text_IO.Complex_IO (G.1.3)
13431 This package is similar to @code{Ada.Text_IO.Complex_IO}, except that the
13432 external file supports wide character representations.
13433
13434 @item Ada.Wide_Wide_Text_IO.Editing (F.3.4)
13435 This package is similar to @code{Ada.Text_IO.Editing}, except that the
13436 types are @code{Wide_Character} and @code{Wide_String} instead of
13437 @code{Character} and @code{String}.
13438
13439 @item Ada.Wide_Wide_Text_IO.Streams (A.12.3)
13440 This package is similar to @code{Ada.Text_IO.Streams}, except that the
13441 types are @code{Wide_Character} and @code{Wide_String} instead of
13442 @code{Character} and @code{String}.
13443 @end table
13444
13445 @node The Implementation of Standard I/O
13446 @chapter The Implementation of Standard I/O
13447
13448 @noindent
13449 GNAT implements all the required input-output facilities described in
13450 A.6 through A.14.  These sections of the Ada Reference Manual describe the
13451 required behavior of these packages from the Ada point of view, and if
13452 you are writing a portable Ada program that does not need to know the
13453 exact manner in which Ada maps to the outside world when it comes to
13454 reading or writing external files, then you do not need to read this
13455 chapter.  As long as your files are all regular files (not pipes or
13456 devices), and as long as you write and read the files only from Ada, the
13457 description in the Ada Reference Manual is sufficient.
13458
13459 However, if you want to do input-output to pipes or other devices, such
13460 as the keyboard or screen, or if the files you are dealing with are
13461 either generated by some other language, or to be read by some other
13462 language, then you need to know more about the details of how the GNAT
13463 implementation of these input-output facilities behaves.
13464
13465 In this chapter we give a detailed description of exactly how GNAT
13466 interfaces to the file system.  As always, the sources of the system are
13467 available to you for answering questions at an even more detailed level,
13468 but for most purposes the information in this chapter will suffice.
13469
13470 Another reason that you may need to know more about how input-output is
13471 implemented arises when you have a program written in mixed languages
13472 where, for example, files are shared between the C and Ada sections of
13473 the same program.  GNAT provides some additional facilities, in the form
13474 of additional child library packages, that facilitate this sharing, and
13475 these additional facilities are also described in this chapter.
13476
13477 @menu
13478 * Standard I/O Packages::
13479 * FORM Strings::
13480 * Direct_IO::
13481 * Sequential_IO::
13482 * Text_IO::
13483 * Wide_Text_IO::
13484 * Wide_Wide_Text_IO::
13485 * Stream_IO::
13486 * Text Translation::
13487 * Shared Files::
13488 * Filenames encoding::
13489 * Open Modes::
13490 * Operations on C Streams::
13491 * Interfacing to C Streams::
13492 @end menu
13493
13494 @node Standard I/O Packages
13495 @section Standard I/O Packages
13496
13497 @noindent
13498 The Standard I/O packages described in Annex A for
13499
13500 @itemize @bullet
13501 @item
13502 Ada.Text_IO
13503 @item
13504 Ada.Text_IO.Complex_IO
13505 @item
13506 Ada.Text_IO.Text_Streams
13507 @item
13508 Ada.Wide_Text_IO
13509 @item
13510 Ada.Wide_Text_IO.Complex_IO
13511 @item
13512 Ada.Wide_Text_IO.Text_Streams
13513 @item
13514 Ada.Wide_Wide_Text_IO
13515 @item
13516 Ada.Wide_Wide_Text_IO.Complex_IO
13517 @item
13518 Ada.Wide_Wide_Text_IO.Text_Streams
13519 @item
13520 Ada.Stream_IO
13521 @item
13522 Ada.Sequential_IO
13523 @item
13524 Ada.Direct_IO
13525 @end itemize
13526
13527 @noindent
13528 are implemented using the C
13529 library streams facility; where
13530
13531 @itemize @bullet
13532 @item
13533 All files are opened using @code{fopen}.
13534 @item
13535 All input/output operations use @code{fread}/@code{fwrite}.
13536 @end itemize
13537
13538 @noindent
13539 There is no internal buffering of any kind at the Ada library level. The only
13540 buffering is that provided at the system level in the implementation of the
13541 library routines that support streams. This facilitates shared use of these
13542 streams by mixed language programs. Note though that system level buffering is
13543 explicitly enabled at elaboration of the standard I/O packages and that can
13544 have an impact on mixed language programs, in particular those using I/O before
13545 calling the Ada elaboration routine (e.g.@: adainit). It is recommended to call
13546 the Ada elaboration routine before performing any I/O or when impractical,
13547 flush the common I/O streams and in particular Standard_Output before
13548 elaborating the Ada code.
13549
13550 @node FORM Strings
13551 @section FORM Strings
13552
13553 @noindent
13554 The format of a FORM string in GNAT is:
13555
13556 @smallexample
13557 "keyword=value,keyword=value,@dots{},keyword=value"
13558 @end smallexample
13559
13560 @noindent
13561 where letters may be in upper or lower case, and there are no spaces
13562 between values.  The order of the entries is not important.  Currently
13563 the following keywords defined.
13564
13565 @smallexample
13566 TEXT_TRANSLATION=[YES|NO]
13567 SHARED=[YES|NO]
13568 WCEM=[n|h|u|s|e|8|b]
13569 ENCODING=[UTF8|8BITS]
13570 @end smallexample
13571
13572 @noindent
13573 The use of these parameters is described later in this section.
13574
13575 @node Direct_IO
13576 @section Direct_IO
13577
13578 @noindent
13579 Direct_IO can only be instantiated for definite types.  This is a
13580 restriction of the Ada language, which means that the records are fixed
13581 length (the length being determined by @code{@var{type}'Size}, rounded
13582 up to the next storage unit boundary if necessary).
13583
13584 The records of a Direct_IO file are simply written to the file in index
13585 sequence, with the first record starting at offset zero, and subsequent
13586 records following.  There is no control information of any kind.  For
13587 example, if 32-bit integers are being written, each record takes
13588 4-bytes, so the record at index @var{K} starts at offset
13589 (@var{K}@minus{}1)*4.
13590
13591 There is no limit on the size of Direct_IO files, they are expanded as
13592 necessary to accommodate whatever records are written to the file.
13593
13594 @node Sequential_IO
13595 @section Sequential_IO
13596
13597 @noindent
13598 Sequential_IO may be instantiated with either a definite (constrained)
13599 or indefinite (unconstrained) type.
13600
13601 For the definite type case, the elements written to the file are simply
13602 the memory images of the data values with no control information of any
13603 kind.  The resulting file should be read using the same type, no validity
13604 checking is performed on input.
13605
13606 For the indefinite type case, the elements written consist of two
13607 parts.  First is the size of the data item, written as the memory image
13608 of a @code{Interfaces.C.size_t} value, followed by the memory image of
13609 the data value.  The resulting file can only be read using the same
13610 (unconstrained) type.  Normal assignment checks are performed on these
13611 read operations, and if these checks fail, @code{Data_Error} is
13612 raised.  In particular, in the array case, the lengths must match, and in
13613 the variant record case, if the variable for a particular read operation
13614 is constrained, the discriminants must match.
13615
13616 Note that it is not possible to use Sequential_IO to write variable
13617 length array items, and then read the data back into different length
13618 arrays.  For example, the following will raise @code{Data_Error}:
13619
13620 @smallexample @c ada
13621  package IO is new Sequential_IO (String);
13622  F : IO.File_Type;
13623  S : String (1..4);
13624  @dots{}
13625  IO.Create (F)
13626  IO.Write (F, "hello!")
13627  IO.Reset (F, Mode=>In_File);
13628  IO.Read (F, S);
13629  Put_Line (S);
13630
13631 @end smallexample
13632
13633 @noindent
13634 On some Ada implementations, this will print @code{hell}, but the program is
13635 clearly incorrect, since there is only one element in the file, and that
13636 element is the string @code{hello!}.
13637
13638 In Ada 95 and Ada 2005, this kind of behavior can be legitimately achieved
13639 using Stream_IO, and this is the preferred mechanism.  In particular, the
13640 above program fragment rewritten to use Stream_IO will work correctly.
13641
13642 @node Text_IO
13643 @section Text_IO
13644
13645 @noindent
13646 Text_IO files consist of a stream of characters containing the following
13647 special control characters:
13648
13649 @smallexample
13650 LF (line feed, 16#0A#) Line Mark
13651 FF (form feed, 16#0C#) Page Mark
13652 @end smallexample
13653
13654 @noindent
13655 A canonical Text_IO file is defined as one in which the following
13656 conditions are met:
13657
13658 @itemize @bullet
13659 @item
13660 The character @code{LF} is used only as a line mark, i.e.@: to mark the end
13661 of the line.
13662
13663 @item
13664 The character @code{FF} is used only as a page mark, i.e.@: to mark the
13665 end of a page and consequently can appear only immediately following a
13666 @code{LF} (line mark) character.
13667
13668 @item
13669 The file ends with either @code{LF} (line mark) or @code{LF}-@code{FF}
13670 (line mark, page mark).  In the former case, the page mark is implicitly
13671 assumed to be present.
13672 @end itemize
13673
13674 @noindent
13675 A file written using Text_IO will be in canonical form provided that no
13676 explicit @code{LF} or @code{FF} characters are written using @code{Put}
13677 or @code{Put_Line}.  There will be no @code{FF} character at the end of
13678 the file unless an explicit @code{New_Page} operation was performed
13679 before closing the file.
13680
13681 A canonical Text_IO file that is a regular file (i.e., not a device or a
13682 pipe) can be read using any of the routines in Text_IO@.  The
13683 semantics in this case will be exactly as defined in the Ada Reference
13684 Manual, and all the routines in Text_IO are fully implemented.
13685
13686 A text file that does not meet the requirements for a canonical Text_IO
13687 file has one of the following:
13688
13689 @itemize @bullet
13690 @item
13691 The file contains @code{FF} characters not immediately following a
13692 @code{LF} character.
13693
13694 @item
13695 The file contains @code{LF} or @code{FF} characters written by
13696 @code{Put} or @code{Put_Line}, which are not logically considered to be
13697 line marks or page marks.
13698
13699 @item
13700 The file ends in a character other than @code{LF} or @code{FF},
13701 i.e.@: there is no explicit line mark or page mark at the end of the file.
13702 @end itemize
13703
13704 @noindent
13705 Text_IO can be used to read such non-standard text files but subprograms
13706 to do with line or page numbers do not have defined meanings.  In
13707 particular, a @code{FF} character that does not follow a @code{LF}
13708 character may or may not be treated as a page mark from the point of
13709 view of page and line numbering.  Every @code{LF} character is considered
13710 to end a line, and there is an implied @code{LF} character at the end of
13711 the file.
13712
13713 @menu
13714 * Text_IO Stream Pointer Positioning::
13715 * Text_IO Reading and Writing Non-Regular Files::
13716 * Get_Immediate::
13717 * Treating Text_IO Files as Streams::
13718 * Text_IO Extensions::
13719 * Text_IO Facilities for Unbounded Strings::
13720 @end menu
13721
13722 @node Text_IO Stream Pointer Positioning
13723 @subsection Stream Pointer Positioning
13724
13725 @noindent
13726 @code{Ada.Text_IO} has a definition of current position for a file that
13727 is being read.  No internal buffering occurs in Text_IO, and usually the
13728 physical position in the stream used to implement the file corresponds
13729 to this logical position defined by Text_IO@.  There are two exceptions:
13730
13731 @itemize @bullet
13732 @item
13733 After a call to @code{End_Of_Page} that returns @code{True}, the stream
13734 is positioned past the @code{LF} (line mark) that precedes the page
13735 mark.  Text_IO maintains an internal flag so that subsequent read
13736 operations properly handle the logical position which is unchanged by
13737 the @code{End_Of_Page} call.
13738
13739 @item
13740 After a call to @code{End_Of_File} that returns @code{True}, if the
13741 Text_IO file was positioned before the line mark at the end of file
13742 before the call, then the logical position is unchanged, but the stream
13743 is physically positioned right at the end of file (past the line mark,
13744 and past a possible page mark following the line mark.  Again Text_IO
13745 maintains internal flags so that subsequent read operations properly
13746 handle the logical position.
13747 @end itemize
13748
13749 @noindent
13750 These discrepancies have no effect on the observable behavior of
13751 Text_IO, but if a single Ada stream is shared between a C program and
13752 Ada program, or shared (using @samp{shared=yes} in the form string)
13753 between two Ada files, then the difference may be observable in some
13754 situations.
13755
13756 @node Text_IO Reading and Writing Non-Regular Files
13757 @subsection Reading and Writing Non-Regular Files
13758
13759 @noindent
13760 A non-regular file is a device (such as a keyboard), or a pipe.  Text_IO
13761 can be used for reading and writing.  Writing is not affected and the
13762 sequence of characters output is identical to the normal file case, but
13763 for reading, the behavior of Text_IO is modified to avoid undesirable
13764 look-ahead as follows:
13765
13766 An input file that is not a regular file is considered to have no page
13767 marks.  Any @code{Ascii.FF} characters (the character normally used for a
13768 page mark) appearing in the file are considered to be data
13769 characters.  In particular:
13770
13771 @itemize @bullet
13772 @item
13773 @code{Get_Line} and @code{Skip_Line} do not test for a page mark
13774 following a line mark.  If a page mark appears, it will be treated as a
13775 data character.
13776
13777 @item
13778 This avoids the need to wait for an extra character to be typed or
13779 entered from the pipe to complete one of these operations.
13780
13781 @item
13782 @code{End_Of_Page} always returns @code{False}
13783
13784 @item
13785 @code{End_Of_File} will return @code{False} if there is a page mark at
13786 the end of the file.
13787 @end itemize
13788
13789 @noindent
13790 Output to non-regular files is the same as for regular files.  Page marks
13791 may be written to non-regular files using @code{New_Page}, but as noted
13792 above they will not be treated as page marks on input if the output is
13793 piped to another Ada program.
13794
13795 Another important discrepancy when reading non-regular files is that the end
13796 of file indication is not ``sticky''.  If an end of file is entered, e.g.@: by
13797 pressing the @key{EOT} key,
13798 then end of file
13799 is signaled once (i.e.@: the test @code{End_Of_File}
13800 will yield @code{True}, or a read will
13801 raise @code{End_Error}), but then reading can resume
13802 to read data past that end of
13803 file indication, until another end of file indication is entered.
13804
13805 @node Get_Immediate
13806 @subsection Get_Immediate
13807 @cindex Get_Immediate
13808
13809 @noindent
13810 Get_Immediate returns the next character (including control characters)
13811 from the input file.  In particular, Get_Immediate will return LF or FF
13812 characters used as line marks or page marks.  Such operations leave the
13813 file positioned past the control character, and it is thus not treated
13814 as having its normal function.  This means that page, line and column
13815 counts after this kind of Get_Immediate call are set as though the mark
13816 did not occur.  In the case where a Get_Immediate leaves the file
13817 positioned between the line mark and page mark (which is not normally
13818 possible), it is undefined whether the FF character will be treated as a
13819 page mark.
13820
13821 @node Treating Text_IO Files as Streams
13822 @subsection Treating Text_IO Files as Streams
13823 @cindex Stream files
13824
13825 @noindent
13826 The package @code{Text_IO.Streams} allows a Text_IO file to be treated
13827 as a stream.  Data written to a Text_IO file in this stream mode is
13828 binary data.  If this binary data contains bytes 16#0A# (@code{LF}) or
13829 16#0C# (@code{FF}), the resulting file may have non-standard
13830 format.  Similarly if read operations are used to read from a Text_IO
13831 file treated as a stream, then @code{LF} and @code{FF} characters may be
13832 skipped and the effect is similar to that described above for
13833 @code{Get_Immediate}.
13834
13835 @node Text_IO Extensions
13836 @subsection Text_IO Extensions
13837 @cindex Text_IO extensions
13838
13839 @noindent
13840 A package GNAT.IO_Aux in the GNAT library provides some useful extensions
13841 to the standard @code{Text_IO} package:
13842
13843 @itemize @bullet
13844 @item function File_Exists (Name : String) return Boolean;
13845 Determines if a file of the given name exists.
13846
13847 @item function Get_Line return String;
13848 Reads a string from the standard input file.  The value returned is exactly
13849 the length of the line that was read.
13850
13851 @item function Get_Line (File : Ada.Text_IO.File_Type) return String;
13852 Similar, except that the parameter File specifies the file from which
13853 the string is to be read.
13854
13855 @end itemize
13856
13857 @node Text_IO Facilities for Unbounded Strings
13858 @subsection Text_IO Facilities for Unbounded Strings
13859 @cindex Text_IO for unbounded strings
13860 @cindex Unbounded_String, Text_IO operations
13861
13862 @noindent
13863 The package @code{Ada.Strings.Unbounded.Text_IO}
13864 in library files @code{a-suteio.ads/adb} contains some GNAT-specific
13865 subprograms useful for Text_IO operations on unbounded strings:
13866
13867 @itemize @bullet
13868
13869 @item function Get_Line (File : File_Type) return Unbounded_String;
13870 Reads a line from the specified file
13871 and returns the result as an unbounded string.
13872
13873 @item procedure Put (File : File_Type; U : Unbounded_String);
13874 Writes the value of the given unbounded string to the specified file
13875 Similar to the effect of
13876 @code{Put (To_String (U))} except that an extra copy is avoided.
13877
13878 @item procedure Put_Line (File : File_Type; U : Unbounded_String);
13879 Writes the value of the given unbounded string to the specified file,
13880 followed by a @code{New_Line}.
13881 Similar to the effect of @code{Put_Line (To_String (U))} except
13882 that an extra copy is avoided.
13883 @end itemize
13884
13885 @noindent
13886 In the above procedures, @code{File} is of type @code{Ada.Text_IO.File_Type}
13887 and is optional.  If the parameter is omitted, then the standard input or
13888 output file is referenced as appropriate.
13889
13890 The package @code{Ada.Strings.Wide_Unbounded.Wide_Text_IO} in library
13891 files @file{a-swuwti.ads} and @file{a-swuwti.adb} provides similar extended
13892 @code{Wide_Text_IO} functionality for unbounded wide strings.
13893
13894 The package @code{Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO} in library
13895 files @file{a-szuzti.ads} and @file{a-szuzti.adb} provides similar extended
13896 @code{Wide_Wide_Text_IO} functionality for unbounded wide wide strings.
13897
13898 @node Wide_Text_IO
13899 @section Wide_Text_IO
13900
13901 @noindent
13902 @code{Wide_Text_IO} is similar in most respects to Text_IO, except that
13903 both input and output files may contain special sequences that represent
13904 wide character values.  The encoding scheme for a given file may be
13905 specified using a FORM parameter:
13906
13907 @smallexample
13908 WCEM=@var{x}
13909 @end smallexample
13910
13911 @noindent
13912 as part of the FORM string (WCEM = wide character encoding method),
13913 where @var{x} is one of the following characters
13914
13915 @table @samp
13916 @item h
13917 Hex ESC encoding
13918 @item u
13919 Upper half encoding
13920 @item s
13921 Shift-JIS encoding
13922 @item e
13923 EUC Encoding
13924 @item 8
13925 UTF-8 encoding
13926 @item b
13927 Brackets encoding
13928 @end table
13929
13930 @noindent
13931 The encoding methods match those that
13932 can be used in a source
13933 program, but there is no requirement that the encoding method used for
13934 the source program be the same as the encoding method used for files,
13935 and different files may use different encoding methods.
13936
13937 The default encoding method for the standard files, and for opened files
13938 for which no WCEM parameter is given in the FORM string matches the
13939 wide character encoding specified for the main program (the default
13940 being brackets encoding if no coding method was specified with -gnatW).
13941
13942 @table @asis
13943 @item Hex Coding
13944 In this encoding, a wide character is represented by a five character
13945 sequence:
13946
13947 @smallexample
13948 ESC a b c d
13949 @end smallexample
13950
13951 @noindent
13952 where @var{a}, @var{b}, @var{c}, @var{d} are the four hexadecimal
13953 characters (using upper case letters) of the wide character code.  For
13954 example, ESC A345 is used to represent the wide character with code
13955 16#A345#.  This scheme is compatible with use of the full
13956 @code{Wide_Character} set.
13957
13958 @item Upper Half Coding
13959 The wide character with encoding 16#abcd#, where the upper bit is on
13960 (i.e.@: a is in the range 8-F) is represented as two bytes 16#ab# and
13961 16#cd#.  The second byte may never be a format control character, but is
13962 not required to be in the upper half.  This method can be also used for
13963 shift-JIS or EUC where the internal coding matches the external coding.
13964
13965 @item Shift JIS Coding
13966 A wide character is represented by a two character sequence 16#ab# and
13967 16#cd#, with the restrictions described for upper half encoding as
13968 described above.  The internal character code is the corresponding JIS
13969 character according to the standard algorithm for Shift-JIS
13970 conversion.  Only characters defined in the JIS code set table can be
13971 used with this encoding method.
13972
13973 @item EUC Coding
13974 A wide character is represented by a two character sequence 16#ab# and
13975 16#cd#, with both characters being in the upper half.  The internal
13976 character code is the corresponding JIS character according to the EUC
13977 encoding algorithm.  Only characters defined in the JIS code set table
13978 can be used with this encoding method.
13979
13980 @item UTF-8 Coding
13981 A wide character is represented using
13982 UCS Transformation Format 8 (UTF-8) as defined in Annex R of ISO
13983 10646-1/Am.2.  Depending on the character value, the representation
13984 is a one, two, or three byte sequence:
13985
13986 @smallexample
13987 16#0000#-16#007f#: 2#0xxxxxxx#
13988 16#0080#-16#07ff#: 2#110xxxxx# 2#10xxxxxx#
13989 16#0800#-16#ffff#: 2#1110xxxx# 2#10xxxxxx# 2#10xxxxxx#
13990 @end smallexample
13991
13992 @noindent
13993 where the @var{xxx} bits correspond to the left-padded bits of the
13994 16-bit character value.  Note that all lower half ASCII characters
13995 are represented as ASCII bytes and all upper half characters and
13996 other wide characters are represented as sequences of upper-half
13997 (The full UTF-8 scheme allows for encoding 31-bit characters as
13998 6-byte sequences, but in this implementation, all UTF-8 sequences
13999 of four or more bytes length will raise a Constraint_Error, as
14000 will all invalid UTF-8 sequences.)
14001
14002 @item Brackets Coding
14003 In this encoding, a wide character is represented by the following eight
14004 character sequence:
14005
14006 @smallexample
14007 [ " a b c d " ]
14008 @end smallexample
14009
14010 @noindent
14011 where @code{a}, @code{b}, @code{c}, @code{d} are the four hexadecimal
14012 characters (using uppercase letters) of the wide character code.  For
14013 example, @code{["A345"]} is used to represent the wide character with code
14014 @code{16#A345#}.
14015 This scheme is compatible with use of the full Wide_Character set.
14016 On input, brackets coding can also be used for upper half characters,
14017 e.g.@: @code{["C1"]} for lower case a.  However, on output, brackets notation
14018 is only used for wide characters with a code greater than @code{16#FF#}.
14019
14020 Note that brackets coding is not normally used in the context of
14021 Wide_Text_IO or Wide_Wide_Text_IO, since it is really just designed as
14022 a portable way of encoding source files. In the context of Wide_Text_IO
14023 or Wide_Wide_Text_IO, it can only be used if the file does not contain
14024 any instance of the left bracket character other than to encode wide
14025 character values using the brackets encoding method. In practice it is
14026 expected that some standard wide character encoding method such
14027 as UTF-8 will be used for text input output.
14028
14029 If brackets notation is used, then any occurrence of a left bracket
14030 in the input file which is not the start of a valid wide character
14031 sequence will cause Constraint_Error to be raised. It is possible to
14032 encode a left bracket as ["5B"] and Wide_Text_IO and Wide_Wide_Text_IO
14033 input will interpret this as a left bracket.
14034
14035 However, when a left bracket is output, it will be output as a left bracket
14036 and not as ["5B"]. We make this decision because for normal use of
14037 Wide_Text_IO for outputting messages, it is unpleasant to clobber left
14038 brackets. For example, if we write:
14039
14040 @smallexample
14041    Put_Line ("Start of output [first run]");
14042 @end smallexample
14043
14044 @noindent
14045 we really do not want to have the left bracket in this message clobbered so
14046 that the output reads:
14047
14048 @smallexample
14049    Start of output ["5B"]first run]
14050 @end smallexample
14051
14052 @noindent
14053 In practice brackets encoding is reasonably useful for normal Put_Line use
14054 since we won't get confused between left brackets and wide character
14055 sequences in the output. But for input, or when files are written out
14056 and read back in, it really makes better sense to use one of the standard
14057 encoding methods such as UTF-8.
14058
14059 @end table
14060
14061 @noindent
14062 For the coding schemes other than UTF-8, Hex, or Brackets encoding,
14063 not all wide character
14064 values can be represented.  An attempt to output a character that cannot
14065 be represented using the encoding scheme for the file causes
14066 Constraint_Error to be raised.  An invalid wide character sequence on
14067 input also causes Constraint_Error to be raised.
14068
14069 @menu
14070 * Wide_Text_IO Stream Pointer Positioning::
14071 * Wide_Text_IO Reading and Writing Non-Regular Files::
14072 @end menu
14073
14074 @node Wide_Text_IO Stream Pointer Positioning
14075 @subsection Stream Pointer Positioning
14076
14077 @noindent
14078 @code{Ada.Wide_Text_IO} is similar to @code{Ada.Text_IO} in its handling
14079 of stream pointer positioning (@pxref{Text_IO}).  There is one additional
14080 case:
14081
14082 If @code{Ada.Wide_Text_IO.Look_Ahead} reads a character outside the
14083 normal lower ASCII set (i.e.@: a character in the range:
14084
14085 @smallexample @c ada
14086 Wide_Character'Val (16#0080#) .. Wide_Character'Val (16#FFFF#)
14087 @end smallexample
14088
14089 @noindent
14090 then although the logical position of the file pointer is unchanged by
14091 the @code{Look_Ahead} call, the stream is physically positioned past the
14092 wide character sequence.  Again this is to avoid the need for buffering
14093 or backup, and all @code{Wide_Text_IO} routines check the internal
14094 indication that this situation has occurred so that this is not visible
14095 to a normal program using @code{Wide_Text_IO}.  However, this discrepancy
14096 can be observed if the wide text file shares a stream with another file.
14097
14098 @node Wide_Text_IO Reading and Writing Non-Regular Files
14099 @subsection Reading and Writing Non-Regular Files
14100
14101 @noindent
14102 As in the case of Text_IO, when a non-regular file is read, it is
14103 assumed that the file contains no page marks (any form characters are
14104 treated as data characters), and @code{End_Of_Page} always returns
14105 @code{False}.  Similarly, the end of file indication is not sticky, so
14106 it is possible to read beyond an end of file.
14107
14108 @node Wide_Wide_Text_IO
14109 @section Wide_Wide_Text_IO
14110
14111 @noindent
14112 @code{Wide_Wide_Text_IO} is similar in most respects to Text_IO, except that
14113 both input and output files may contain special sequences that represent
14114 wide wide character values.  The encoding scheme for a given file may be
14115 specified using a FORM parameter:
14116
14117 @smallexample
14118 WCEM=@var{x}
14119 @end smallexample
14120
14121 @noindent
14122 as part of the FORM string (WCEM = wide character encoding method),
14123 where @var{x} is one of the following characters
14124
14125 @table @samp
14126 @item h
14127 Hex ESC encoding
14128 @item u
14129 Upper half encoding
14130 @item s
14131 Shift-JIS encoding
14132 @item e
14133 EUC Encoding
14134 @item 8
14135 UTF-8 encoding
14136 @item b
14137 Brackets encoding
14138 @end table
14139
14140 @noindent
14141 The encoding methods match those that
14142 can be used in a source
14143 program, but there is no requirement that the encoding method used for
14144 the source program be the same as the encoding method used for files,
14145 and different files may use different encoding methods.
14146
14147 The default encoding method for the standard files, and for opened files
14148 for which no WCEM parameter is given in the FORM string matches the
14149 wide character encoding specified for the main program (the default
14150 being brackets encoding if no coding method was specified with -gnatW).
14151
14152 @table @asis
14153
14154 @item UTF-8 Coding
14155 A wide character is represented using
14156 UCS Transformation Format 8 (UTF-8) as defined in Annex R of ISO
14157 10646-1/Am.2.  Depending on the character value, the representation
14158 is a one, two, three, or four byte sequence:
14159
14160 @smallexample
14161 16#000000#-16#00007f#: 2#0xxxxxxx#
14162 16#000080#-16#0007ff#: 2#110xxxxx# 2#10xxxxxx#
14163 16#000800#-16#00ffff#: 2#1110xxxx# 2#10xxxxxx# 2#10xxxxxx#
14164 16#010000#-16#10ffff#: 2#11110xxx# 2#10xxxxxx# 2#10xxxxxx# 2#10xxxxxx#
14165 @end smallexample
14166
14167 @noindent
14168 where the @var{xxx} bits correspond to the left-padded bits of the
14169 21-bit character value.  Note that all lower half ASCII characters
14170 are represented as ASCII bytes and all upper half characters and
14171 other wide characters are represented as sequences of upper-half
14172 characters.
14173
14174 @item Brackets Coding
14175 In this encoding, a wide wide character is represented by the following eight
14176 character sequence if is in wide character range
14177
14178 @smallexample
14179 [ " a b c d " ]
14180 @end smallexample
14181
14182 and by the following ten character sequence if not
14183
14184 @smallexample
14185 [ " a b c d e f " ]
14186 @end smallexample
14187
14188 @noindent
14189 where @code{a}, @code{b}, @code{c}, @code{d}, @code{e}, and @code{f}
14190 are the four or six hexadecimal
14191 characters (using uppercase letters) of the wide wide character code.  For
14192 example, @code{["01A345"]} is used to represent the wide wide character
14193 with code @code{16#01A345#}.
14194
14195 This scheme is compatible with use of the full Wide_Wide_Character set.
14196 On input, brackets coding can also be used for upper half characters,
14197 e.g.@: @code{["C1"]} for lower case a.  However, on output, brackets notation
14198 is only used for wide characters with a code greater than @code{16#FF#}.
14199
14200 @end table
14201
14202 @noindent
14203 If is also possible to use the other Wide_Character encoding methods,
14204 such as Shift-JIS, but the other schemes cannot support the full range
14205 of wide wide characters.
14206 An attempt to output a character that cannot
14207 be represented using the encoding scheme for the file causes
14208 Constraint_Error to be raised.  An invalid wide character sequence on
14209 input also causes Constraint_Error to be raised.
14210
14211 @menu
14212 * Wide_Wide_Text_IO Stream Pointer Positioning::
14213 * Wide_Wide_Text_IO Reading and Writing Non-Regular Files::
14214 @end menu
14215
14216 @node Wide_Wide_Text_IO Stream Pointer Positioning
14217 @subsection Stream Pointer Positioning
14218
14219 @noindent
14220 @code{Ada.Wide_Wide_Text_IO} is similar to @code{Ada.Text_IO} in its handling
14221 of stream pointer positioning (@pxref{Text_IO}).  There is one additional
14222 case:
14223
14224 If @code{Ada.Wide_Wide_Text_IO.Look_Ahead} reads a character outside the
14225 normal lower ASCII set (i.e.@: a character in the range:
14226
14227 @smallexample @c ada
14228 Wide_Wide_Character'Val (16#0080#) .. Wide_Wide_Character'Val (16#10FFFF#)
14229 @end smallexample
14230
14231 @noindent
14232 then although the logical position of the file pointer is unchanged by
14233 the @code{Look_Ahead} call, the stream is physically positioned past the
14234 wide character sequence.  Again this is to avoid the need for buffering
14235 or backup, and all @code{Wide_Wide_Text_IO} routines check the internal
14236 indication that this situation has occurred so that this is not visible
14237 to a normal program using @code{Wide_Wide_Text_IO}.  However, this discrepancy
14238 can be observed if the wide text file shares a stream with another file.
14239
14240 @node Wide_Wide_Text_IO Reading and Writing Non-Regular Files
14241 @subsection Reading and Writing Non-Regular Files
14242
14243 @noindent
14244 As in the case of Text_IO, when a non-regular file is read, it is
14245 assumed that the file contains no page marks (any form characters are
14246 treated as data characters), and @code{End_Of_Page} always returns
14247 @code{False}.  Similarly, the end of file indication is not sticky, so
14248 it is possible to read beyond an end of file.
14249
14250 @node Stream_IO
14251 @section Stream_IO
14252
14253 @noindent
14254 A stream file is a sequence of bytes, where individual elements are
14255 written to the file as described in the Ada Reference Manual.  The type
14256 @code{Stream_Element} is simply a byte.  There are two ways to read or
14257 write a stream file.
14258
14259 @itemize @bullet
14260 @item
14261 The operations @code{Read} and @code{Write} directly read or write a
14262 sequence of stream elements with no control information.
14263
14264 @item
14265 The stream attributes applied to a stream file transfer data in the
14266 manner described for stream attributes.
14267 @end itemize
14268
14269 @node Text Translation
14270 @section Text Translation
14271
14272 @noindent
14273 @samp{Text_Translation=@var{xxx}} may be used as the Form parameter
14274 passed to Text_IO.Create and Text_IO.Open:
14275 @samp{Text_Translation=@var{Yes}} is the default, which means to
14276 translate LF to/from CR/LF on Windows systems.
14277 @samp{Text_Translation=@var{No}} disables this translation; i.e. it
14278 uses binary mode. For output files, @samp{Text_Translation=@var{No}}
14279 may be used to create Unix-style files on
14280 Windows. @samp{Text_Translation=@var{xxx}} has no effect on Unix
14281 systems.
14282
14283 @node Shared Files
14284 @section Shared Files
14285
14286 @noindent
14287 Section A.14 of the Ada Reference Manual allows implementations to
14288 provide a wide variety of behavior if an attempt is made to access the
14289 same external file with two or more internal files.
14290
14291 To provide a full range of functionality, while at the same time
14292 minimizing the problems of portability caused by this implementation
14293 dependence, GNAT handles file sharing as follows:
14294
14295 @itemize @bullet
14296 @item
14297 In the absence of a @samp{shared=@var{xxx}} form parameter, an attempt
14298 to open two or more files with the same full name is considered an error
14299 and is not supported.  The exception @code{Use_Error} will be
14300 raised.  Note that a file that is not explicitly closed by the program
14301 remains open until the program terminates.
14302
14303 @item
14304 If the form parameter @samp{shared=no} appears in the form string, the
14305 file can be opened or created with its own separate stream identifier,
14306 regardless of whether other files sharing the same external file are
14307 opened.  The exact effect depends on how the C stream routines handle
14308 multiple accesses to the same external files using separate streams.
14309
14310 @item
14311 If the form parameter @samp{shared=yes} appears in the form string for
14312 each of two or more files opened using the same full name, the same
14313 stream is shared between these files, and the semantics are as described
14314 in Ada Reference Manual, Section A.14.
14315 @end itemize
14316
14317 @noindent
14318 When a program that opens multiple files with the same name is ported
14319 from another Ada compiler to GNAT, the effect will be that
14320 @code{Use_Error} is raised.
14321
14322 The documentation of the original compiler and the documentation of the
14323 program should then be examined to determine if file sharing was
14324 expected, and @samp{shared=@var{xxx}} parameters added to @code{Open}
14325 and @code{Create} calls as required.
14326
14327 When a program is ported from GNAT to some other Ada compiler, no
14328 special attention is required unless the @samp{shared=@var{xxx}} form
14329 parameter is used in the program.  In this case, you must examine the
14330 documentation of the new compiler to see if it supports the required
14331 file sharing semantics, and form strings modified appropriately.  Of
14332 course it may be the case that the program cannot be ported if the
14333 target compiler does not support the required functionality.  The best
14334 approach in writing portable code is to avoid file sharing (and hence
14335 the use of the @samp{shared=@var{xxx}} parameter in the form string)
14336 completely.
14337
14338 One common use of file sharing in Ada 83 is the use of instantiations of
14339 Sequential_IO on the same file with different types, to achieve
14340 heterogeneous input-output.  Although this approach will work in GNAT if
14341 @samp{shared=yes} is specified, it is preferable in Ada to use Stream_IO
14342 for this purpose (using the stream attributes)
14343
14344 @node Filenames encoding
14345 @section Filenames encoding
14346
14347 @noindent
14348 An encoding form parameter can be used to specify the filename
14349 encoding @samp{encoding=@var{xxx}}.
14350
14351 @itemize @bullet
14352 @item
14353 If the form parameter @samp{encoding=utf8} appears in the form string, the
14354 filename must be encoded in UTF-8.
14355
14356 @item
14357 If the form parameter @samp{encoding=8bits} appears in the form
14358 string, the filename must be a standard 8bits string.
14359 @end itemize
14360
14361 In the absence of a @samp{encoding=@var{xxx}} form parameter, the
14362 encoding is controlled by the @samp{GNAT_CODE_PAGE} environment
14363 variable. And if not set @samp{utf8} is assumed.
14364
14365 @table @samp
14366 @item CP_ACP
14367 The current system Windows ANSI code page.
14368 @item CP_UTF8
14369 UTF-8 encoding
14370 @end table
14371
14372 This encoding form parameter is only supported on the Windows
14373 platform. On the other Operating Systems the run-time is supporting
14374 UTF-8 natively.
14375
14376 @node Open Modes
14377 @section Open Modes
14378
14379 @noindent
14380 @code{Open} and @code{Create} calls result in a call to @code{fopen}
14381 using the mode shown in the following table:
14382
14383 @sp 2
14384 @center @code{Open} and @code{Create} Call Modes
14385 @smallexample
14386                                @b{OPEN }           @b{CREATE}
14387 Append_File                    "r+"             "w+"
14388 In_File                        "r"              "w+"
14389 Out_File (Direct_IO)           "r+"             "w"
14390 Out_File (all other cases)     "w"              "w"
14391 Inout_File                     "r+"             "w+"
14392 @end smallexample
14393
14394 @noindent
14395 If text file translation is required, then either @samp{b} or @samp{t}
14396 is added to the mode, depending on the setting of Text.  Text file
14397 translation refers to the mapping of CR/LF sequences in an external file
14398 to LF characters internally.  This mapping only occurs in DOS and
14399 DOS-like systems, and is not relevant to other systems.
14400
14401 A special case occurs with Stream_IO@.  As shown in the above table, the
14402 file is initially opened in @samp{r} or @samp{w} mode for the
14403 @code{In_File} and @code{Out_File} cases.  If a @code{Set_Mode} operation
14404 subsequently requires switching from reading to writing or vice-versa,
14405 then the file is reopened in @samp{r+} mode to permit the required operation.
14406
14407 @node Operations on C Streams
14408 @section Operations on C Streams
14409 The package @code{Interfaces.C_Streams} provides an Ada program with direct
14410 access to the C library functions for operations on C streams:
14411
14412 @smallexample @c adanocomment
14413 package Interfaces.C_Streams is
14414   -- Note: the reason we do not use the types that are in
14415   -- Interfaces.C is that we want to avoid dragging in the
14416   -- code in this unit if possible.
14417   subtype chars is System.Address;
14418   -- Pointer to null-terminated array of characters
14419   subtype FILEs is System.Address;
14420   -- Corresponds to the C type FILE*
14421   subtype voids is System.Address;
14422   -- Corresponds to the C type void*
14423   subtype int is Integer;
14424   subtype long is Long_Integer;
14425   -- Note: the above types are subtypes deliberately, and it
14426   -- is part of this spec that the above correspondences are
14427   -- guaranteed.  This means that it is legitimate to, for
14428   -- example, use Integer instead of int.  We provide these
14429   -- synonyms for clarity, but in some cases it may be
14430   -- convenient to use the underlying types (for example to
14431   -- avoid an unnecessary dependency of a spec on the spec
14432   -- of this unit).
14433   type size_t is mod 2 ** Standard'Address_Size;
14434   NULL_Stream : constant FILEs;
14435   -- Value returned (NULL in C) to indicate an
14436   -- fdopen/fopen/tmpfile error
14437   ----------------------------------
14438   -- Constants Defined in stdio.h --
14439   ----------------------------------
14440   EOF : constant int;
14441   -- Used by a number of routines to indicate error or
14442   -- end of file
14443   IOFBF : constant int;
14444   IOLBF : constant int;
14445   IONBF : constant int;
14446   -- Used to indicate buffering mode for setvbuf call
14447   SEEK_CUR : constant int;
14448   SEEK_END : constant int;
14449   SEEK_SET : constant int;
14450   -- Used to indicate origin for fseek call
14451   function stdin return FILEs;
14452   function stdout return FILEs;
14453   function stderr return FILEs;
14454   -- Streams associated with standard files
14455   --------------------------
14456   -- Standard C functions --
14457   --------------------------
14458   -- The functions selected below are ones that are
14459   -- available in UNIX (but not necessarily in ANSI C).
14460   -- These are very thin interfaces
14461   -- which copy exactly the C headers.  For more
14462   -- documentation on these functions, see the Microsoft C
14463   -- "Run-Time Library Reference" (Microsoft Press, 1990,
14464   -- ISBN 1-55615-225-6), which includes useful information
14465   -- on system compatibility.
14466   procedure clearerr (stream : FILEs);
14467   function fclose (stream : FILEs) return int;
14468   function fdopen (handle : int; mode : chars) return FILEs;
14469   function feof (stream : FILEs) return int;
14470   function ferror (stream : FILEs) return int;
14471   function fflush (stream : FILEs) return int;
14472   function fgetc (stream : FILEs) return int;
14473   function fgets (strng : chars; n : int; stream : FILEs)
14474       return chars;
14475   function fileno (stream : FILEs) return int;
14476   function fopen (filename : chars; Mode : chars)
14477       return FILEs;
14478   -- Note: to maintain target independence, use
14479   -- text_translation_required, a boolean variable defined in
14480   -- a-sysdep.c to deal with the target dependent text
14481   -- translation requirement.  If this variable is set,
14482   -- then  b/t should be appended to the standard mode
14483   -- argument to set the text translation mode off or on
14484   -- as required.
14485   function fputc (C : int; stream : FILEs) return int;
14486   function fputs (Strng : chars; Stream : FILEs) return int;
14487   function fread
14488      (buffer : voids;
14489       size : size_t;
14490       count : size_t;
14491       stream : FILEs)
14492       return size_t;
14493   function freopen
14494      (filename : chars;
14495       mode : chars;
14496       stream : FILEs)
14497       return FILEs;
14498   function fseek
14499      (stream : FILEs;
14500       offset : long;
14501       origin : int)
14502       return int;
14503   function ftell (stream : FILEs) return long;
14504   function fwrite
14505      (buffer : voids;
14506       size : size_t;
14507       count : size_t;
14508       stream : FILEs)
14509       return size_t;
14510   function isatty (handle : int) return int;
14511   procedure mktemp (template : chars);
14512   -- The return value (which is just a pointer to template)
14513   -- is discarded
14514   procedure rewind (stream : FILEs);
14515   function rmtmp return int;
14516   function setvbuf
14517      (stream : FILEs;
14518       buffer : chars;
14519       mode : int;
14520       size : size_t)
14521       return int;
14522
14523   function tmpfile return FILEs;
14524   function ungetc (c : int; stream : FILEs) return int;
14525   function unlink (filename : chars) return int;
14526   ---------------------
14527   -- Extra functions --
14528   ---------------------
14529   -- These functions supply slightly thicker bindings than
14530   -- those above.  They are derived from functions in the
14531   -- C Run-Time Library, but may do a bit more work than
14532   -- just directly calling one of the Library functions.
14533   function is_regular_file (handle : int) return int;
14534   -- Tests if given handle is for a regular file (result 1)
14535   -- or for a non-regular file (pipe or device, result 0).
14536   ---------------------------------
14537   -- Control of Text/Binary Mode --
14538   ---------------------------------
14539   -- If text_translation_required is true, then the following
14540   -- functions may be used to dynamically switch a file from
14541   -- binary to text mode or vice versa.  These functions have
14542   -- no effect if text_translation_required is false (i.e.@: in
14543   -- normal UNIX mode).  Use fileno to get a stream handle.
14544   procedure set_binary_mode (handle : int);
14545   procedure set_text_mode (handle : int);
14546   ----------------------------
14547   -- Full Path Name support --
14548   ----------------------------
14549   procedure full_name (nam : chars; buffer : chars);
14550   -- Given a NUL terminated string representing a file
14551   -- name, returns in buffer a NUL terminated string
14552   -- representing the full path name for the file name.
14553   -- On systems where it is relevant the   drive is also
14554   -- part of the full path name.  It is the responsibility
14555   -- of the caller to pass an actual parameter for buffer
14556   -- that is big enough for any full path name.  Use
14557   -- max_path_len given below as the size of buffer.
14558   max_path_len : integer;
14559   -- Maximum length of an allowable full path name on the
14560   -- system, including a terminating NUL character.
14561 end Interfaces.C_Streams;
14562 @end smallexample
14563
14564 @node Interfacing to C Streams
14565 @section Interfacing to C Streams
14566
14567 @noindent
14568 The packages in this section permit interfacing Ada files to C Stream
14569 operations.
14570
14571 @smallexample @c ada
14572  with Interfaces.C_Streams;
14573  package Ada.Sequential_IO.C_Streams is
14574     function C_Stream (F : File_Type)
14575        return Interfaces.C_Streams.FILEs;
14576     procedure Open
14577       (File : in out File_Type;
14578        Mode : in File_Mode;
14579        C_Stream : in Interfaces.C_Streams.FILEs;
14580        Form : in String := "");
14581  end Ada.Sequential_IO.C_Streams;
14582
14583   with Interfaces.C_Streams;
14584   package Ada.Direct_IO.C_Streams is
14585      function C_Stream (F : File_Type)
14586         return Interfaces.C_Streams.FILEs;
14587      procedure Open
14588        (File : in out File_Type;
14589         Mode : in File_Mode;
14590         C_Stream : in Interfaces.C_Streams.FILEs;
14591         Form : in String := "");
14592   end Ada.Direct_IO.C_Streams;
14593
14594   with Interfaces.C_Streams;
14595   package Ada.Text_IO.C_Streams is
14596      function C_Stream (F : File_Type)
14597         return Interfaces.C_Streams.FILEs;
14598      procedure Open
14599        (File : in out File_Type;
14600         Mode : in File_Mode;
14601         C_Stream : in Interfaces.C_Streams.FILEs;
14602         Form : in String := "");
14603   end Ada.Text_IO.C_Streams;
14604
14605   with Interfaces.C_Streams;
14606   package Ada.Wide_Text_IO.C_Streams is
14607      function C_Stream (F : File_Type)
14608         return Interfaces.C_Streams.FILEs;
14609      procedure Open
14610        (File : in out File_Type;
14611         Mode : in File_Mode;
14612         C_Stream : in Interfaces.C_Streams.FILEs;
14613         Form : in String := "");
14614  end Ada.Wide_Text_IO.C_Streams;
14615
14616   with Interfaces.C_Streams;
14617   package Ada.Wide_Wide_Text_IO.C_Streams is
14618      function C_Stream (F : File_Type)
14619         return Interfaces.C_Streams.FILEs;
14620      procedure Open
14621        (File : in out File_Type;
14622         Mode : in File_Mode;
14623         C_Stream : in Interfaces.C_Streams.FILEs;
14624         Form : in String := "");
14625  end Ada.Wide_Wide_Text_IO.C_Streams;
14626
14627  with Interfaces.C_Streams;
14628  package Ada.Stream_IO.C_Streams is
14629     function C_Stream (F : File_Type)
14630        return Interfaces.C_Streams.FILEs;
14631     procedure Open
14632       (File : in out File_Type;
14633        Mode : in File_Mode;
14634        C_Stream : in Interfaces.C_Streams.FILEs;
14635        Form : in String := "");
14636  end Ada.Stream_IO.C_Streams;
14637 @end smallexample
14638
14639 @noindent
14640 In each of these six packages, the @code{C_Stream} function obtains the
14641 @code{FILE} pointer from a currently opened Ada file.  It is then
14642 possible to use the @code{Interfaces.C_Streams} package to operate on
14643 this stream, or the stream can be passed to a C program which can
14644 operate on it directly.  Of course the program is responsible for
14645 ensuring that only appropriate sequences of operations are executed.
14646
14647 One particular use of relevance to an Ada program is that the
14648 @code{setvbuf} function can be used to control the buffering of the
14649 stream used by an Ada file.  In the absence of such a call the standard
14650 default buffering is used.
14651
14652 The @code{Open} procedures in these packages open a file giving an
14653 existing C Stream instead of a file name.  Typically this stream is
14654 imported from a C program, allowing an Ada file to operate on an
14655 existing C file.
14656
14657 @node The GNAT Library
14658 @chapter The GNAT Library
14659
14660 @noindent
14661 The GNAT library contains a number of general and special purpose packages.
14662 It represents functionality that the GNAT developers have found useful, and
14663 which is made available to GNAT users.  The packages described here are fully
14664 supported, and upwards compatibility will be maintained in future releases,
14665 so you can use these facilities with the confidence that the same functionality
14666 will be available in future releases.
14667
14668 The chapter here simply gives a brief summary of the facilities available.
14669 The full documentation is found in the spec file for the package.  The full
14670 sources of these library packages, including both spec and body, are provided
14671 with all GNAT releases.  For example, to find out the full specifications of
14672 the SPITBOL pattern matching capability, including a full tutorial and
14673 extensive examples, look in the @file{g-spipat.ads} file in the library.
14674
14675 For each entry here, the package name (as it would appear in a @code{with}
14676 clause) is given, followed by the name of the corresponding spec file in
14677 parentheses.  The packages are children in four hierarchies, @code{Ada},
14678 @code{Interfaces}, @code{System}, and @code{GNAT}, the latter being a
14679 GNAT-specific hierarchy.
14680
14681 Note that an application program should only use packages in one of these
14682 four hierarchies if the package is defined in the Ada Reference Manual,
14683 or is listed in this section of the GNAT Programmers Reference Manual.
14684 All other units should be considered internal implementation units and
14685 should not be directly @code{with}'ed by application code.  The use of
14686 a @code{with} statement that references one of these internal implementation
14687 units makes an application potentially dependent on changes in versions
14688 of GNAT, and will generate a warning message.
14689
14690 @menu
14691 * Ada.Characters.Latin_9 (a-chlat9.ads)::
14692 * Ada.Characters.Wide_Latin_1 (a-cwila1.ads)::
14693 * Ada.Characters.Wide_Latin_9 (a-cwila9.ads)::
14694 * Ada.Characters.Wide_Wide_Latin_1 (a-chzla1.ads)::
14695 * Ada.Characters.Wide_Wide_Latin_9 (a-chzla9.ads)::
14696 * Ada.Containers.Formal_Doubly_Linked_Lists (a-cfdlli.ads)::
14697 * Ada.Containers.Formal_Hashed_Maps (a-cfhama.ads)::
14698 * Ada.Containers.Formal_Hashed_Sets (a-cfhase.ads)::
14699 * Ada.Containers.Formal_Ordered_Maps (a-cforma.ads)::
14700 * Ada.Containers.Formal_Ordered_Sets (a-cforse.ads)::
14701 * Ada.Containers.Formal_Vectors (a-cofove.ads)::
14702 * Ada.Command_Line.Environment (a-colien.ads)::
14703 * Ada.Command_Line.Remove (a-colire.ads)::
14704 * Ada.Command_Line.Response_File (a-clrefi.ads)::
14705 * Ada.Direct_IO.C_Streams (a-diocst.ads)::
14706 * Ada.Exceptions.Is_Null_Occurrence (a-einuoc.ads)::
14707 * Ada.Exceptions.Last_Chance_Handler (a-elchha.ads)::
14708 * Ada.Exceptions.Traceback (a-exctra.ads)::
14709 * Ada.Sequential_IO.C_Streams (a-siocst.ads)::
14710 * Ada.Streams.Stream_IO.C_Streams (a-ssicst.ads)::
14711 * Ada.Strings.Unbounded.Text_IO (a-suteio.ads)::
14712 * Ada.Strings.Wide_Unbounded.Wide_Text_IO (a-swuwti.ads)::
14713 * Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO (a-szuzti.ads)::
14714 * Ada.Text_IO.C_Streams (a-tiocst.ads)::
14715 * Ada.Text_IO.Reset_Standard_Files (a-tirsfi.ads)::
14716 * Ada.Wide_Characters.Unicode (a-wichun.ads)::
14717 * Ada.Wide_Text_IO.C_Streams (a-wtcstr.ads)::
14718 * Ada.Wide_Text_IO.Reset_Standard_Files (a-wrstfi.ads)::
14719 * Ada.Wide_Wide_Characters.Unicode (a-zchuni.ads)::
14720 * Ada.Wide_Wide_Text_IO.C_Streams (a-ztcstr.ads)::
14721 * Ada.Wide_Wide_Text_IO.Reset_Standard_Files (a-zrstfi.ads)::
14722 * GNAT.Altivec (g-altive.ads)::
14723 * GNAT.Altivec.Conversions (g-altcon.ads)::
14724 * GNAT.Altivec.Vector_Operations (g-alveop.ads)::
14725 * GNAT.Altivec.Vector_Types (g-alvety.ads)::
14726 * GNAT.Altivec.Vector_Views (g-alvevi.ads)::
14727 * GNAT.Array_Split (g-arrspl.ads)::
14728 * GNAT.AWK (g-awk.ads)::
14729 * GNAT.Bounded_Buffers (g-boubuf.ads)::
14730 * GNAT.Bounded_Mailboxes (g-boumai.ads)::
14731 * GNAT.Bubble_Sort (g-bubsor.ads)::
14732 * GNAT.Bubble_Sort_A (g-busora.ads)::
14733 * GNAT.Bubble_Sort_G (g-busorg.ads)::
14734 * GNAT.Byte_Order_Mark (g-byorma.ads)::
14735 * GNAT.Byte_Swapping (g-bytswa.ads)::
14736 * GNAT.Calendar (g-calend.ads)::
14737 * GNAT.Calendar.Time_IO (g-catiio.ads)::
14738 * GNAT.Case_Util (g-casuti.ads)::
14739 * GNAT.CGI (g-cgi.ads)::
14740 * GNAT.CGI.Cookie (g-cgicoo.ads)::
14741 * GNAT.CGI.Debug (g-cgideb.ads)::
14742 * GNAT.Command_Line (g-comlin.ads)::
14743 * GNAT.Compiler_Version (g-comver.ads)::
14744 * GNAT.Ctrl_C (g-ctrl_c.ads)::
14745 * GNAT.CRC32 (g-crc32.ads)::
14746 * GNAT.Current_Exception (g-curexc.ads)::
14747 * GNAT.Debug_Pools (g-debpoo.ads)::
14748 * GNAT.Debug_Utilities (g-debuti.ads)::
14749 * GNAT.Decode_String (g-decstr.ads)::
14750 * GNAT.Decode_UTF8_String (g-deutst.ads)::
14751 * GNAT.Directory_Operations (g-dirope.ads)::
14752 * GNAT.Directory_Operations.Iteration (g-diopit.ads)::
14753 * GNAT.Dynamic_HTables (g-dynhta.ads)::
14754 * GNAT.Dynamic_Tables (g-dyntab.ads)::
14755 * GNAT.Encode_String (g-encstr.ads)::
14756 * GNAT.Encode_UTF8_String (g-enutst.ads)::
14757 * GNAT.Exception_Actions (g-excact.ads)::
14758 * GNAT.Exception_Traces (g-exctra.ads)::
14759 * GNAT.Exceptions (g-except.ads)::
14760 * GNAT.Expect (g-expect.ads)::
14761 * GNAT.Expect.TTY (g-exptty.ads)::
14762 * GNAT.Float_Control (g-flocon.ads)::
14763 * GNAT.Heap_Sort (g-heasor.ads)::
14764 * GNAT.Heap_Sort_A (g-hesora.ads)::
14765 * GNAT.Heap_Sort_G (g-hesorg.ads)::
14766 * GNAT.HTable (g-htable.ads)::
14767 * GNAT.IO (g-io.ads)::
14768 * GNAT.IO_Aux (g-io_aux.ads)::
14769 * GNAT.Lock_Files (g-locfil.ads)::
14770 * GNAT.MBBS_Discrete_Random (g-mbdira.ads)::
14771 * GNAT.MBBS_Float_Random (g-mbflra.ads)::
14772 * GNAT.MD5 (g-md5.ads)::
14773 * GNAT.Memory_Dump (g-memdum.ads)::
14774 * GNAT.Most_Recent_Exception (g-moreex.ads)::
14775 * GNAT.OS_Lib (g-os_lib.ads)::
14776 * GNAT.Perfect_Hash_Generators (g-pehage.ads)::
14777 * GNAT.Random_Numbers (g-rannum.ads)::
14778 * GNAT.Regexp (g-regexp.ads)::
14779 * GNAT.Registry (g-regist.ads)::
14780 * GNAT.Regpat (g-regpat.ads)::
14781 * GNAT.Secondary_Stack_Info (g-sestin.ads)::
14782 * GNAT.Semaphores (g-semaph.ads)::
14783 * GNAT.Serial_Communications (g-sercom.ads)::
14784 * GNAT.SHA1 (g-sha1.ads)::
14785 * GNAT.SHA224 (g-sha224.ads)::
14786 * GNAT.SHA256 (g-sha256.ads)::
14787 * GNAT.SHA384 (g-sha384.ads)::
14788 * GNAT.SHA512 (g-sha512.ads)::
14789 * GNAT.Signals (g-signal.ads)::
14790 * GNAT.Sockets (g-socket.ads)::
14791 * GNAT.Source_Info (g-souinf.ads)::
14792 * GNAT.Spelling_Checker (g-speche.ads)::
14793 * GNAT.Spelling_Checker_Generic (g-spchge.ads)::
14794 * GNAT.Spitbol.Patterns (g-spipat.ads)::
14795 * GNAT.Spitbol (g-spitbo.ads)::
14796 * GNAT.Spitbol.Table_Boolean (g-sptabo.ads)::
14797 * GNAT.Spitbol.Table_Integer (g-sptain.ads)::
14798 * GNAT.Spitbol.Table_VString (g-sptavs.ads)::
14799 * GNAT.SSE (g-sse.ads)::
14800 * GNAT.SSE.Vector_Types (g-ssvety.ads)::
14801 * GNAT.Strings (g-string.ads)::
14802 * GNAT.String_Split (g-strspl.ads)::
14803 * GNAT.Table (g-table.ads)::
14804 * GNAT.Task_Lock (g-tasloc.ads)::
14805 * GNAT.Threads (g-thread.ads)::
14806 * GNAT.Time_Stamp (g-timsta.ads)::
14807 * GNAT.Traceback (g-traceb.ads)::
14808 * GNAT.Traceback.Symbolic (g-trasym.ads)::
14809 * GNAT.UTF_32 (g-utf_32.ads)::
14810 * GNAT.UTF_32_Spelling_Checker (g-u3spch.ads)::
14811 * GNAT.Wide_Spelling_Checker (g-wispch.ads)::
14812 * GNAT.Wide_String_Split (g-wistsp.ads)::
14813 * GNAT.Wide_Wide_Spelling_Checker (g-zspche.ads)::
14814 * GNAT.Wide_Wide_String_Split (g-zistsp.ads)::
14815 * Interfaces.C.Extensions (i-cexten.ads)::
14816 * Interfaces.C.Streams (i-cstrea.ads)::
14817 * Interfaces.CPP (i-cpp.ads)::
14818 * Interfaces.Packed_Decimal (i-pacdec.ads)::
14819 * Interfaces.VxWorks (i-vxwork.ads)::
14820 * Interfaces.VxWorks.IO (i-vxwoio.ads)::
14821 * System.Address_Image (s-addima.ads)::
14822 * System.Assertions (s-assert.ads)::
14823 * System.Memory (s-memory.ads)::
14824 * System.Partition_Interface (s-parint.ads)::
14825 * System.Pool_Global (s-pooglo.ads)::
14826 * System.Pool_Local (s-pooloc.ads)::
14827 * System.Restrictions (s-restri.ads)::
14828 * System.Rident (s-rident.ads)::
14829 * System.Strings.Stream_Ops (s-ststop.ads)::
14830 * System.Task_Info (s-tasinf.ads)::
14831 * System.Wch_Cnv (s-wchcnv.ads)::
14832 * System.Wch_Con (s-wchcon.ads)::
14833 @end menu
14834
14835 @node Ada.Characters.Latin_9 (a-chlat9.ads)
14836 @section @code{Ada.Characters.Latin_9} (@file{a-chlat9.ads})
14837 @cindex @code{Ada.Characters.Latin_9} (@file{a-chlat9.ads})
14838 @cindex Latin_9 constants for Character
14839
14840 @noindent
14841 This child of @code{Ada.Characters}
14842 provides a set of definitions corresponding to those in the
14843 RM-defined package @code{Ada.Characters.Latin_1} but with the
14844 few modifications required for @code{Latin-9}
14845 The provision of such a package
14846 is specifically authorized by the Ada Reference Manual
14847 (RM A.3.3(27)).
14848
14849 @node Ada.Characters.Wide_Latin_1 (a-cwila1.ads)
14850 @section @code{Ada.Characters.Wide_Latin_1} (@file{a-cwila1.ads})
14851 @cindex @code{Ada.Characters.Wide_Latin_1} (@file{a-cwila1.ads})
14852 @cindex Latin_1 constants for Wide_Character
14853
14854 @noindent
14855 This child of @code{Ada.Characters}
14856 provides a set of definitions corresponding to those in the
14857 RM-defined package @code{Ada.Characters.Latin_1} but with the
14858 types of the constants being @code{Wide_Character}
14859 instead of @code{Character}.  The provision of such a package
14860 is specifically authorized by the Ada Reference Manual
14861 (RM A.3.3(27)).
14862
14863 @node Ada.Characters.Wide_Latin_9 (a-cwila9.ads)
14864 @section @code{Ada.Characters.Wide_Latin_9} (@file{a-cwila1.ads})
14865 @cindex @code{Ada.Characters.Wide_Latin_9} (@file{a-cwila1.ads})
14866 @cindex Latin_9 constants for Wide_Character
14867
14868 @noindent
14869 This child of @code{Ada.Characters}
14870 provides a set of definitions corresponding to those in the
14871 GNAT defined package @code{Ada.Characters.Latin_9} but with the
14872 types of the constants being @code{Wide_Character}
14873 instead of @code{Character}.  The provision of such a package
14874 is specifically authorized by the Ada Reference Manual
14875 (RM A.3.3(27)).
14876
14877 @node Ada.Characters.Wide_Wide_Latin_1 (a-chzla1.ads)
14878 @section @code{Ada.Characters.Wide_Wide_Latin_1} (@file{a-chzla1.ads})
14879 @cindex @code{Ada.Characters.Wide_Wide_Latin_1} (@file{a-chzla1.ads})
14880 @cindex Latin_1 constants for Wide_Wide_Character
14881
14882 @noindent
14883 This child of @code{Ada.Characters}
14884 provides a set of definitions corresponding to those in the
14885 RM-defined package @code{Ada.Characters.Latin_1} but with the
14886 types of the constants being @code{Wide_Wide_Character}
14887 instead of @code{Character}.  The provision of such a package
14888 is specifically authorized by the Ada Reference Manual
14889 (RM A.3.3(27)).
14890
14891 @node Ada.Characters.Wide_Wide_Latin_9 (a-chzla9.ads)
14892 @section @code{Ada.Characters.Wide_Wide_Latin_9} (@file{a-chzla9.ads})
14893 @cindex @code{Ada.Characters.Wide_Wide_Latin_9} (@file{a-chzla9.ads})
14894 @cindex Latin_9 constants for Wide_Wide_Character
14895
14896 @noindent
14897 This child of @code{Ada.Characters}
14898 provides a set of definitions corresponding to those in the
14899 GNAT defined package @code{Ada.Characters.Latin_9} but with the
14900 types of the constants being @code{Wide_Wide_Character}
14901 instead of @code{Character}.  The provision of such a package
14902 is specifically authorized by the Ada Reference Manual
14903 (RM A.3.3(27)).
14904
14905 @node Ada.Containers.Formal_Doubly_Linked_Lists (a-cfdlli.ads)
14906 @section @code{Ada.Containers.Formal_Doubly_Linked_Lists} (@file{a-cfdlli.ads})
14907 @cindex @code{Ada.Containers.Formal_Doubly_Linked_Lists} (@file{a-cfdlli.ads})
14908 @cindex Formal container for doubly linked lists
14909
14910 @noindent
14911 This child of @code{Ada.Containers} defines a modified version of the Ada 2005
14912 container for doubly linked lists, meant to facilitate formal verification of
14913 code using such containers.
14914
14915 @node Ada.Containers.Formal_Hashed_Maps (a-cfhama.ads)
14916 @section @code{Ada.Containers.Formal_Hashed_Maps} (@file{a-cfhama.ads})
14917 @cindex @code{Ada.Containers.Formal_Hashed_Maps} (@file{a-cfhama.ads})
14918 @cindex Formal container for hashed maps
14919
14920 @noindent
14921 This child of @code{Ada.Containers} defines a modified version of the Ada 2005
14922 container for hashed maps, meant to facilitate formal verification of
14923 code using such containers.
14924
14925 @node Ada.Containers.Formal_Hashed_Sets (a-cfhase.ads)
14926 @section @code{Ada.Containers.Formal_Hashed_Sets} (@file{a-cfhase.ads})
14927 @cindex @code{Ada.Containers.Formal_Hashed_Sets} (@file{a-cfhase.ads})
14928 @cindex Formal container for hashed sets
14929
14930 @noindent
14931 This child of @code{Ada.Containers} defines a modified version of the Ada 2005
14932 container for hashed sets, meant to facilitate formal verification of
14933 code using such containers.
14934
14935 @node Ada.Containers.Formal_Ordered_Maps (a-cforma.ads)
14936 @section @code{Ada.Containers.Formal_Ordered_Maps} (@file{a-cforma.ads})
14937 @cindex @code{Ada.Containers.Formal_Ordered_Maps} (@file{a-cforma.ads})
14938 @cindex Formal container for ordered maps
14939
14940 @noindent
14941 This child of @code{Ada.Containers} defines a modified version of the Ada 2005
14942 container for ordered maps, meant to facilitate formal verification of
14943 code using such containers.
14944
14945 @node Ada.Containers.Formal_Ordered_Sets (a-cforse.ads)
14946 @section @code{Ada.Containers.Formal_Ordered_Sets} (@file{a-cforse.ads})
14947 @cindex @code{Ada.Containers.Formal_Ordered_Sets} (@file{a-cforse.ads})
14948 @cindex Formal container for ordered sets
14949
14950 @noindent
14951 This child of @code{Ada.Containers} defines a modified version of the Ada 2005
14952 container for ordered sets, meant to facilitate formal verification of
14953 code using such containers.
14954
14955 @node Ada.Containers.Formal_Vectors (a-cofove.ads)
14956 @section @code{Ada.Containers.Formal_Vectors} (@file{a-cofove.ads})
14957 @cindex @code{Ada.Containers.Formal_Vectors} (@file{a-cofove.ads})
14958 @cindex Formal container for vectors
14959
14960 @noindent
14961 This child of @code{Ada.Containers} defines a modified version of the Ada 2005
14962 container for vectors, meant to facilitate formal verification of
14963 code using such containers.
14964
14965 @node Ada.Command_Line.Environment (a-colien.ads)
14966 @section @code{Ada.Command_Line.Environment} (@file{a-colien.ads})
14967 @cindex @code{Ada.Command_Line.Environment} (@file{a-colien.ads})
14968 @cindex Environment entries
14969
14970 @noindent
14971 This child of @code{Ada.Command_Line}
14972 provides a mechanism for obtaining environment values on systems
14973 where this concept makes sense.
14974
14975 @node Ada.Command_Line.Remove (a-colire.ads)
14976 @section @code{Ada.Command_Line.Remove} (@file{a-colire.ads})
14977 @cindex @code{Ada.Command_Line.Remove} (@file{a-colire.ads})
14978 @cindex Removing command line arguments
14979 @cindex Command line, argument removal
14980
14981 @noindent
14982 This child of @code{Ada.Command_Line}
14983 provides a mechanism for logically removing
14984 arguments from the argument list.  Once removed, an argument is not visible
14985 to further calls on the subprograms in @code{Ada.Command_Line} will not
14986 see the removed argument.
14987
14988 @node Ada.Command_Line.Response_File (a-clrefi.ads)
14989 @section @code{Ada.Command_Line.Response_File} (@file{a-clrefi.ads})
14990 @cindex @code{Ada.Command_Line.Response_File} (@file{a-clrefi.ads})
14991 @cindex Response file for command line
14992 @cindex Command line, response file
14993 @cindex Command line, handling long command lines
14994
14995 @noindent
14996 This child of @code{Ada.Command_Line} provides a mechanism facilities for
14997 getting command line arguments from a text file, called a "response file".
14998 Using a response file allow passing a set of arguments to an executable longer
14999 than the maximum allowed by the system on the command line.
15000
15001 @node Ada.Direct_IO.C_Streams (a-diocst.ads)
15002 @section @code{Ada.Direct_IO.C_Streams} (@file{a-diocst.ads})
15003 @cindex @code{Ada.Direct_IO.C_Streams} (@file{a-diocst.ads})
15004 @cindex C Streams, Interfacing with Direct_IO
15005
15006 @noindent
15007 This package provides subprograms that allow interfacing between
15008 C streams and @code{Direct_IO}.  The stream identifier can be
15009 extracted from a file opened on the Ada side, and an Ada file
15010 can be constructed from a stream opened on the C side.
15011
15012 @node Ada.Exceptions.Is_Null_Occurrence (a-einuoc.ads)
15013 @section @code{Ada.Exceptions.Is_Null_Occurrence} (@file{a-einuoc.ads})
15014 @cindex @code{Ada.Exceptions.Is_Null_Occurrence} (@file{a-einuoc.ads})
15015 @cindex Null_Occurrence, testing for
15016
15017 @noindent
15018 This child subprogram provides a way of testing for the null
15019 exception occurrence (@code{Null_Occurrence}) without raising
15020 an exception.
15021
15022 @node Ada.Exceptions.Last_Chance_Handler (a-elchha.ads)
15023 @section @code{Ada.Exceptions.Last_Chance_Handler} (@file{a-elchha.ads})
15024 @cindex @code{Ada.Exceptions.Last_Chance_Handler} (@file{a-elchha.ads})
15025 @cindex Null_Occurrence, testing for
15026
15027 @noindent
15028 This child subprogram is used for handling otherwise unhandled
15029 exceptions (hence the name last chance), and perform clean ups before
15030 terminating the program. Note that this subprogram never returns.
15031
15032 @node Ada.Exceptions.Traceback (a-exctra.ads)
15033 @section @code{Ada.Exceptions.Traceback} (@file{a-exctra.ads})
15034 @cindex @code{Ada.Exceptions.Traceback} (@file{a-exctra.ads})
15035 @cindex Traceback for Exception Occurrence
15036
15037 @noindent
15038 This child package provides the subprogram (@code{Tracebacks}) to
15039 give a traceback array of addresses based on an exception
15040 occurrence.
15041
15042 @node Ada.Sequential_IO.C_Streams (a-siocst.ads)
15043 @section @code{Ada.Sequential_IO.C_Streams} (@file{a-siocst.ads})
15044 @cindex @code{Ada.Sequential_IO.C_Streams} (@file{a-siocst.ads})
15045 @cindex C Streams, Interfacing with Sequential_IO
15046
15047 @noindent
15048 This package provides subprograms that allow interfacing between
15049 C streams and @code{Sequential_IO}.  The stream identifier can be
15050 extracted from a file opened on the Ada side, and an Ada file
15051 can be constructed from a stream opened on the C side.
15052
15053 @node Ada.Streams.Stream_IO.C_Streams (a-ssicst.ads)
15054 @section @code{Ada.Streams.Stream_IO.C_Streams} (@file{a-ssicst.ads})
15055 @cindex @code{Ada.Streams.Stream_IO.C_Streams} (@file{a-ssicst.ads})
15056 @cindex C Streams, Interfacing with Stream_IO
15057
15058 @noindent
15059 This package provides subprograms that allow interfacing between
15060 C streams and @code{Stream_IO}.  The stream identifier can be
15061 extracted from a file opened on the Ada side, and an Ada file
15062 can be constructed from a stream opened on the C side.
15063
15064 @node Ada.Strings.Unbounded.Text_IO (a-suteio.ads)
15065 @section @code{Ada.Strings.Unbounded.Text_IO} (@file{a-suteio.ads})
15066 @cindex @code{Ada.Strings.Unbounded.Text_IO} (@file{a-suteio.ads})
15067 @cindex @code{Unbounded_String}, IO support
15068 @cindex @code{Text_IO}, extensions for unbounded strings
15069
15070 @noindent
15071 This package provides subprograms for Text_IO for unbounded
15072 strings, avoiding the necessity for an intermediate operation
15073 with ordinary strings.
15074
15075 @node Ada.Strings.Wide_Unbounded.Wide_Text_IO (a-swuwti.ads)
15076 @section @code{Ada.Strings.Wide_Unbounded.Wide_Text_IO} (@file{a-swuwti.ads})
15077 @cindex @code{Ada.Strings.Wide_Unbounded.Wide_Text_IO} (@file{a-swuwti.ads})
15078 @cindex @code{Unbounded_Wide_String}, IO support
15079 @cindex @code{Text_IO}, extensions for unbounded wide strings
15080
15081 @noindent
15082 This package provides subprograms for Text_IO for unbounded
15083 wide strings, avoiding the necessity for an intermediate operation
15084 with ordinary wide strings.
15085
15086 @node Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO (a-szuzti.ads)
15087 @section @code{Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO} (@file{a-szuzti.ads})
15088 @cindex @code{Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO} (@file{a-szuzti.ads})
15089 @cindex @code{Unbounded_Wide_Wide_String}, IO support
15090 @cindex @code{Text_IO}, extensions for unbounded wide wide strings
15091
15092 @noindent
15093 This package provides subprograms for Text_IO for unbounded
15094 wide wide strings, avoiding the necessity for an intermediate operation
15095 with ordinary wide wide strings.
15096
15097 @node Ada.Text_IO.C_Streams (a-tiocst.ads)
15098 @section @code{Ada.Text_IO.C_Streams} (@file{a-tiocst.ads})
15099 @cindex @code{Ada.Text_IO.C_Streams} (@file{a-tiocst.ads})
15100 @cindex C Streams, Interfacing with @code{Text_IO}
15101
15102 @noindent
15103 This package provides subprograms that allow interfacing between
15104 C streams and @code{Text_IO}.  The stream identifier can be
15105 extracted from a file opened on the Ada side, and an Ada file
15106 can be constructed from a stream opened on the C side.
15107
15108 @node Ada.Text_IO.Reset_Standard_Files (a-tirsfi.ads)
15109 @section @code{Ada.Text_IO.Reset_Standard_Files} (@file{a-tirsfi.ads})
15110 @cindex @code{Ada.Text_IO.Reset_Standard_Files} (@file{a-tirsfi.ads})
15111 @cindex @code{Text_IO} resetting standard files
15112
15113 @noindent
15114 This procedure is used to reset the status of the standard files used
15115 by Ada.Text_IO.  This is useful in a situation (such as a restart in an
15116 embedded application) where the status of the files may change during
15117 execution (for example a standard input file may be redefined to be
15118 interactive).
15119
15120 @node Ada.Wide_Characters.Unicode (a-wichun.ads)
15121 @section @code{Ada.Wide_Characters.Unicode} (@file{a-wichun.ads})
15122 @cindex @code{Ada.Wide_Characters.Unicode} (@file{a-wichun.ads})
15123 @cindex Unicode categorization, Wide_Character
15124
15125 @noindent
15126 This package provides subprograms that allow categorization of
15127 Wide_Character values according to Unicode categories.
15128
15129 @node Ada.Wide_Text_IO.C_Streams (a-wtcstr.ads)
15130 @section @code{Ada.Wide_Text_IO.C_Streams} (@file{a-wtcstr.ads})
15131 @cindex @code{Ada.Wide_Text_IO.C_Streams} (@file{a-wtcstr.ads})
15132 @cindex C Streams, Interfacing with @code{Wide_Text_IO}
15133
15134 @noindent
15135 This package provides subprograms that allow interfacing between
15136 C streams and @code{Wide_Text_IO}.  The stream identifier can be
15137 extracted from a file opened on the Ada side, and an Ada file
15138 can be constructed from a stream opened on the C side.
15139
15140 @node Ada.Wide_Text_IO.Reset_Standard_Files (a-wrstfi.ads)
15141 @section @code{Ada.Wide_Text_IO.Reset_Standard_Files} (@file{a-wrstfi.ads})
15142 @cindex @code{Ada.Wide_Text_IO.Reset_Standard_Files} (@file{a-wrstfi.ads})
15143 @cindex @code{Wide_Text_IO} resetting standard files
15144
15145 @noindent
15146 This procedure is used to reset the status of the standard files used
15147 by Ada.Wide_Text_IO.  This is useful in a situation (such as a restart in an
15148 embedded application) where the status of the files may change during
15149 execution (for example a standard input file may be redefined to be
15150 interactive).
15151
15152 @node Ada.Wide_Wide_Characters.Unicode (a-zchuni.ads)
15153 @section @code{Ada.Wide_Wide_Characters.Unicode} (@file{a-zchuni.ads})
15154 @cindex @code{Ada.Wide_Wide_Characters.Unicode} (@file{a-zchuni.ads})
15155 @cindex Unicode categorization, Wide_Wide_Character
15156
15157 @noindent
15158 This package provides subprograms that allow categorization of
15159 Wide_Wide_Character values according to Unicode categories.
15160
15161 @node Ada.Wide_Wide_Text_IO.C_Streams (a-ztcstr.ads)
15162 @section @code{Ada.Wide_Wide_Text_IO.C_Streams} (@file{a-ztcstr.ads})
15163 @cindex @code{Ada.Wide_Wide_Text_IO.C_Streams} (@file{a-ztcstr.ads})
15164 @cindex C Streams, Interfacing with @code{Wide_Wide_Text_IO}
15165
15166 @noindent
15167 This package provides subprograms that allow interfacing between
15168 C streams and @code{Wide_Wide_Text_IO}.  The stream identifier can be
15169 extracted from a file opened on the Ada side, and an Ada file
15170 can be constructed from a stream opened on the C side.
15171
15172 @node Ada.Wide_Wide_Text_IO.Reset_Standard_Files (a-zrstfi.ads)
15173 @section @code{Ada.Wide_Wide_Text_IO.Reset_Standard_Files} (@file{a-zrstfi.ads})
15174 @cindex @code{Ada.Wide_Wide_Text_IO.Reset_Standard_Files} (@file{a-zrstfi.ads})
15175 @cindex @code{Wide_Wide_Text_IO} resetting standard files
15176
15177 @noindent
15178 This procedure is used to reset the status of the standard files used
15179 by Ada.Wide_Wide_Text_IO. This is useful in a situation (such as a
15180 restart in an embedded application) where the status of the files may
15181 change during execution (for example a standard input file may be
15182 redefined to be interactive).
15183
15184 @node GNAT.Altivec (g-altive.ads)
15185 @section @code{GNAT.Altivec} (@file{g-altive.ads})
15186 @cindex @code{GNAT.Altivec} (@file{g-altive.ads})
15187 @cindex AltiVec
15188
15189 @noindent
15190 This is the root package of the GNAT AltiVec binding. It provides
15191 definitions of constants and types common to all the versions of the
15192 binding.
15193
15194 @node GNAT.Altivec.Conversions (g-altcon.ads)
15195 @section @code{GNAT.Altivec.Conversions} (@file{g-altcon.ads})
15196 @cindex @code{GNAT.Altivec.Conversions} (@file{g-altcon.ads})
15197 @cindex AltiVec
15198
15199 @noindent
15200 This package provides the Vector/View conversion routines.
15201
15202 @node GNAT.Altivec.Vector_Operations (g-alveop.ads)
15203 @section @code{GNAT.Altivec.Vector_Operations} (@file{g-alveop.ads})
15204 @cindex @code{GNAT.Altivec.Vector_Operations} (@file{g-alveop.ads})
15205 @cindex AltiVec
15206
15207 @noindent
15208 This package exposes the Ada interface to the AltiVec operations on
15209 vector objects. A soft emulation is included by default in the GNAT
15210 library. The hard binding is provided as a separate package. This unit
15211 is common to both bindings.
15212
15213 @node GNAT.Altivec.Vector_Types (g-alvety.ads)
15214 @section @code{GNAT.Altivec.Vector_Types} (@file{g-alvety.ads})
15215 @cindex @code{GNAT.Altivec.Vector_Types} (@file{g-alvety.ads})
15216 @cindex AltiVec
15217
15218 @noindent
15219 This package exposes the various vector types part of the Ada binding
15220 to AltiVec facilities.
15221
15222 @node GNAT.Altivec.Vector_Views (g-alvevi.ads)
15223 @section @code{GNAT.Altivec.Vector_Views} (@file{g-alvevi.ads})
15224 @cindex @code{GNAT.Altivec.Vector_Views} (@file{g-alvevi.ads})
15225 @cindex AltiVec
15226
15227 @noindent
15228 This package provides public 'View' data types from/to which private
15229 vector representations can be converted via
15230 GNAT.Altivec.Conversions. This allows convenient access to individual
15231 vector elements and provides a simple way to initialize vector
15232 objects.
15233
15234 @node GNAT.Array_Split (g-arrspl.ads)
15235 @section @code{GNAT.Array_Split} (@file{g-arrspl.ads})
15236 @cindex @code{GNAT.Array_Split} (@file{g-arrspl.ads})
15237 @cindex Array splitter
15238
15239 @noindent
15240 Useful array-manipulation routines: given a set of separators, split
15241 an array wherever the separators appear, and provide direct access
15242 to the resulting slices.
15243
15244 @node GNAT.AWK (g-awk.ads)
15245 @section @code{GNAT.AWK} (@file{g-awk.ads})
15246 @cindex @code{GNAT.AWK} (@file{g-awk.ads})
15247 @cindex Parsing
15248 @cindex AWK
15249
15250 @noindent
15251 Provides AWK-like parsing functions, with an easy interface for parsing one
15252 or more files containing formatted data.  The file is viewed as a database
15253 where each record is a line and a field is a data element in this line.
15254
15255 @node GNAT.Bounded_Buffers (g-boubuf.ads)
15256 @section @code{GNAT.Bounded_Buffers} (@file{g-boubuf.ads})
15257 @cindex @code{GNAT.Bounded_Buffers} (@file{g-boubuf.ads})
15258 @cindex Parsing
15259 @cindex Bounded Buffers
15260
15261 @noindent
15262 Provides a concurrent generic bounded buffer abstraction.  Instances are
15263 useful directly or as parts of the implementations of other abstractions,
15264 such as mailboxes.
15265
15266 @node GNAT.Bounded_Mailboxes (g-boumai.ads)
15267 @section @code{GNAT.Bounded_Mailboxes} (@file{g-boumai.ads})
15268 @cindex @code{GNAT.Bounded_Mailboxes} (@file{g-boumai.ads})
15269 @cindex Parsing
15270 @cindex Mailboxes
15271
15272 @noindent
15273 Provides a thread-safe asynchronous intertask mailbox communication facility.
15274
15275 @node GNAT.Bubble_Sort (g-bubsor.ads)
15276 @section @code{GNAT.Bubble_Sort} (@file{g-bubsor.ads})
15277 @cindex @code{GNAT.Bubble_Sort} (@file{g-bubsor.ads})
15278 @cindex Sorting
15279 @cindex Bubble sort
15280
15281 @noindent
15282 Provides a general implementation of bubble sort usable for sorting arbitrary
15283 data items.  Exchange and comparison procedures are provided by passing
15284 access-to-procedure values.
15285
15286 @node GNAT.Bubble_Sort_A (g-busora.ads)
15287 @section @code{GNAT.Bubble_Sort_A} (@file{g-busora.ads})
15288 @cindex @code{GNAT.Bubble_Sort_A} (@file{g-busora.ads})
15289 @cindex Sorting
15290 @cindex Bubble sort
15291
15292 @noindent
15293 Provides a general implementation of bubble sort usable for sorting arbitrary
15294 data items.  Move and comparison procedures are provided by passing
15295 access-to-procedure values. This is an older version, retained for
15296 compatibility. Usually @code{GNAT.Bubble_Sort} will be preferable.
15297
15298 @node GNAT.Bubble_Sort_G (g-busorg.ads)
15299 @section @code{GNAT.Bubble_Sort_G} (@file{g-busorg.ads})
15300 @cindex @code{GNAT.Bubble_Sort_G} (@file{g-busorg.ads})
15301 @cindex Sorting
15302 @cindex Bubble sort
15303
15304 @noindent
15305 Similar to @code{Bubble_Sort_A} except that the move and sorting procedures
15306 are provided as generic parameters, this improves efficiency, especially
15307 if the procedures can be inlined, at the expense of duplicating code for
15308 multiple instantiations.
15309
15310 @node GNAT.Byte_Order_Mark (g-byorma.ads)
15311 @section @code{GNAT.Byte_Order_Mark} (@file{g-byorma.ads})
15312 @cindex @code{GNAT.Byte_Order_Mark} (@file{g-byorma.ads})
15313 @cindex UTF-8 representation
15314 @cindex Wide characte representations
15315
15316 @noindent
15317 Provides a routine which given a string, reads the start of the string to
15318 see whether it is one of the standard byte order marks (BOM's) which signal
15319 the encoding of the string. The routine includes detection of special XML
15320 sequences for various UCS input formats.
15321
15322 @node GNAT.Byte_Swapping (g-bytswa.ads)
15323 @section @code{GNAT.Byte_Swapping} (@file{g-bytswa.ads})
15324 @cindex @code{GNAT.Byte_Swapping} (@file{g-bytswa.ads})
15325 @cindex Byte swapping
15326 @cindex Endian
15327
15328 @noindent
15329 General routines for swapping the bytes in 2-, 4-, and 8-byte quantities.
15330 Machine-specific implementations are available in some cases.
15331
15332 @node GNAT.Calendar (g-calend.ads)
15333 @section @code{GNAT.Calendar} (@file{g-calend.ads})
15334 @cindex @code{GNAT.Calendar} (@file{g-calend.ads})
15335 @cindex @code{Calendar}
15336
15337 @noindent
15338 Extends the facilities provided by @code{Ada.Calendar} to include handling
15339 of days of the week, an extended @code{Split} and @code{Time_Of} capability.
15340 Also provides conversion of @code{Ada.Calendar.Time} values to and from the
15341 C @code{timeval} format.
15342
15343 @node GNAT.Calendar.Time_IO (g-catiio.ads)
15344 @section @code{GNAT.Calendar.Time_IO} (@file{g-catiio.ads})
15345 @cindex @code{Calendar}
15346 @cindex Time
15347 @cindex @code{GNAT.Calendar.Time_IO} (@file{g-catiio.ads})
15348
15349 @node GNAT.CRC32 (g-crc32.ads)
15350 @section @code{GNAT.CRC32} (@file{g-crc32.ads})
15351 @cindex @code{GNAT.CRC32} (@file{g-crc32.ads})
15352 @cindex CRC32
15353 @cindex Cyclic Redundancy Check
15354
15355 @noindent
15356 This package implements the CRC-32 algorithm.  For a full description
15357 of this algorithm see
15358 ``Computation of Cyclic Redundancy Checks via Table Look-Up'',
15359 @cite{Communications of the ACM}, Vol.@: 31 No.@: 8, pp.@: 1008-1013,
15360 Aug.@: 1988.  Sarwate, D.V@.
15361
15362 @node GNAT.Case_Util (g-casuti.ads)
15363 @section @code{GNAT.Case_Util} (@file{g-casuti.ads})
15364 @cindex @code{GNAT.Case_Util} (@file{g-casuti.ads})
15365 @cindex Casing utilities
15366 @cindex Character handling (@code{GNAT.Case_Util})
15367
15368 @noindent
15369 A set of simple routines for handling upper and lower casing of strings
15370 without the overhead of the full casing tables
15371 in @code{Ada.Characters.Handling}.
15372
15373 @node GNAT.CGI (g-cgi.ads)
15374 @section @code{GNAT.CGI} (@file{g-cgi.ads})
15375 @cindex @code{GNAT.CGI} (@file{g-cgi.ads})
15376 @cindex CGI (Common Gateway Interface)
15377
15378 @noindent
15379 This is a package for interfacing a GNAT program with a Web server via the
15380 Common Gateway Interface (CGI)@.  Basically this package parses the CGI
15381 parameters, which are a set of key/value pairs sent by the Web server.  It
15382 builds a table whose index is the key and provides some services to deal
15383 with this table.
15384
15385 @node GNAT.CGI.Cookie (g-cgicoo.ads)
15386 @section @code{GNAT.CGI.Cookie} (@file{g-cgicoo.ads})
15387 @cindex @code{GNAT.CGI.Cookie} (@file{g-cgicoo.ads})
15388 @cindex CGI (Common Gateway Interface) cookie support
15389 @cindex Cookie support in CGI
15390
15391 @noindent
15392 This is a package to interface a GNAT program with a Web server via the
15393 Common Gateway Interface (CGI).  It exports services to deal with Web
15394 cookies (piece of information kept in the Web client software).
15395
15396 @node GNAT.CGI.Debug (g-cgideb.ads)
15397 @section @code{GNAT.CGI.Debug} (@file{g-cgideb.ads})
15398 @cindex @code{GNAT.CGI.Debug} (@file{g-cgideb.ads})
15399 @cindex CGI (Common Gateway Interface) debugging
15400
15401 @noindent
15402 This is a package to help debugging CGI (Common Gateway Interface)
15403 programs written in Ada.
15404
15405 @node GNAT.Command_Line (g-comlin.ads)
15406 @section @code{GNAT.Command_Line} (@file{g-comlin.ads})
15407 @cindex @code{GNAT.Command_Line} (@file{g-comlin.ads})
15408 @cindex Command line
15409
15410 @noindent
15411 Provides a high level interface to @code{Ada.Command_Line} facilities,
15412 including the ability to scan for named switches with optional parameters
15413 and expand file names using wild card notations.
15414
15415 @node GNAT.Compiler_Version (g-comver.ads)
15416 @section @code{GNAT.Compiler_Version} (@file{g-comver.ads})
15417 @cindex @code{GNAT.Compiler_Version} (@file{g-comver.ads})
15418 @cindex Compiler Version
15419 @cindex Version, of compiler
15420
15421 @noindent
15422 Provides a routine for obtaining the version of the compiler used to
15423 compile the program. More accurately this is the version of the binder
15424 used to bind the program (this will normally be the same as the version
15425 of the compiler if a consistent tool set is used to compile all units
15426 of a partition).
15427
15428 @node GNAT.Ctrl_C (g-ctrl_c.ads)
15429 @section @code{GNAT.Ctrl_C} (@file{g-ctrl_c.ads})
15430 @cindex @code{GNAT.Ctrl_C} (@file{g-ctrl_c.ads})
15431 @cindex Interrupt
15432
15433 @noindent
15434 Provides a simple interface to handle Ctrl-C keyboard events.
15435
15436 @node GNAT.Current_Exception (g-curexc.ads)
15437 @section @code{GNAT.Current_Exception} (@file{g-curexc.ads})
15438 @cindex @code{GNAT.Current_Exception} (@file{g-curexc.ads})
15439 @cindex Current exception
15440 @cindex Exception retrieval
15441
15442 @noindent
15443 Provides access to information on the current exception that has been raised
15444 without the need for using the Ada 95 / Ada 2005 exception choice parameter
15445 specification syntax.
15446 This is particularly useful in simulating typical facilities for
15447 obtaining information about exceptions provided by Ada 83 compilers.
15448
15449 @node GNAT.Debug_Pools (g-debpoo.ads)
15450 @section @code{GNAT.Debug_Pools} (@file{g-debpoo.ads})
15451 @cindex @code{GNAT.Debug_Pools} (@file{g-debpoo.ads})
15452 @cindex Debugging
15453 @cindex Debug pools
15454 @cindex Memory corruption debugging
15455
15456 @noindent
15457 Provide a debugging storage pools that helps tracking memory corruption
15458 problems.  @xref{The GNAT Debug Pool Facility,,, gnat_ugn,
15459 @value{EDITION} User's Guide}.
15460
15461 @node GNAT.Debug_Utilities (g-debuti.ads)
15462 @section @code{GNAT.Debug_Utilities} (@file{g-debuti.ads})
15463 @cindex @code{GNAT.Debug_Utilities} (@file{g-debuti.ads})
15464 @cindex Debugging
15465
15466 @noindent
15467 Provides a few useful utilities for debugging purposes, including conversion
15468 to and from string images of address values. Supports both C and Ada formats
15469 for hexadecimal literals.
15470
15471 @node GNAT.Decode_String (g-decstr.ads)
15472 @section @code{GNAT.Decode_String} (@file{g-decstr.ads})
15473 @cindex @code{GNAT.Decode_String} (@file{g-decstr.ads})
15474 @cindex Decoding strings
15475 @cindex String decoding
15476 @cindex Wide character encoding
15477 @cindex UTF-8
15478 @cindex Unicode
15479
15480 @noindent
15481 A generic package providing routines for decoding wide character and wide wide
15482 character strings encoded as sequences of 8-bit characters using a specified
15483 encoding method. Includes validation routines, and also routines for stepping
15484 to next or previous encoded character in an encoded string.
15485 Useful in conjunction with Unicode character coding. Note there is a
15486 preinstantiation for UTF-8. See next entry.
15487
15488 @node GNAT.Decode_UTF8_String (g-deutst.ads)
15489 @section @code{GNAT.Decode_UTF8_String} (@file{g-deutst.ads})
15490 @cindex @code{GNAT.Decode_UTF8_String} (@file{g-deutst.ads})
15491 @cindex Decoding strings
15492 @cindex Decoding UTF-8 strings
15493 @cindex UTF-8 string decoding
15494 @cindex Wide character decoding
15495 @cindex UTF-8
15496 @cindex Unicode
15497
15498 @noindent
15499 A preinstantiation of GNAT.Decode_Strings for UTF-8 encoding.
15500
15501 @node GNAT.Directory_Operations (g-dirope.ads)
15502 @section @code{GNAT.Directory_Operations} (@file{g-dirope.ads})
15503 @cindex @code{GNAT.Directory_Operations} (@file{g-dirope.ads})
15504 @cindex Directory operations
15505
15506 @noindent
15507 Provides a set of routines for manipulating directories, including changing
15508 the current directory, making new directories, and scanning the files in a
15509 directory.
15510
15511 @node GNAT.Directory_Operations.Iteration (g-diopit.ads)
15512 @section @code{GNAT.Directory_Operations.Iteration} (@file{g-diopit.ads})
15513 @cindex @code{GNAT.Directory_Operations.Iteration} (@file{g-diopit.ads})
15514 @cindex Directory operations iteration
15515
15516 @noindent
15517 A child unit of GNAT.Directory_Operations providing additional operations
15518 for iterating through directories.
15519
15520 @node GNAT.Dynamic_HTables (g-dynhta.ads)
15521 @section @code{GNAT.Dynamic_HTables} (@file{g-dynhta.ads})
15522 @cindex @code{GNAT.Dynamic_HTables} (@file{g-dynhta.ads})
15523 @cindex Hash tables
15524
15525 @noindent
15526 A generic implementation of hash tables that can be used to hash arbitrary
15527 data.  Provided in two forms, a simple form with built in hash functions,
15528 and a more complex form in which the hash function is supplied.
15529
15530 @noindent
15531 This package provides a facility similar to that of @code{GNAT.HTable},
15532 except that this package declares a type that can be used to define
15533 dynamic instances of the hash table, while an instantiation of
15534 @code{GNAT.HTable} creates a single instance of the hash table.
15535
15536 @node GNAT.Dynamic_Tables (g-dyntab.ads)
15537 @section @code{GNAT.Dynamic_Tables} (@file{g-dyntab.ads})
15538 @cindex @code{GNAT.Dynamic_Tables} (@file{g-dyntab.ads})
15539 @cindex Table implementation
15540 @cindex Arrays, extendable
15541
15542 @noindent
15543 A generic package providing a single dimension array abstraction where the
15544 length of the array can be dynamically modified.
15545
15546 @noindent
15547 This package provides a facility similar to that of @code{GNAT.Table},
15548 except that this package declares a type that can be used to define
15549 dynamic instances of the table, while an instantiation of
15550 @code{GNAT.Table} creates a single instance of the table type.
15551
15552 @node GNAT.Encode_String (g-encstr.ads)
15553 @section @code{GNAT.Encode_String} (@file{g-encstr.ads})
15554 @cindex @code{GNAT.Encode_String} (@file{g-encstr.ads})
15555 @cindex Encoding strings
15556 @cindex String encoding
15557 @cindex Wide character encoding
15558 @cindex UTF-8
15559 @cindex Unicode
15560
15561 @noindent
15562 A generic package providing routines for encoding wide character and wide
15563 wide character strings as sequences of 8-bit characters using a specified
15564 encoding method. Useful in conjunction with Unicode character coding.
15565 Note there is a preinstantiation for UTF-8. See next entry.
15566
15567 @node GNAT.Encode_UTF8_String (g-enutst.ads)
15568 @section @code{GNAT.Encode_UTF8_String} (@file{g-enutst.ads})
15569 @cindex @code{GNAT.Encode_UTF8_String} (@file{g-enutst.ads})
15570 @cindex Encoding strings
15571 @cindex Encoding UTF-8 strings
15572 @cindex UTF-8 string encoding
15573 @cindex Wide character encoding
15574 @cindex UTF-8
15575 @cindex Unicode
15576
15577 @noindent
15578 A preinstantiation of GNAT.Encode_Strings for UTF-8 encoding.
15579
15580 @node GNAT.Exception_Actions (g-excact.ads)
15581 @section @code{GNAT.Exception_Actions} (@file{g-excact.ads})
15582 @cindex @code{GNAT.Exception_Actions} (@file{g-excact.ads})
15583 @cindex Exception actions
15584
15585 @noindent
15586 Provides callbacks when an exception is raised. Callbacks can be registered
15587 for specific exceptions, or when any exception is raised. This
15588 can be used for instance to force a core dump to ease debugging.
15589
15590 @node GNAT.Exception_Traces (g-exctra.ads)
15591 @section @code{GNAT.Exception_Traces} (@file{g-exctra.ads})
15592 @cindex @code{GNAT.Exception_Traces} (@file{g-exctra.ads})
15593 @cindex Exception traces
15594 @cindex Debugging
15595
15596 @noindent
15597 Provides an interface allowing to control automatic output upon exception
15598 occurrences.
15599
15600 @node GNAT.Exceptions (g-except.ads)
15601 @section @code{GNAT.Exceptions} (@file{g-expect.ads})
15602 @cindex @code{GNAT.Exceptions} (@file{g-expect.ads})
15603 @cindex Exceptions, Pure
15604 @cindex Pure packages, exceptions
15605
15606 @noindent
15607 Normally it is not possible to raise an exception with
15608 a message from a subprogram in a pure package, since the
15609 necessary types and subprograms are in @code{Ada.Exceptions}
15610 which is not a pure unit. @code{GNAT.Exceptions} provides a
15611 facility for getting around this limitation for a few
15612 predefined exceptions, and for example allow raising
15613 @code{Constraint_Error} with a message from a pure subprogram.
15614
15615 @node GNAT.Expect (g-expect.ads)
15616 @section @code{GNAT.Expect} (@file{g-expect.ads})
15617 @cindex @code{GNAT.Expect} (@file{g-expect.ads})
15618
15619 @noindent
15620 Provides a set of subprograms similar to what is available
15621 with the standard Tcl Expect tool.
15622 It allows you to easily spawn and communicate with an external process.
15623 You can send commands or inputs to the process, and compare the output
15624 with some expected regular expression. Currently @code{GNAT.Expect}
15625 is implemented on all native GNAT ports except for OpenVMS@.
15626 It is not implemented for cross ports, and in particular is not
15627 implemented for VxWorks or LynxOS@.
15628
15629 @node GNAT.Expect.TTY (g-exptty.ads)
15630 @section @code{GNAT.Expect.TTY} (@file{g-exptty.ads})
15631 @cindex @code{GNAT.Expect.TTY} (@file{g-exptty.ads})
15632
15633 @noindent
15634 As GNAT.Expect but using pseudo-terminal.
15635 Currently @code{GNAT.Expect.TTY} is implemented on all native GNAT
15636 ports except for OpenVMS@. It is not implemented for cross ports, and
15637 in particular is not implemented for VxWorks or LynxOS@.
15638
15639 @node GNAT.Float_Control (g-flocon.ads)
15640 @section @code{GNAT.Float_Control} (@file{g-flocon.ads})
15641 @cindex @code{GNAT.Float_Control} (@file{g-flocon.ads})
15642 @cindex Floating-Point Processor
15643
15644 @noindent
15645 Provides an interface for resetting the floating-point processor into the
15646 mode required for correct semantic operation in Ada.  Some third party
15647 library calls may cause this mode to be modified, and the Reset procedure
15648 in this package can be used to reestablish the required mode.
15649
15650 @node GNAT.Heap_Sort (g-heasor.ads)
15651 @section @code{GNAT.Heap_Sort} (@file{g-heasor.ads})
15652 @cindex @code{GNAT.Heap_Sort} (@file{g-heasor.ads})
15653 @cindex Sorting
15654
15655 @noindent
15656 Provides a general implementation of heap sort usable for sorting arbitrary
15657 data items. Exchange and comparison procedures are provided by passing
15658 access-to-procedure values.  The algorithm used is a modified heap sort
15659 that performs approximately N*log(N) comparisons in the worst case.
15660
15661 @node GNAT.Heap_Sort_A (g-hesora.ads)
15662 @section @code{GNAT.Heap_Sort_A} (@file{g-hesora.ads})
15663 @cindex @code{GNAT.Heap_Sort_A} (@file{g-hesora.ads})
15664 @cindex Sorting
15665
15666 @noindent
15667 Provides a general implementation of heap sort usable for sorting arbitrary
15668 data items. Move and comparison procedures are provided by passing
15669 access-to-procedure values.  The algorithm used is a modified heap sort
15670 that performs approximately N*log(N) comparisons in the worst case.
15671 This differs from @code{GNAT.Heap_Sort} in having a less convenient
15672 interface, but may be slightly more efficient.
15673
15674 @node GNAT.Heap_Sort_G (g-hesorg.ads)
15675 @section @code{GNAT.Heap_Sort_G} (@file{g-hesorg.ads})
15676 @cindex @code{GNAT.Heap_Sort_G} (@file{g-hesorg.ads})
15677 @cindex Sorting
15678
15679 @noindent
15680 Similar to @code{Heap_Sort_A} except that the move and sorting procedures
15681 are provided as generic parameters, this improves efficiency, especially
15682 if the procedures can be inlined, at the expense of duplicating code for
15683 multiple instantiations.
15684
15685 @node GNAT.HTable (g-htable.ads)
15686 @section @code{GNAT.HTable} (@file{g-htable.ads})
15687 @cindex @code{GNAT.HTable} (@file{g-htable.ads})
15688 @cindex Hash tables
15689
15690 @noindent
15691 A generic implementation of hash tables that can be used to hash arbitrary
15692 data.  Provides two approaches, one a simple static approach, and the other
15693 allowing arbitrary dynamic hash tables.
15694
15695 @node GNAT.IO (g-io.ads)
15696 @section @code{GNAT.IO} (@file{g-io.ads})
15697 @cindex @code{GNAT.IO} (@file{g-io.ads})
15698 @cindex Simple I/O
15699 @cindex Input/Output facilities
15700
15701 @noindent
15702 A simple preelaborable input-output package that provides a subset of
15703 simple Text_IO functions for reading characters and strings from
15704 Standard_Input, and writing characters, strings and integers to either
15705 Standard_Output or Standard_Error.
15706
15707 @node GNAT.IO_Aux (g-io_aux.ads)
15708 @section @code{GNAT.IO_Aux} (@file{g-io_aux.ads})
15709 @cindex @code{GNAT.IO_Aux} (@file{g-io_aux.ads})
15710 @cindex Text_IO
15711 @cindex Input/Output facilities
15712
15713 Provides some auxiliary functions for use with Text_IO, including a test
15714 for whether a file exists, and functions for reading a line of text.
15715
15716 @node GNAT.Lock_Files (g-locfil.ads)
15717 @section @code{GNAT.Lock_Files} (@file{g-locfil.ads})
15718 @cindex @code{GNAT.Lock_Files} (@file{g-locfil.ads})
15719 @cindex File locking
15720 @cindex Locking using files
15721
15722 @noindent
15723 Provides a general interface for using files as locks.  Can be used for
15724 providing program level synchronization.
15725
15726 @node GNAT.MBBS_Discrete_Random (g-mbdira.ads)
15727 @section @code{GNAT.MBBS_Discrete_Random} (@file{g-mbdira.ads})
15728 @cindex @code{GNAT.MBBS_Discrete_Random} (@file{g-mbdira.ads})
15729 @cindex Random number generation
15730
15731 @noindent
15732 The original implementation of @code{Ada.Numerics.Discrete_Random}.  Uses
15733 a modified version of the Blum-Blum-Shub generator.
15734
15735 @node GNAT.MBBS_Float_Random (g-mbflra.ads)
15736 @section @code{GNAT.MBBS_Float_Random} (@file{g-mbflra.ads})
15737 @cindex @code{GNAT.MBBS_Float_Random} (@file{g-mbflra.ads})
15738 @cindex Random number generation
15739
15740 @noindent
15741 The original implementation of @code{Ada.Numerics.Float_Random}.  Uses
15742 a modified version of the Blum-Blum-Shub generator.
15743
15744 @node GNAT.MD5 (g-md5.ads)
15745 @section @code{GNAT.MD5} (@file{g-md5.ads})
15746 @cindex @code{GNAT.MD5} (@file{g-md5.ads})
15747 @cindex Message Digest MD5
15748
15749 @noindent
15750 Implements the MD5 Message-Digest Algorithm as described in RFC 1321.
15751
15752 @node GNAT.Memory_Dump (g-memdum.ads)
15753 @section @code{GNAT.Memory_Dump} (@file{g-memdum.ads})
15754 @cindex @code{GNAT.Memory_Dump} (@file{g-memdum.ads})
15755 @cindex Dump Memory
15756
15757 @noindent
15758 Provides a convenient routine for dumping raw memory to either the
15759 standard output or standard error files. Uses GNAT.IO for actual
15760 output.
15761
15762 @node GNAT.Most_Recent_Exception (g-moreex.ads)
15763 @section @code{GNAT.Most_Recent_Exception} (@file{g-moreex.ads})
15764 @cindex @code{GNAT.Most_Recent_Exception} (@file{g-moreex.ads})
15765 @cindex Exception, obtaining most recent
15766
15767 @noindent
15768 Provides access to the most recently raised exception.  Can be used for
15769 various logging purposes, including duplicating functionality of some
15770 Ada 83 implementation dependent extensions.
15771
15772 @node GNAT.OS_Lib (g-os_lib.ads)
15773 @section @code{GNAT.OS_Lib} (@file{g-os_lib.ads})
15774 @cindex @code{GNAT.OS_Lib} (@file{g-os_lib.ads})
15775 @cindex Operating System interface
15776 @cindex Spawn capability
15777
15778 @noindent
15779 Provides a range of target independent operating system interface functions,
15780 including time/date management, file operations, subprocess management,
15781 including a portable spawn procedure, and access to environment variables
15782 and error return codes.
15783
15784 @node GNAT.Perfect_Hash_Generators (g-pehage.ads)
15785 @section @code{GNAT.Perfect_Hash_Generators} (@file{g-pehage.ads})
15786 @cindex @code{GNAT.Perfect_Hash_Generators} (@file{g-pehage.ads})
15787 @cindex Hash functions
15788
15789 @noindent
15790 Provides a generator of static minimal perfect hash functions. No
15791 collisions occur and each item can be retrieved from the table in one
15792 probe (perfect property). The hash table size corresponds to the exact
15793 size of the key set and no larger (minimal property). The key set has to
15794 be know in advance (static property). The hash functions are also order
15795 preserving. If w2 is inserted after w1 in the generator, their
15796 hashcode are in the same order. These hashing functions are very
15797 convenient for use with realtime applications.
15798
15799 @node GNAT.Random_Numbers (g-rannum.ads)
15800 @section @code{GNAT.Random_Numbers} (@file{g-rannum.ads})
15801 @cindex @code{GNAT.Random_Numbers} (@file{g-rannum.ads})
15802 @cindex Random number generation
15803
15804 @noindent
15805 Provides random number capabilities which extend those available in the
15806 standard Ada library and are more convenient to use.
15807
15808 @node GNAT.Regexp (g-regexp.ads)
15809 @section @code{GNAT.Regexp} (@file{g-regexp.ads})
15810 @cindex @code{GNAT.Regexp} (@file{g-regexp.ads})
15811 @cindex Regular expressions
15812 @cindex Pattern matching
15813
15814 @noindent
15815 A simple implementation of regular expressions, using a subset of regular
15816 expression syntax copied from familiar Unix style utilities.  This is the
15817 simples of the three pattern matching packages provided, and is particularly
15818 suitable for ``file globbing'' applications.
15819
15820 @node GNAT.Registry (g-regist.ads)
15821 @section @code{GNAT.Registry} (@file{g-regist.ads})
15822 @cindex @code{GNAT.Registry} (@file{g-regist.ads})
15823 @cindex Windows Registry
15824
15825 @noindent
15826 This is a high level binding to the Windows registry.  It is possible to
15827 do simple things like reading a key value, creating a new key.  For full
15828 registry API, but at a lower level of abstraction, refer to the Win32.Winreg
15829 package provided with the Win32Ada binding
15830
15831 @node GNAT.Regpat (g-regpat.ads)
15832 @section @code{GNAT.Regpat} (@file{g-regpat.ads})
15833 @cindex @code{GNAT.Regpat} (@file{g-regpat.ads})
15834 @cindex Regular expressions
15835 @cindex Pattern matching
15836
15837 @noindent
15838 A complete implementation of Unix-style regular expression matching, copied
15839 from the original V7 style regular expression library written in C by
15840 Henry Spencer (and binary compatible with this C library).
15841
15842 @node GNAT.Secondary_Stack_Info (g-sestin.ads)
15843 @section @code{GNAT.Secondary_Stack_Info} (@file{g-sestin.ads})
15844 @cindex @code{GNAT.Secondary_Stack_Info} (@file{g-sestin.ads})
15845 @cindex Secondary Stack Info
15846
15847 @noindent
15848 Provide the capability to query the high water mark of the current task's
15849 secondary stack.
15850
15851 @node GNAT.Semaphores (g-semaph.ads)
15852 @section @code{GNAT.Semaphores} (@file{g-semaph.ads})
15853 @cindex @code{GNAT.Semaphores} (@file{g-semaph.ads})
15854 @cindex Semaphores
15855
15856 @noindent
15857 Provides classic counting and binary semaphores using protected types.
15858
15859 @node GNAT.Serial_Communications (g-sercom.ads)
15860 @section @code{GNAT.Serial_Communications} (@file{g-sercom.ads})
15861 @cindex @code{GNAT.Serial_Communications} (@file{g-sercom.ads})
15862 @cindex Serial_Communications
15863
15864 @noindent
15865 Provides a simple interface to send and receive data over a serial
15866 port. This is only supported on GNU/Linux and Windows.
15867
15868 @node GNAT.SHA1 (g-sha1.ads)
15869 @section @code{GNAT.SHA1} (@file{g-sha1.ads})
15870 @cindex @code{GNAT.SHA1} (@file{g-sha1.ads})
15871 @cindex Secure Hash Algorithm SHA-1
15872
15873 @noindent
15874 Implements the SHA-1 Secure Hash Algorithm as described in FIPS PUB 180-3
15875 and RFC 3174.
15876
15877 @node GNAT.SHA224 (g-sha224.ads)
15878 @section @code{GNAT.SHA224} (@file{g-sha224.ads})
15879 @cindex @code{GNAT.SHA224} (@file{g-sha224.ads})
15880 @cindex Secure Hash Algorithm SHA-224
15881
15882 @noindent
15883 Implements the SHA-224 Secure Hash Algorithm as described in FIPS PUB 180-3.
15884
15885 @node GNAT.SHA256 (g-sha256.ads)
15886 @section @code{GNAT.SHA256} (@file{g-sha256.ads})
15887 @cindex @code{GNAT.SHA256} (@file{g-sha256.ads})
15888 @cindex Secure Hash Algorithm SHA-256
15889
15890 @noindent
15891 Implements the SHA-256 Secure Hash Algorithm as described in FIPS PUB 180-3.
15892
15893 @node GNAT.SHA384 (g-sha384.ads)
15894 @section @code{GNAT.SHA384} (@file{g-sha384.ads})
15895 @cindex @code{GNAT.SHA384} (@file{g-sha384.ads})
15896 @cindex Secure Hash Algorithm SHA-384
15897
15898 @noindent
15899 Implements the SHA-384 Secure Hash Algorithm as described in FIPS PUB 180-3.
15900
15901 @node GNAT.SHA512 (g-sha512.ads)
15902 @section @code{GNAT.SHA512} (@file{g-sha512.ads})
15903 @cindex @code{GNAT.SHA512} (@file{g-sha512.ads})
15904 @cindex Secure Hash Algorithm SHA-512
15905
15906 @noindent
15907 Implements the SHA-512 Secure Hash Algorithm as described in FIPS PUB 180-3.
15908
15909 @node GNAT.Signals (g-signal.ads)
15910 @section @code{GNAT.Signals} (@file{g-signal.ads})
15911 @cindex @code{GNAT.Signals} (@file{g-signal.ads})
15912 @cindex Signals
15913
15914 @noindent
15915 Provides the ability to manipulate the blocked status of signals on supported
15916 targets.
15917
15918 @node GNAT.Sockets (g-socket.ads)
15919 @section @code{GNAT.Sockets} (@file{g-socket.ads})
15920 @cindex @code{GNAT.Sockets} (@file{g-socket.ads})
15921 @cindex Sockets
15922
15923 @noindent
15924 A high level and portable interface to develop sockets based applications.
15925 This package is based on the sockets thin binding found in
15926 @code{GNAT.Sockets.Thin}. Currently @code{GNAT.Sockets} is implemented
15927 on all native GNAT ports except for OpenVMS@.  It is not implemented
15928 for the LynxOS@ cross port.
15929
15930 @node GNAT.Source_Info (g-souinf.ads)
15931 @section @code{GNAT.Source_Info} (@file{g-souinf.ads})
15932 @cindex @code{GNAT.Source_Info} (@file{g-souinf.ads})
15933 @cindex Source Information
15934
15935 @noindent
15936 Provides subprograms that give access to source code information known at
15937 compile time, such as the current file name and line number.
15938
15939 @node GNAT.Spelling_Checker (g-speche.ads)
15940 @section @code{GNAT.Spelling_Checker} (@file{g-speche.ads})
15941 @cindex @code{GNAT.Spelling_Checker} (@file{g-speche.ads})
15942 @cindex Spell checking
15943
15944 @noindent
15945 Provides a function for determining whether one string is a plausible
15946 near misspelling of another string.
15947
15948 @node GNAT.Spelling_Checker_Generic (g-spchge.ads)
15949 @section @code{GNAT.Spelling_Checker_Generic} (@file{g-spchge.ads})
15950 @cindex @code{GNAT.Spelling_Checker_Generic} (@file{g-spchge.ads})
15951 @cindex Spell checking
15952
15953 @noindent
15954 Provides a generic function that can be instantiated with a string type for
15955 determining whether one string is a plausible near misspelling of another
15956 string.
15957
15958 @node GNAT.Spitbol.Patterns (g-spipat.ads)
15959 @section @code{GNAT.Spitbol.Patterns} (@file{g-spipat.ads})
15960 @cindex @code{GNAT.Spitbol.Patterns} (@file{g-spipat.ads})
15961 @cindex SPITBOL pattern matching
15962 @cindex Pattern matching
15963
15964 @noindent
15965 A complete implementation of SNOBOL4 style pattern matching.  This is the
15966 most elaborate of the pattern matching packages provided.  It fully duplicates
15967 the SNOBOL4 dynamic pattern construction and matching capabilities, using the
15968 efficient algorithm developed by Robert Dewar for the SPITBOL system.
15969
15970 @node GNAT.Spitbol (g-spitbo.ads)
15971 @section @code{GNAT.Spitbol} (@file{g-spitbo.ads})
15972 @cindex @code{GNAT.Spitbol} (@file{g-spitbo.ads})
15973 @cindex SPITBOL interface
15974
15975 @noindent
15976 The top level package of the collection of SPITBOL-style functionality, this
15977 package provides basic SNOBOL4 string manipulation functions, such as
15978 Pad, Reverse, Trim, Substr capability, as well as a generic table function
15979 useful for constructing arbitrary mappings from strings in the style of
15980 the SNOBOL4 TABLE function.
15981
15982 @node GNAT.Spitbol.Table_Boolean (g-sptabo.ads)
15983 @section @code{GNAT.Spitbol.Table_Boolean} (@file{g-sptabo.ads})
15984 @cindex @code{GNAT.Spitbol.Table_Boolean} (@file{g-sptabo.ads})
15985 @cindex Sets of strings
15986 @cindex SPITBOL Tables
15987
15988 @noindent
15989 A library level of instantiation of @code{GNAT.Spitbol.Patterns.Table}
15990 for type @code{Standard.Boolean}, giving an implementation of sets of
15991 string values.
15992
15993 @node GNAT.Spitbol.Table_Integer (g-sptain.ads)
15994 @section @code{GNAT.Spitbol.Table_Integer} (@file{g-sptain.ads})
15995 @cindex @code{GNAT.Spitbol.Table_Integer} (@file{g-sptain.ads})
15996 @cindex Integer maps
15997 @cindex Maps
15998 @cindex SPITBOL Tables
15999
16000 @noindent
16001 A library level of instantiation of @code{GNAT.Spitbol.Patterns.Table}
16002 for type @code{Standard.Integer}, giving an implementation of maps
16003 from string to integer values.
16004
16005 @node GNAT.Spitbol.Table_VString (g-sptavs.ads)
16006 @section @code{GNAT.Spitbol.Table_VString} (@file{g-sptavs.ads})
16007 @cindex @code{GNAT.Spitbol.Table_VString} (@file{g-sptavs.ads})
16008 @cindex String maps
16009 @cindex Maps
16010 @cindex SPITBOL Tables
16011
16012 @noindent
16013 A library level of instantiation of @code{GNAT.Spitbol.Patterns.Table} for
16014 a variable length string type, giving an implementation of general
16015 maps from strings to strings.
16016
16017 @node GNAT.SSE (g-sse.ads)
16018 @section @code{GNAT.SSE} (@file{g-sse.ads})
16019 @cindex @code{GNAT.SSE} (@file{g-sse.ads})
16020
16021 @noindent
16022 Root of a set of units aimed at offering Ada bindings to a subset of
16023 the Intel(r) Streaming SIMD Extensions with GNAT on the x86 family of
16024 targets.  It exposes vector component types together with a general
16025 introduction to the binding contents and use.
16026
16027 @node GNAT.SSE.Vector_Types (g-ssvety.ads)
16028 @section @code{GNAT.SSE.Vector_Types} (@file{g-ssvety.ads})
16029 @cindex @code{GNAT.SSE.Vector_Types} (@file{g-ssvety.ads})
16030
16031 @noindent
16032 SSE vector types for use with SSE related intrinsics.
16033
16034 @node GNAT.Strings (g-string.ads)
16035 @section @code{GNAT.Strings} (@file{g-string.ads})
16036 @cindex @code{GNAT.Strings} (@file{g-string.ads})
16037
16038 @noindent
16039 Common String access types and related subprograms. Basically it
16040 defines a string access and an array of string access types.
16041
16042 @node GNAT.String_Split (g-strspl.ads)
16043 @section @code{GNAT.String_Split} (@file{g-strspl.ads})
16044 @cindex @code{GNAT.String_Split} (@file{g-strspl.ads})
16045 @cindex String splitter
16046
16047 @noindent
16048 Useful string manipulation routines: given a set of separators, split
16049 a string wherever the separators appear, and provide direct access
16050 to the resulting slices. This package is instantiated from
16051 @code{GNAT.Array_Split}.
16052
16053 @node GNAT.Table (g-table.ads)
16054 @section @code{GNAT.Table} (@file{g-table.ads})
16055 @cindex @code{GNAT.Table} (@file{g-table.ads})
16056 @cindex Table implementation
16057 @cindex Arrays, extendable
16058
16059 @noindent
16060 A generic package providing a single dimension array abstraction where the
16061 length of the array can be dynamically modified.
16062
16063 @noindent
16064 This package provides a facility similar to that of @code{GNAT.Dynamic_Tables},
16065 except that this package declares a single instance of the table type,
16066 while an instantiation of @code{GNAT.Dynamic_Tables} creates a type that can be
16067 used to define dynamic instances of the table.
16068
16069 @node GNAT.Task_Lock (g-tasloc.ads)
16070 @section @code{GNAT.Task_Lock} (@file{g-tasloc.ads})
16071 @cindex @code{GNAT.Task_Lock} (@file{g-tasloc.ads})
16072 @cindex Task synchronization
16073 @cindex Task locking
16074 @cindex Locking
16075
16076 @noindent
16077 A very simple facility for locking and unlocking sections of code using a
16078 single global task lock.  Appropriate for use in situations where contention
16079 between tasks is very rarely expected.
16080
16081 @node GNAT.Time_Stamp (g-timsta.ads)
16082 @section @code{GNAT.Time_Stamp} (@file{g-timsta.ads})
16083 @cindex @code{GNAT.Time_Stamp} (@file{g-timsta.ads})
16084 @cindex Time stamp
16085 @cindex Current time
16086
16087 @noindent
16088 Provides a simple function that returns a string YYYY-MM-DD HH:MM:SS.SS that
16089 represents the current date and time in ISO 8601 format. This is a very simple
16090 routine with minimal code and there are no dependencies on any other unit.
16091
16092 @node GNAT.Threads (g-thread.ads)
16093 @section @code{GNAT.Threads} (@file{g-thread.ads})
16094 @cindex @code{GNAT.Threads} (@file{g-thread.ads})
16095 @cindex Foreign threads
16096 @cindex Threads, foreign
16097
16098 @noindent
16099 Provides facilities for dealing with foreign threads which need to be known
16100 by the GNAT run-time system. Consult the documentation of this package for
16101 further details if your program has threads that are created by a non-Ada
16102 environment which then accesses Ada code.
16103
16104 @node GNAT.Traceback (g-traceb.ads)
16105 @section @code{GNAT.Traceback} (@file{g-traceb.ads})
16106 @cindex @code{GNAT.Traceback} (@file{g-traceb.ads})
16107 @cindex Trace back facilities
16108
16109 @noindent
16110 Provides a facility for obtaining non-symbolic traceback information, useful
16111 in various debugging situations.
16112
16113 @node GNAT.Traceback.Symbolic (g-trasym.ads)
16114 @section @code{GNAT.Traceback.Symbolic} (@file{g-trasym.ads})
16115 @cindex @code{GNAT.Traceback.Symbolic} (@file{g-trasym.ads})
16116 @cindex Trace back facilities
16117
16118 @node GNAT.UTF_32 (g-utf_32.ads)
16119 @section @code{GNAT.UTF_32} (@file{g-table.ads})
16120 @cindex @code{GNAT.UTF_32} (@file{g-table.ads})
16121 @cindex Wide character codes
16122
16123 @noindent
16124 This is a package intended to be used in conjunction with the
16125 @code{Wide_Character} type in Ada 95 and the
16126 @code{Wide_Wide_Character} type in Ada 2005 (available
16127 in @code{GNAT} in Ada 2005 mode). This package contains
16128 Unicode categorization routines, as well as lexical
16129 categorization routines corresponding to the Ada 2005
16130 lexical rules for identifiers and strings, and also a
16131 lower case to upper case fold routine corresponding to
16132 the Ada 2005 rules for identifier equivalence.
16133
16134 @node GNAT.UTF_32_Spelling_Checker (g-u3spch.ads)
16135 @section @code{GNAT.Wide_Spelling_Checker} (@file{g-u3spch.ads})
16136 @cindex @code{GNAT.Wide_Spelling_Checker} (@file{g-u3spch.ads})
16137 @cindex Spell checking
16138
16139 @noindent
16140 Provides a function for determining whether one wide wide string is a plausible
16141 near misspelling of another wide wide string, where the strings are represented
16142 using the UTF_32_String type defined in System.Wch_Cnv.
16143
16144 @node GNAT.Wide_Spelling_Checker (g-wispch.ads)
16145 @section @code{GNAT.Wide_Spelling_Checker} (@file{g-wispch.ads})
16146 @cindex @code{GNAT.Wide_Spelling_Checker} (@file{g-wispch.ads})
16147 @cindex Spell checking
16148
16149 @noindent
16150 Provides a function for determining whether one wide string is a plausible
16151 near misspelling of another wide string.
16152
16153 @node GNAT.Wide_String_Split (g-wistsp.ads)
16154 @section @code{GNAT.Wide_String_Split} (@file{g-wistsp.ads})
16155 @cindex @code{GNAT.Wide_String_Split} (@file{g-wistsp.ads})
16156 @cindex Wide_String splitter
16157
16158 @noindent
16159 Useful wide string manipulation routines: given a set of separators, split
16160 a wide string wherever the separators appear, and provide direct access
16161 to the resulting slices. This package is instantiated from
16162 @code{GNAT.Array_Split}.
16163
16164 @node GNAT.Wide_Wide_Spelling_Checker (g-zspche.ads)
16165 @section @code{GNAT.Wide_Wide_Spelling_Checker} (@file{g-zspche.ads})
16166 @cindex @code{GNAT.Wide_Wide_Spelling_Checker} (@file{g-zspche.ads})
16167 @cindex Spell checking
16168
16169 @noindent
16170 Provides a function for determining whether one wide wide string is a plausible
16171 near misspelling of another wide wide string.
16172
16173 @node GNAT.Wide_Wide_String_Split (g-zistsp.ads)
16174 @section @code{GNAT.Wide_Wide_String_Split} (@file{g-zistsp.ads})
16175 @cindex @code{GNAT.Wide_Wide_String_Split} (@file{g-zistsp.ads})
16176 @cindex Wide_Wide_String splitter
16177
16178 @noindent
16179 Useful wide wide string manipulation routines: given a set of separators, split
16180 a wide wide string wherever the separators appear, and provide direct access
16181 to the resulting slices. This package is instantiated from
16182 @code{GNAT.Array_Split}.
16183
16184 @node Interfaces.C.Extensions (i-cexten.ads)
16185 @section @code{Interfaces.C.Extensions} (@file{i-cexten.ads})
16186 @cindex @code{Interfaces.C.Extensions} (@file{i-cexten.ads})
16187
16188 @noindent
16189 This package contains additional C-related definitions, intended
16190 for use with either manually or automatically generated bindings
16191 to C libraries.
16192
16193 @node Interfaces.C.Streams (i-cstrea.ads)
16194 @section @code{Interfaces.C.Streams} (@file{i-cstrea.ads})
16195 @cindex @code{Interfaces.C.Streams} (@file{i-cstrea.ads})
16196 @cindex  C streams, interfacing
16197
16198 @noindent
16199 This package is a binding for the most commonly used operations
16200 on C streams.
16201
16202 @node Interfaces.CPP (i-cpp.ads)
16203 @section @code{Interfaces.CPP} (@file{i-cpp.ads})
16204 @cindex @code{Interfaces.CPP} (@file{i-cpp.ads})
16205 @cindex  C++ interfacing
16206 @cindex  Interfacing, to C++
16207
16208 @noindent
16209 This package provides facilities for use in interfacing to C++.  It
16210 is primarily intended to be used in connection with automated tools
16211 for the generation of C++ interfaces.
16212
16213 @node Interfaces.Packed_Decimal (i-pacdec.ads)
16214 @section @code{Interfaces.Packed_Decimal} (@file{i-pacdec.ads})
16215 @cindex @code{Interfaces.Packed_Decimal} (@file{i-pacdec.ads})
16216 @cindex  IBM Packed Format
16217 @cindex  Packed Decimal
16218
16219 @noindent
16220 This package provides a set of routines for conversions to and
16221 from a packed decimal format compatible with that used on IBM
16222 mainframes.
16223
16224 @node Interfaces.VxWorks (i-vxwork.ads)
16225 @section @code{Interfaces.VxWorks} (@file{i-vxwork.ads})
16226 @cindex @code{Interfaces.VxWorks} (@file{i-vxwork.ads})
16227 @cindex Interfacing to VxWorks
16228 @cindex VxWorks, interfacing
16229
16230 @noindent
16231 This package provides a limited binding to the VxWorks API.
16232 In particular, it interfaces with the
16233 VxWorks hardware interrupt facilities.
16234
16235 @node Interfaces.VxWorks.IO (i-vxwoio.ads)
16236 @section @code{Interfaces.VxWorks.IO} (@file{i-vxwoio.ads})
16237 @cindex @code{Interfaces.VxWorks.IO} (@file{i-vxwoio.ads})
16238 @cindex Interfacing to VxWorks' I/O
16239 @cindex VxWorks, I/O interfacing
16240 @cindex VxWorks, Get_Immediate
16241 @cindex Get_Immediate, VxWorks
16242
16243 @noindent
16244 This package provides a binding to the ioctl (IO/Control)
16245 function of VxWorks, defining a set of option values and
16246 function codes. A particular use of this package is
16247 to enable the use of Get_Immediate under VxWorks.
16248
16249 @node System.Address_Image (s-addima.ads)
16250 @section @code{System.Address_Image} (@file{s-addima.ads})
16251 @cindex @code{System.Address_Image} (@file{s-addima.ads})
16252 @cindex Address image
16253 @cindex Image, of an address
16254
16255 @noindent
16256 This function provides a useful debugging
16257 function that gives an (implementation dependent)
16258 string which identifies an address.
16259
16260 @node System.Assertions (s-assert.ads)
16261 @section @code{System.Assertions} (@file{s-assert.ads})
16262 @cindex @code{System.Assertions} (@file{s-assert.ads})
16263 @cindex Assertions
16264 @cindex Assert_Failure, exception
16265
16266 @noindent
16267 This package provides the declaration of the exception raised
16268 by an run-time assertion failure, as well as the routine that
16269 is used internally to raise this assertion.
16270
16271 @node System.Memory (s-memory.ads)
16272 @section @code{System.Memory} (@file{s-memory.ads})
16273 @cindex @code{System.Memory} (@file{s-memory.ads})
16274 @cindex Memory allocation
16275
16276 @noindent
16277 This package provides the interface to the low level routines used
16278 by the generated code for allocation and freeing storage for the
16279 default storage pool (analogous to the C routines malloc and free.
16280 It also provides a reallocation interface analogous to the C routine
16281 realloc. The body of this unit may be modified to provide alternative
16282 allocation mechanisms for the default pool, and in addition, direct
16283 calls to this unit may be made for low level allocation uses (for
16284 example see the body of @code{GNAT.Tables}).
16285
16286 @node System.Partition_Interface (s-parint.ads)
16287 @section @code{System.Partition_Interface} (@file{s-parint.ads})
16288 @cindex @code{System.Partition_Interface} (@file{s-parint.ads})
16289 @cindex Partition interfacing functions
16290
16291 @noindent
16292 This package provides facilities for partition interfacing.  It
16293 is used primarily in a distribution context when using Annex E
16294 with @code{GLADE}.
16295
16296 @node System.Pool_Global (s-pooglo.ads)
16297 @section @code{System.Pool_Global} (@file{s-pooglo.ads})
16298 @cindex @code{System.Pool_Global} (@file{s-pooglo.ads})
16299 @cindex Storage pool, global
16300 @cindex Global storage pool
16301
16302 @noindent
16303 This package provides a storage pool that is equivalent to the default
16304 storage pool used for access types for which no pool is specifically
16305 declared. It uses malloc/free to allocate/free and does not attempt to
16306 do any automatic reclamation.
16307
16308 @node System.Pool_Local (s-pooloc.ads)
16309 @section @code{System.Pool_Local} (@file{s-pooloc.ads})
16310 @cindex @code{System.Pool_Local} (@file{s-pooloc.ads})
16311 @cindex Storage pool, local
16312 @cindex Local storage pool
16313
16314 @noindent
16315 This package provides a storage pool that is intended for use with locally
16316 defined access types. It uses malloc/free for allocate/free, and maintains
16317 a list of allocated blocks, so that all storage allocated for the pool can
16318 be freed automatically when the pool is finalized.
16319
16320 @node System.Restrictions (s-restri.ads)
16321 @section @code{System.Restrictions} (@file{s-restri.ads})
16322 @cindex @code{System.Restrictions} (@file{s-restri.ads})
16323 @cindex Run-time restrictions access
16324
16325 @noindent
16326 This package provides facilities for accessing at run time
16327 the status of restrictions specified at compile time for
16328 the partition. Information is available both with regard
16329 to actual restrictions specified, and with regard to
16330 compiler determined information on which restrictions
16331 are violated by one or more packages in the partition.
16332
16333 @node System.Rident (s-rident.ads)
16334 @section @code{System.Rident} (@file{s-rident.ads})
16335 @cindex @code{System.Rident} (@file{s-rident.ads})
16336 @cindex Restrictions definitions
16337
16338 @noindent
16339 This package provides definitions of the restrictions
16340 identifiers supported by GNAT, and also the format of
16341 the restrictions provided in package System.Restrictions.
16342 It is not normally necessary to @code{with} this generic package
16343 since the necessary instantiation is included in
16344 package System.Restrictions.
16345
16346 @node System.Strings.Stream_Ops (s-ststop.ads)
16347 @section @code{System.Strings.Stream_Ops} (@file{s-ststop.ads})
16348 @cindex @code{System.Strings.Stream_Ops} (@file{s-ststop.ads})
16349 @cindex Stream operations
16350 @cindex String stream operations
16351
16352 @noindent
16353 This package provides a set of stream subprograms for standard string types.
16354 It is intended primarily to support implicit use of such subprograms when
16355 stream attributes are applied to string types, but the subprograms in this
16356 package can be used directly by application programs.
16357
16358 @node System.Task_Info (s-tasinf.ads)
16359 @section @code{System.Task_Info} (@file{s-tasinf.ads})
16360 @cindex @code{System.Task_Info} (@file{s-tasinf.ads})
16361 @cindex Task_Info pragma
16362
16363 @noindent
16364 This package provides target dependent functionality that is used
16365 to support the @code{Task_Info} pragma
16366
16367 @node System.Wch_Cnv (s-wchcnv.ads)
16368 @section @code{System.Wch_Cnv} (@file{s-wchcnv.ads})
16369 @cindex @code{System.Wch_Cnv} (@file{s-wchcnv.ads})
16370 @cindex Wide Character, Representation
16371 @cindex Wide String, Conversion
16372 @cindex Representation of wide characters
16373
16374 @noindent
16375 This package provides routines for converting between
16376 wide and wide wide characters and a representation as a value of type
16377 @code{Standard.String}, using a specified wide character
16378 encoding method.  It uses definitions in
16379 package @code{System.Wch_Con}.
16380
16381 @node System.Wch_Con (s-wchcon.ads)
16382 @section @code{System.Wch_Con} (@file{s-wchcon.ads})
16383 @cindex @code{System.Wch_Con} (@file{s-wchcon.ads})
16384
16385 @noindent
16386 This package provides definitions and descriptions of
16387 the various methods used for encoding wide characters
16388 in ordinary strings.  These definitions are used by
16389 the package @code{System.Wch_Cnv}.
16390
16391 @node Interfacing to Other Languages
16392 @chapter Interfacing to Other Languages
16393 @noindent
16394 The facilities in annex B of the Ada Reference Manual are fully
16395 implemented in GNAT, and in addition, a full interface to C++ is
16396 provided.
16397
16398 @menu
16399 * Interfacing to C::
16400 * Interfacing to C++::
16401 * Interfacing to COBOL::
16402 * Interfacing to Fortran::
16403 * Interfacing to non-GNAT Ada code::
16404 @end menu
16405
16406 @node Interfacing to C
16407 @section Interfacing to C
16408
16409 @noindent
16410 Interfacing to C with GNAT can use one of two approaches:
16411
16412 @itemize @bullet
16413 @item
16414 The types in the package @code{Interfaces.C} may be used.
16415 @item
16416 Standard Ada types may be used directly.  This may be less portable to
16417 other compilers, but will work on all GNAT compilers, which guarantee
16418 correspondence between the C and Ada types.
16419 @end itemize
16420
16421 @noindent
16422 Pragma @code{Convention C} may be applied to Ada types, but mostly has no
16423 effect, since this is the default.  The following table shows the
16424 correspondence between Ada scalar types and the corresponding C types.
16425
16426 @table @code
16427 @item Integer
16428 @code{int}
16429 @item Short_Integer
16430 @code{short}
16431 @item Short_Short_Integer
16432 @code{signed char}
16433 @item Long_Integer
16434 @code{long}
16435 @item Long_Long_Integer
16436 @code{long long}
16437 @item Short_Float
16438 @code{float}
16439 @item Float
16440 @code{float}
16441 @item Long_Float
16442 @code{double}
16443 @item Long_Long_Float
16444 This is the longest floating-point type supported by the hardware.
16445 @end table
16446
16447 @noindent
16448 Additionally, there are the following general correspondences between Ada
16449 and C types:
16450 @itemize @bullet
16451 @item
16452 Ada enumeration types map to C enumeration types directly if pragma
16453 @code{Convention C} is specified, which causes them to have int
16454 length.  Without pragma @code{Convention C}, Ada enumeration types map to
16455 8, 16, or 32 bits (i.e.@: C types @code{signed char}, @code{short},
16456 @code{int}, respectively) depending on the number of values passed.
16457 This is the only case in which pragma @code{Convention C} affects the
16458 representation of an Ada type.
16459
16460 @item
16461 Ada access types map to C pointers, except for the case of pointers to
16462 unconstrained types in Ada, which have no direct C equivalent.
16463
16464 @item
16465 Ada arrays map directly to C arrays.
16466
16467 @item
16468 Ada records map directly to C structures.
16469
16470 @item
16471 Packed Ada records map to C structures where all members are bit fields
16472 of the length corresponding to the @code{@var{type}'Size} value in Ada.
16473 @end itemize
16474
16475 @node Interfacing to C++
16476 @section Interfacing to C++
16477
16478 @noindent
16479 The interface to C++ makes use of the following pragmas, which are
16480 primarily intended to be constructed automatically using a binding generator
16481 tool, although it is possible to construct them by hand.  No suitable binding
16482 generator tool is supplied with GNAT though.
16483
16484 Using these pragmas it is possible to achieve complete
16485 inter-operability between Ada tagged types and C++ class definitions.
16486 See @ref{Implementation Defined Pragmas}, for more details.
16487
16488 @table @code
16489 @item pragma CPP_Class ([Entity =>] @var{LOCAL_NAME})
16490 The argument denotes an entity in the current declarative region that is
16491 declared as a tagged or untagged record type. It indicates that the type
16492 corresponds to an externally declared C++ class type, and is to be laid
16493 out the same way that C++ would lay out the type.
16494
16495 Note: Pragma @code{CPP_Class} is currently obsolete. It is supported
16496 for backward compatibility but its functionality is available
16497 using pragma @code{Import} with @code{Convention} = @code{CPP}.
16498
16499 @item pragma CPP_Constructor ([Entity =>] @var{LOCAL_NAME})
16500 This pragma identifies an imported function (imported in the usual way
16501 with pragma @code{Import}) as corresponding to a C++ constructor.
16502 @end table
16503
16504 @node Interfacing to COBOL
16505 @section Interfacing to COBOL
16506
16507 @noindent
16508 Interfacing to COBOL is achieved as described in section B.4 of
16509 the Ada Reference Manual.
16510
16511 @node Interfacing to Fortran
16512 @section Interfacing to Fortran
16513
16514 @noindent
16515 Interfacing to Fortran is achieved as described in section B.5 of the
16516 Ada Reference Manual.  The pragma @code{Convention Fortran}, applied to a
16517 multi-dimensional array causes the array to be stored in column-major
16518 order as required for convenient interface to Fortran.
16519
16520 @node Interfacing to non-GNAT Ada code
16521 @section Interfacing to non-GNAT Ada code
16522
16523 It is possible to specify the convention @code{Ada} in a pragma
16524 @code{Import} or pragma @code{Export}.  However this refers to
16525 the calling conventions used by GNAT, which may or may not be
16526 similar enough to those used by some other Ada 83 / Ada 95 / Ada 2005
16527 compiler to allow interoperation.
16528
16529 If arguments types are kept simple, and if the foreign compiler generally
16530 follows system calling conventions, then it may be possible to integrate
16531 files compiled by other Ada compilers, provided that the elaboration
16532 issues are adequately addressed (for example by eliminating the
16533 need for any load time elaboration).
16534
16535 In particular, GNAT running on VMS is designed to
16536 be highly compatible with the DEC Ada 83 compiler, so this is one
16537 case in which it is possible to import foreign units of this type,
16538 provided that the data items passed are restricted to simple scalar
16539 values or simple record types without variants, or simple array
16540 types with fixed bounds.
16541
16542 @node Specialized Needs Annexes
16543 @chapter Specialized Needs Annexes
16544
16545 @noindent
16546 Ada 95 and Ada 2005 define a number of Specialized Needs Annexes, which are not
16547 required in all implementations.  However, as described in this chapter,
16548 GNAT implements all of these annexes:
16549
16550 @table @asis
16551 @item Systems Programming (Annex C)
16552 The Systems Programming Annex is fully implemented.
16553
16554 @item Real-Time Systems (Annex D)
16555 The Real-Time Systems Annex is fully implemented.
16556
16557 @item Distributed Systems (Annex E)
16558 Stub generation is fully implemented in the GNAT compiler.  In addition,
16559 a complete compatible PCS is available as part of the GLADE system,
16560 a separate product.  When the two
16561 products are used in conjunction, this annex is fully implemented.
16562
16563 @item Information Systems (Annex F)
16564 The Information Systems annex is fully implemented.
16565
16566 @item Numerics (Annex G)
16567 The Numerics Annex is fully implemented.
16568
16569 @item Safety and Security / High-Integrity Systems (Annex H)
16570 The Safety and Security Annex (termed the High-Integrity Systems Annex
16571 in Ada 2005) is fully implemented.
16572 @end table
16573
16574 @node Implementation of Specific Ada Features
16575 @chapter Implementation of Specific Ada Features
16576
16577 @noindent
16578 This chapter describes the GNAT implementation of several Ada language
16579 facilities.
16580
16581 @menu
16582 * Machine Code Insertions::
16583 * GNAT Implementation of Tasking::
16584 * GNAT Implementation of Shared Passive Packages::
16585 * Code Generation for Array Aggregates::
16586 * The Size of Discriminated Records with Default Discriminants::
16587 * Strict Conformance to the Ada Reference Manual::
16588 @end menu
16589
16590 @node Machine Code Insertions
16591 @section Machine Code Insertions
16592 @cindex Machine Code insertions
16593
16594 @noindent
16595 Package @code{Machine_Code} provides machine code support as described
16596 in the Ada Reference Manual in two separate forms:
16597 @itemize @bullet
16598 @item
16599 Machine code statements, consisting of qualified expressions that
16600 fit the requirements of RM section 13.8.
16601 @item
16602 An intrinsic callable procedure, providing an alternative mechanism of
16603 including machine instructions in a subprogram.
16604 @end itemize
16605
16606 @noindent
16607 The two features are similar, and both are closely related to the mechanism
16608 provided by the asm instruction in the GNU C compiler.  Full understanding
16609 and use of the facilities in this package requires understanding the asm
16610 instruction, see @ref{Extended Asm,, Assembler Instructions with C Expression
16611 Operands, gcc, Using the GNU Compiler Collection (GCC)}.
16612
16613 Calls to the function @code{Asm} and the procedure @code{Asm} have identical
16614 semantic restrictions and effects as described below.  Both are provided so
16615 that the procedure call can be used as a statement, and the function call
16616 can be used to form a code_statement.
16617
16618 The first example given in the GCC documentation is the C @code{asm}
16619 instruction:
16620 @smallexample
16621    asm ("fsinx %1 %0" : "=f" (result) : "f" (angle));
16622 @end smallexample
16623
16624 @noindent
16625 The equivalent can be written for GNAT as:
16626
16627 @smallexample @c ada
16628 Asm ("fsinx %1 %0",
16629      My_Float'Asm_Output ("=f", result),
16630      My_Float'Asm_Input  ("f",  angle));
16631 @end smallexample
16632
16633 @noindent
16634 The first argument to @code{Asm} is the assembler template, and is
16635 identical to what is used in GNU C@.  This string must be a static
16636 expression.  The second argument is the output operand list.  It is
16637 either a single @code{Asm_Output} attribute reference, or a list of such
16638 references enclosed in parentheses (technically an array aggregate of
16639 such references).
16640
16641 The @code{Asm_Output} attribute denotes a function that takes two
16642 parameters.  The first is a string, the second is the name of a variable
16643 of the type designated by the attribute prefix.  The first (string)
16644 argument is required to be a static expression and designates the
16645 constraint for the parameter (e.g.@: what kind of register is
16646 required).  The second argument is the variable to be updated with the
16647 result.  The possible values for constraint are the same as those used in
16648 the RTL, and are dependent on the configuration file used to build the
16649 GCC back end.  If there are no output operands, then this argument may
16650 either be omitted, or explicitly given as @code{No_Output_Operands}.
16651
16652 The second argument of @code{@var{my_float}'Asm_Output} functions as
16653 though it were an @code{out} parameter, which is a little curious, but
16654 all names have the form of expressions, so there is no syntactic
16655 irregularity, even though normally functions would not be permitted
16656 @code{out} parameters.  The third argument is the list of input
16657 operands.  It is either a single @code{Asm_Input} attribute reference, or
16658 a list of such references enclosed in parentheses (technically an array
16659 aggregate of such references).
16660
16661 The @code{Asm_Input} attribute denotes a function that takes two
16662 parameters.  The first is a string, the second is an expression of the
16663 type designated by the prefix.  The first (string) argument is required
16664 to be a static expression, and is the constraint for the parameter,
16665 (e.g.@: what kind of register is required).  The second argument is the
16666 value to be used as the input argument.  The possible values for the
16667 constant are the same as those used in the RTL, and are dependent on
16668 the configuration file used to built the GCC back end.
16669
16670 If there are no input operands, this argument may either be omitted, or
16671 explicitly given as @code{No_Input_Operands}.  The fourth argument, not
16672 present in the above example, is a list of register names, called the
16673 @dfn{clobber} argument.  This argument, if given, must be a static string
16674 expression, and is a space or comma separated list of names of registers
16675 that must be considered destroyed as a result of the @code{Asm} call.  If
16676 this argument is the null string (the default value), then the code
16677 generator assumes that no additional registers are destroyed.
16678
16679 The fifth argument, not present in the above example, called the
16680 @dfn{volatile} argument, is by default @code{False}.  It can be set to
16681 the literal value @code{True} to indicate to the code generator that all
16682 optimizations with respect to the instruction specified should be
16683 suppressed, and that in particular, for an instruction that has outputs,
16684 the instruction will still be generated, even if none of the outputs are
16685 used.  @xref{Extended Asm,, Assembler Instructions with C Expression Operands,
16686 gcc, Using the GNU Compiler Collection (GCC)}, for the full description.
16687 Generally it is strongly advisable to use Volatile for any ASM statement
16688 that is missing either input or output operands, or when two or more ASM
16689 statements appear in sequence, to avoid unwanted optimizations. A warning
16690 is generated if this advice is not followed.
16691
16692 The @code{Asm} subprograms may be used in two ways.  First the procedure
16693 forms can be used anywhere a procedure call would be valid, and
16694 correspond to what the RM calls ``intrinsic'' routines.  Such calls can
16695 be used to intersperse machine instructions with other Ada statements.
16696 Second, the function forms, which return a dummy value of the limited
16697 private type @code{Asm_Insn}, can be used in code statements, and indeed
16698 this is the only context where such calls are allowed.  Code statements
16699 appear as aggregates of the form:
16700
16701 @smallexample @c ada
16702 Asm_Insn'(Asm (@dots{}));
16703 Asm_Insn'(Asm_Volatile (@dots{}));
16704 @end smallexample
16705
16706 @noindent
16707 In accordance with RM rules, such code statements are allowed only
16708 within subprograms whose entire body consists of such statements.  It is
16709 not permissible to intermix such statements with other Ada statements.
16710
16711 Typically the form using intrinsic procedure calls is more convenient
16712 and more flexible.  The code statement form is provided to meet the RM
16713 suggestion that such a facility should be made available.  The following
16714 is the exact syntax of the call to @code{Asm}. As usual, if named notation
16715 is used, the arguments may be given in arbitrary order, following the
16716 normal rules for use of positional and named arguments)
16717
16718 @smallexample
16719 ASM_CALL ::= Asm (
16720                  [Template =>] static_string_EXPRESSION
16721                [,[Outputs  =>] OUTPUT_OPERAND_LIST      ]
16722                [,[Inputs   =>] INPUT_OPERAND_LIST       ]
16723                [,[Clobber  =>] static_string_EXPRESSION ]
16724                [,[Volatile =>] static_boolean_EXPRESSION] )
16725
16726 OUTPUT_OPERAND_LIST ::=
16727   [PREFIX.]No_Output_Operands
16728 | OUTPUT_OPERAND_ATTRIBUTE
16729 | (OUTPUT_OPERAND_ATTRIBUTE @{,OUTPUT_OPERAND_ATTRIBUTE@})
16730
16731 OUTPUT_OPERAND_ATTRIBUTE ::=
16732   SUBTYPE_MARK'Asm_Output (static_string_EXPRESSION, NAME)
16733
16734 INPUT_OPERAND_LIST ::=
16735   [PREFIX.]No_Input_Operands
16736 | INPUT_OPERAND_ATTRIBUTE
16737 | (INPUT_OPERAND_ATTRIBUTE @{,INPUT_OPERAND_ATTRIBUTE@})
16738
16739 INPUT_OPERAND_ATTRIBUTE ::=
16740   SUBTYPE_MARK'Asm_Input (static_string_EXPRESSION, EXPRESSION)
16741 @end smallexample
16742
16743 @noindent
16744 The identifiers @code{No_Input_Operands} and @code{No_Output_Operands}
16745 are declared in the package @code{Machine_Code} and must be referenced
16746 according to normal visibility rules. In particular if there is no
16747 @code{use} clause for this package, then appropriate package name
16748 qualification is required.
16749
16750 @node GNAT Implementation of Tasking
16751 @section GNAT Implementation of Tasking
16752
16753 @noindent
16754 This chapter outlines the basic GNAT approach to tasking (in particular,
16755 a multi-layered library for portability) and discusses issues related
16756 to compliance with the Real-Time Systems Annex.
16757
16758 @menu
16759 * Mapping Ada Tasks onto the Underlying Kernel Threads::
16760 * Ensuring Compliance with the Real-Time Annex::
16761 @end menu
16762
16763 @node Mapping Ada Tasks onto the Underlying Kernel Threads
16764 @subsection Mapping Ada Tasks onto the Underlying Kernel Threads
16765
16766 @noindent
16767 GNAT's run-time support comprises two layers:
16768
16769 @itemize @bullet
16770 @item GNARL (GNAT Run-time Layer)
16771 @item GNULL (GNAT Low-level Library)
16772 @end itemize
16773
16774 @noindent
16775 In GNAT, Ada's tasking services rely on a platform and OS independent
16776 layer known as GNARL@.  This code is responsible for implementing the
16777 correct semantics of Ada's task creation, rendezvous, protected
16778 operations etc.
16779
16780 GNARL decomposes Ada's tasking semantics into simpler lower level
16781 operations such as create a thread, set the priority of a thread,
16782 yield, create a lock, lock/unlock, etc.  The spec for these low-level
16783 operations constitutes GNULLI, the GNULL Interface.  This interface is
16784 directly inspired from the POSIX real-time API@.
16785
16786 If the underlying executive or OS implements the POSIX standard
16787 faithfully, the GNULL Interface maps as is to the services offered by
16788 the underlying kernel.  Otherwise, some target dependent glue code maps
16789 the services offered by the underlying kernel to the semantics expected
16790 by GNARL@.
16791
16792 Whatever the underlying OS (VxWorks, UNIX, Windows, etc.) the
16793 key point is that each Ada task is mapped on a thread in the underlying
16794 kernel.  For example, in the case of VxWorks, one Ada task = one VxWorks task.
16795
16796 In addition Ada task priorities map onto the underlying thread priorities.
16797 Mapping Ada tasks onto the underlying kernel threads has several advantages:
16798
16799 @itemize @bullet
16800 @item
16801 The underlying scheduler is used to schedule the Ada tasks.  This
16802 makes Ada tasks as efficient as kernel threads from a scheduling
16803 standpoint.
16804
16805 @item
16806 Interaction with code written in C containing threads is eased
16807 since at the lowest level Ada tasks and C threads map onto the same
16808 underlying kernel concept.
16809
16810 @item
16811 When an Ada task is blocked during I/O the remaining Ada tasks are
16812 able to proceed.
16813
16814 @item
16815 On multiprocessor systems Ada tasks can execute in parallel.
16816 @end itemize
16817
16818 @noindent
16819 Some threads libraries offer a mechanism to fork a new process, with the
16820 child process duplicating the threads from the parent.
16821 GNAT does not
16822 support this functionality when the parent contains more than one task.
16823 @cindex Forking a new process
16824
16825 @node Ensuring Compliance with the Real-Time Annex
16826 @subsection Ensuring Compliance with the Real-Time Annex
16827 @cindex Real-Time Systems Annex compliance
16828
16829 @noindent
16830 Although mapping Ada tasks onto
16831 the underlying threads has significant advantages, it does create some
16832 complications when it comes to respecting the scheduling semantics
16833 specified in the real-time annex (Annex D).
16834
16835 For instance the Annex D requirement for the @code{FIFO_Within_Priorities}
16836 scheduling policy states:
16837
16838 @quotation
16839 @emph{When the active priority of a ready task that is not running
16840 changes, or the setting of its base priority takes effect, the
16841 task is removed from the ready queue for its old active priority
16842 and is added at the tail of the ready queue for its new active
16843 priority, except in the case where the active priority is lowered
16844 due to the loss of inherited priority, in which case the task is
16845 added at the head of the ready queue for its new active priority.}
16846 @end quotation
16847
16848 @noindent
16849 While most kernels do put tasks at the end of the priority queue when
16850 a task changes its priority, (which respects the main
16851 FIFO_Within_Priorities requirement), almost none keep a thread at the
16852 beginning of its priority queue when its priority drops from the loss
16853 of inherited priority.
16854
16855 As a result most vendors have provided incomplete Annex D implementations.
16856
16857 The GNAT run-time, has a nice cooperative solution to this problem
16858 which ensures that accurate FIFO_Within_Priorities semantics are
16859 respected.
16860
16861 The principle is as follows.  When an Ada task T is about to start
16862 running, it checks whether some other Ada task R with the same
16863 priority as T has been suspended due to the loss of priority
16864 inheritance.  If this is the case, T yields and is placed at the end of
16865 its priority queue.  When R arrives at the front of the queue it
16866 executes.
16867
16868 Note that this simple scheme preserves the relative order of the tasks
16869 that were ready to execute in the priority queue where R has been
16870 placed at the end.
16871
16872 @node GNAT Implementation of Shared Passive Packages
16873 @section GNAT Implementation of Shared Passive Packages
16874 @cindex Shared passive packages
16875
16876 @noindent
16877 GNAT fully implements the pragma @code{Shared_Passive} for
16878 @cindex pragma @code{Shared_Passive}
16879 the purpose of designating shared passive packages.
16880 This allows the use of passive partitions in the
16881 context described in the Ada Reference Manual; i.e., for communication
16882 between separate partitions of a distributed application using the
16883 features in Annex E.
16884 @cindex Annex E
16885 @cindex Distribution Systems Annex
16886
16887 However, the implementation approach used by GNAT provides for more
16888 extensive usage as follows:
16889
16890 @table @emph
16891 @item Communication between separate programs
16892
16893 This allows separate programs to access the data in passive
16894 partitions, using protected objects for synchronization where
16895 needed. The only requirement is that the two programs have a
16896 common shared file system. It is even possible for programs
16897 running on different machines with different architectures
16898 (e.g.@: different endianness) to communicate via the data in
16899 a passive partition.
16900
16901 @item Persistence between program runs
16902
16903 The data in a passive package can persist from one run of a
16904 program to another, so that a later program sees the final
16905 values stored by a previous run of the same program.
16906
16907 @end table
16908
16909 @noindent
16910 The implementation approach used is to store the data in files. A
16911 separate stream file is created for each object in the package, and
16912 an access to an object causes the corresponding file to be read or
16913 written.
16914
16915 The environment variable @code{SHARED_MEMORY_DIRECTORY} should be
16916 @cindex @code{SHARED_MEMORY_DIRECTORY} environment variable
16917 set to the directory to be used for these files.
16918 The files in this directory
16919 have names that correspond to their fully qualified names. For
16920 example, if we have the package
16921
16922 @smallexample @c ada
16923 package X is
16924   pragma Shared_Passive (X);
16925   Y : Integer;
16926   Z : Float;
16927 end X;
16928 @end smallexample
16929
16930 @noindent
16931 and the environment variable is set to @code{/stemp/}, then the files created
16932 will have the names:
16933
16934 @smallexample
16935 /stemp/x.y
16936 /stemp/x.z
16937 @end smallexample
16938
16939 @noindent
16940 These files are created when a value is initially written to the object, and
16941 the files are retained until manually deleted. This provides the persistence
16942 semantics. If no file exists, it means that no partition has assigned a value
16943 to the variable; in this case the initial value declared in the package
16944 will be used. This model ensures that there are no issues in synchronizing
16945 the elaboration process, since elaboration of passive packages elaborates the
16946 initial values, but does not create the files.
16947
16948 The files are written using normal @code{Stream_IO} access.
16949 If you want to be able
16950 to communicate between programs or partitions running on different
16951 architectures, then you should use the XDR versions of the stream attribute
16952 routines, since these are architecture independent.
16953
16954 If active synchronization is required for access to the variables in the
16955 shared passive package, then as described in the Ada Reference Manual, the
16956 package may contain protected objects used for this purpose. In this case
16957 a lock file (whose name is @file{___lock} (three underscores)
16958 is created in the shared memory directory.
16959 @cindex @file{___lock} file (for shared passive packages)
16960 This is used to provide the required locking
16961 semantics for proper protected object synchronization.
16962
16963 As of January 2003, GNAT supports shared passive packages on all platforms
16964 except for OpenVMS.
16965
16966 @node Code Generation for Array Aggregates
16967 @section Code Generation for Array Aggregates
16968
16969 @menu
16970 * Static constant aggregates with static bounds::
16971 * Constant aggregates with unconstrained nominal types::
16972 * Aggregates with static bounds::
16973 * Aggregates with non-static bounds::
16974 * Aggregates in assignment statements::
16975 @end menu
16976
16977 @noindent
16978 Aggregates have a rich syntax and allow the user to specify the values of
16979 complex data structures by means of a single construct.  As a result, the
16980 code generated for aggregates can be quite complex and involve loops, case
16981 statements and multiple assignments.  In the simplest cases, however, the
16982 compiler will recognize aggregates whose components and constraints are
16983 fully static, and in those cases the compiler will generate little or no
16984 executable code.  The following is an outline of the code that GNAT generates
16985 for various aggregate constructs.  For further details, you will find it
16986 useful to examine the output produced by the -gnatG flag to see the expanded
16987 source that is input to the code generator.  You may also want to examine
16988 the assembly code generated at various levels of optimization.
16989
16990 The code generated for aggregates depends on the context, the component values,
16991 and the type.  In the context of an object declaration the code generated is
16992 generally simpler than in the case of an assignment.  As a general rule, static
16993 component values and static subtypes also lead to simpler code.
16994
16995 @node Static constant aggregates with static bounds
16996 @subsection Static constant aggregates with static bounds
16997
16998 @noindent
16999 For the declarations:
17000 @smallexample @c ada
17001     type One_Dim is array (1..10) of integer;
17002     ar0 : constant One_Dim := (1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
17003 @end smallexample
17004
17005 @noindent
17006 GNAT generates no executable code: the constant ar0 is placed in static memory.
17007 The same is true for constant aggregates with named associations:
17008
17009 @smallexample @c ada
17010     Cr1 : constant One_Dim := (4 => 16, 2 => 4, 3 => 9, 1 => 1, 5 .. 10 => 0);
17011     Cr3 : constant One_Dim := (others => 7777);
17012 @end smallexample
17013
17014 @noindent
17015 The same is true for multidimensional constant arrays such as:
17016
17017 @smallexample @c ada
17018     type two_dim is array (1..3, 1..3) of integer;
17019     Unit : constant two_dim := ( (1,0,0), (0,1,0), (0,0,1));
17020 @end smallexample
17021
17022 @noindent
17023 The same is true for arrays of one-dimensional arrays: the following are
17024 static:
17025
17026 @smallexample @c ada
17027 type ar1b  is array (1..3) of boolean;
17028 type ar_ar is array (1..3) of ar1b;
17029 None  : constant ar1b := (others => false);     --  fully static
17030 None2 : constant ar_ar := (1..3 => None);       --  fully static
17031 @end smallexample
17032
17033 @noindent
17034 However, for multidimensional aggregates with named associations, GNAT will
17035 generate assignments and loops, even if all associations are static.  The
17036 following two declarations generate a loop for the first dimension, and
17037 individual component assignments for the second dimension:
17038
17039 @smallexample @c ada
17040 Zero1: constant two_dim := (1..3 => (1..3 => 0));
17041 Zero2: constant two_dim := (others => (others => 0));
17042 @end smallexample
17043
17044 @node Constant aggregates with unconstrained nominal types
17045 @subsection Constant aggregates with unconstrained nominal types
17046
17047 @noindent
17048 In such cases the aggregate itself establishes the subtype, so that
17049 associations with @code{others} cannot be used.  GNAT determines the
17050 bounds for the actual subtype of the aggregate, and allocates the
17051 aggregate statically as well.  No code is generated for the following:
17052
17053 @smallexample @c ada
17054     type One_Unc is array (natural range <>) of integer;
17055     Cr_Unc : constant One_Unc := (12,24,36);
17056 @end smallexample
17057
17058 @node Aggregates with static bounds
17059 @subsection Aggregates with static bounds
17060
17061 @noindent
17062 In all previous examples the aggregate was the initial (and immutable) value
17063 of a constant.  If the aggregate initializes a variable, then code is generated
17064 for it as a combination of individual assignments and loops over the target
17065 object.  The declarations
17066
17067 @smallexample @c ada
17068        Cr_Var1 : One_Dim := (2, 5, 7, 11, 0, 0, 0, 0, 0, 0);
17069        Cr_Var2 : One_Dim := (others > -1);
17070 @end smallexample
17071
17072 @noindent
17073 generate the equivalent of
17074
17075 @smallexample @c ada
17076        Cr_Var1 (1) := 2;
17077        Cr_Var1 (2) := 3;
17078        Cr_Var1 (3) := 5;
17079        Cr_Var1 (4) := 11;
17080
17081        for I in Cr_Var2'range loop
17082           Cr_Var2 (I) := -1;
17083        end loop;
17084 @end smallexample
17085
17086 @node Aggregates with non-static bounds
17087 @subsection Aggregates with non-static bounds
17088
17089 @noindent
17090 If the bounds of the aggregate are not statically compatible with the bounds
17091 of the nominal subtype  of the target, then constraint checks have to be
17092 generated on the bounds.  For a multidimensional array, constraint checks may
17093 have to be applied to sub-arrays individually, if they do not have statically
17094 compatible subtypes.
17095
17096 @node Aggregates in assignment statements
17097 @subsection Aggregates in assignment statements
17098
17099 @noindent
17100 In general, aggregate assignment requires the construction of a temporary,
17101 and a copy from the temporary to the target of the assignment.  This is because
17102 it is not always possible to convert the assignment into a series of individual
17103 component assignments.  For example, consider the simple case:
17104
17105 @smallexample @c ada
17106         A := (A(2), A(1));
17107 @end smallexample
17108
17109 @noindent
17110 This cannot be converted into:
17111
17112 @smallexample @c ada
17113         A(1) := A(2);
17114         A(2) := A(1);
17115 @end smallexample
17116
17117 @noindent
17118 So the aggregate has to be built first in a separate location, and then
17119 copied into the target.  GNAT recognizes simple cases where this intermediate
17120 step is not required, and the assignments can be performed in place, directly
17121 into the target.  The following sufficient criteria are applied:
17122
17123 @itemize @bullet
17124 @item
17125 The bounds of the aggregate are static, and the associations are static.
17126 @item
17127 The components of the aggregate are static constants, names of
17128 simple variables that are not renamings, or expressions not involving
17129 indexed components whose operands obey these rules.
17130 @end itemize
17131
17132 @noindent
17133 If any of these conditions are violated, the aggregate will be built in
17134 a temporary (created either by the front-end or the code generator) and then
17135 that temporary will be copied onto the target.
17136
17137 @node The Size of Discriminated Records with Default Discriminants
17138 @section The Size of Discriminated Records with Default Discriminants
17139
17140 @noindent
17141 If a discriminated type @code{T} has discriminants with default values, it is
17142 possible to declare an object of this type without providing an explicit
17143 constraint:
17144
17145 @smallexample @c ada
17146 @group
17147 type Size is range 1..100;
17148
17149 type Rec (D : Size := 15) is record
17150    Name : String (1..D);
17151 end T;
17152
17153 Word : Rec;
17154 @end group
17155 @end smallexample
17156
17157 @noindent
17158 Such an object is said to be @emph{unconstrained}.
17159 The discriminant of the object
17160 can be modified by a full assignment to the object, as long as it preserves the
17161 relation between the value of the discriminant, and the value of the components
17162 that depend on it:
17163
17164 @smallexample @c ada
17165 @group
17166 Word := (3, "yes");
17167
17168 Word := (5, "maybe");
17169
17170 Word := (5, "no"); -- raises Constraint_Error
17171 @end group
17172 @end smallexample
17173
17174 @noindent
17175 In order to support this behavior efficiently, an unconstrained object is
17176 given the maximum size that any value of the type requires. In the case
17177 above, @code{Word} has storage for the discriminant and for
17178 a @code{String} of length 100.
17179 It is important to note that unconstrained objects do not require dynamic
17180 allocation. It would be an improper implementation to place on the heap those
17181 components whose size depends on discriminants. (This improper implementation
17182 was used by some Ada83 compilers, where the @code{Name} component above
17183 would have
17184 been stored as a pointer to a dynamic string). Following the principle that
17185 dynamic storage management should never be introduced implicitly,
17186 an Ada compiler should reserve the full size for an unconstrained declared
17187 object, and place it on the stack.
17188
17189 This maximum size approach
17190 has been a source of surprise to some users, who expect the default
17191 values of the discriminants to determine the size reserved for an
17192 unconstrained object: ``If the default is 15, why should the object occupy
17193 a larger size?''
17194 The answer, of course, is that the discriminant may be later modified,
17195 and its full range of values must be taken into account. This is why the
17196 declaration:
17197
17198 @smallexample
17199 @group
17200 type Rec (D : Positive := 15) is record
17201    Name : String (1..D);
17202 end record;
17203
17204 Too_Large : Rec;
17205 @end group
17206 @end smallexample
17207
17208 @noindent
17209 is flagged by the compiler with a warning:
17210 an attempt to create @code{Too_Large} will raise @code{Storage_Error},
17211 because the required size includes @code{Positive'Last}
17212 bytes. As the first example indicates, the proper approach is to declare an
17213 index type of ``reasonable'' range so that unconstrained objects are not too
17214 large.
17215
17216 One final wrinkle: if the object is declared to be @code{aliased}, or if it is
17217 created in the heap by means of an allocator, then it is @emph{not}
17218 unconstrained:
17219 it is constrained by the default values of the discriminants, and those values
17220 cannot be modified by full assignment. This is because in the presence of
17221 aliasing all views of the object (which may be manipulated by different tasks,
17222 say) must be consistent, so it is imperative that the object, once created,
17223 remain invariant.
17224
17225 @node Strict Conformance to the Ada Reference Manual
17226 @section Strict Conformance to the Ada Reference Manual
17227
17228 @noindent
17229 The dynamic semantics defined by the Ada Reference Manual impose a set of
17230 run-time checks to be generated. By default, the GNAT compiler will insert many
17231 run-time checks into the compiled code, including most of those required by the
17232 Ada Reference Manual. However, there are three checks that are not enabled
17233 in the default mode for efficiency reasons: arithmetic overflow checking for
17234 integer operations (including division by zero), checks for access before
17235 elaboration on subprogram calls, and stack overflow checking (most operating
17236 systems do not perform this check by default).
17237
17238 Strict conformance to the Ada Reference Manual can be achieved by adding
17239 three compiler options for overflow checking for integer operations
17240 (@option{-gnato}), dynamic checks for access-before-elaboration on subprogram
17241 calls and generic instantiations (@option{-gnatE}), and stack overflow
17242 checking (@option{-fstack-check}).
17243
17244 Note that the result of a floating point arithmetic operation in overflow and
17245 invalid situations, when the @code{Machine_Overflows} attribute of the result
17246 type is @code{False}, is to generate IEEE NaN and infinite values. This is the
17247 case for machines compliant with the IEEE floating-point standard, but on
17248 machines that are not fully compliant with this standard, such as Alpha, the
17249 @option{-mieee} compiler flag must be used for achieving IEEE confirming
17250 behavior (although at the cost of a significant performance penalty), so
17251 infinite and NaN values are properly generated.
17252
17253
17254 @node Implementation of Ada 2012 Features
17255 @chapter Implementation of Ada 2012 Features
17256 @cindex Ada 2012 implementation status
17257
17258 This chapter contains a complete list of Ada 2012 features that have been
17259 implemented as of GNAT version 6.4. Generally, these features are only
17260 available if the @option{-gnat12} (Ada 2012 features enabled) flag is set
17261 @cindex @option{-gnat12} option
17262 or if the configuration pragma @code{Ada_2012} is used.
17263 @cindex pragma @code{Ada_2012}
17264 @cindex configuration pragma @code{Ada_2012}
17265 @cindex @code{Ada_2012} configuration pragma
17266 However, new pragmas, attributes, and restrictions are
17267 unconditionally available, since the Ada 95 standard allows the addition of
17268 new pragmas, attributes, and restrictions (there are exceptions, which are
17269 documented in the individual descriptions), and also certain packages
17270 were made available in earlier versions of Ada.
17271
17272 An ISO date (YYYY-MM-DD) appears in parentheses on the description line.
17273 This date shows the implementation date of the feature. Any wavefront
17274 subsequent to this date will contain the indicated feature, as will any
17275 subsequent releases. A date of 0000-00-00 means that GNAT has always
17276 implemented the feature, or implemented it as soon as it appeared as a
17277 binding interpretation.
17278
17279 Each feature corresponds to an Ada Issue (``AI'') approved by the Ada
17280 standardization group (ISO/IEC JTC1/SC22/WG9) for inclusion in Ada 2012.
17281 The features are ordered based on the relevant sections of the Ada
17282 Reference Manual (``RM'').  When a given AI relates to multiple points
17283 in the RM, the earliest is used.
17284
17285 A complete description of the AIs may be found in
17286 @url{www.ada-auth.org/ai05-summary.html}.
17287
17288 @itemize @bullet
17289
17290 @item
17291 @emph{AI-0176 Quantified expressions (2010-09-29)}
17292 @cindex AI-0176 (Ada 2012 feature)
17293
17294 @noindent
17295   Both universally and existentially quantified expressions are implemented.
17296   They use the new syntax for iterators proposed in AI05-139-2, as well as
17297   the standard Ada loop syntax.
17298
17299 @noindent
17300   RM References:  1.01.04 (12)   2.09 (2/2)   4.04 (7)   4.05.09 (0)
17301
17302 @item
17303 @emph{AI-0079 Allow @i{other_format} characters in source (2010-07-10)}
17304 @cindex AI-0079 (Ada 2012 feature)
17305
17306 @noindent
17307   Wide characters in the unicode category @i{other_format} are now allowed in
17308   source programs between tokens, but not within a token such as an identifier.
17309
17310 @noindent
17311   RM References:  2.01 (4/2)   2.02 (7)
17312
17313 @item
17314 @emph{AI-0091 Do not allow @i{other_format} in identifiers (0000-00-00)}
17315 @cindex AI-0091 (Ada 2012 feature)
17316
17317 @noindent
17318   Wide characters in the unicode category @i{other_format} are not permitted
17319   within  an identifier, since this can be a security problem. The error
17320   message for this case has been improved to be more specific, but GNAT has
17321   never allowed such characters to appear in identifiers.
17322
17323 @noindent
17324   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)
17325
17326 @item
17327 @emph{AI-0100 Placement of pragmas  (2010-07-01)}
17328 @cindex AI-0100 (Ada 2012 feature)
17329
17330 @noindent
17331   This AI is an earlier version of AI-163. It simplifies the rules
17332   for legal placement of pragmas. In the case of lists that allow pragmas, if
17333   the list may have no elements, then the list may consist solely of pragmas.
17334
17335 @noindent
17336   RM References:  2.08 (7)
17337
17338 @item
17339 @emph{AI-0163 Pragmas in place of null (2010-07-01)}
17340 @cindex AI-0163 (Ada 2012 feature)
17341
17342 @noindent
17343   A statement sequence may be composed entirely of pragmas. It is no longer
17344   necessary to add a dummy @code{null} statement to make the sequence legal.
17345
17346 @noindent
17347   RM References:  2.08 (7)   2.08 (16)
17348
17349
17350 @item
17351 @emph{AI-0080 ``View of'' not needed if clear from context (0000-00-00)}
17352 @cindex AI-0080 (Ada 2012 feature)
17353
17354 @noindent
17355   This is an editorial change only, described as non-testable in the AI.
17356
17357 @noindent
17358   RM References:  3.01 (7)
17359
17360
17361 @item
17362 @emph{AI-0183 Aspect specifications (2010-08-16)}
17363 @cindex AI-0183 (Ada 2012 feature)
17364
17365 @noindent
17366   Aspect specifications have been fully implemented except for pre and post-
17367   conditions, and type invariants, which have their own separate AI's. All
17368   forms of declarations listed in the AI are supported. The following is a
17369   list of the aspects supported (with GNAT implementation aspects marked)
17370
17371 @multitable {@code{Preelaborable_Initialization}} {--GNAT}
17372 @item @code{Ada_2005} @tab                      -- GNAT
17373 @item @code{Ada_2012} @tab                      -- GNAT
17374 @item @code{Address} @tab
17375 @item @code{Alignment} @tab
17376 @item @code{Atomic} @tab
17377 @item @code{Atomic_Components} @tab
17378 @item @code{Bit_Order} @tab
17379 @item @code{Component_Size} @tab
17380 @item @code{Discard_Names} @tab
17381 @item @code{External_Tag} @tab
17382 @item @code{Favor_Top_Level} @tab               -- GNAT
17383 @item @code{Inline} @tab
17384 @item @code{Inline_Always} @tab                 -- GNAT
17385 @item @code{Invariant} @tab
17386 @item @code{Machine_Radix} @tab
17387 @item @code{No_Return} @tab
17388 @item @code{Object_Size} @tab                   -- GNAT
17389 @item @code{Pack} @tab
17390 @item @code{Persistent_BSS} @tab                -- GNAT
17391 @item @code{Post} @tab
17392 @item @code{Pre} @tab
17393 @item @code{Predicate} @tab
17394 @item @code{Preelaborable_Initialization} @tab
17395 @item @code{Pure_Function} @tab                 -- GNAT
17396 @item @code{Remote_Access_Type} @tab            -- GNAT
17397 @item @code{Shared} @tab                        -- GNAT
17398 @item @code{Size} @tab
17399 @item @code{Storage_Pool} @tab
17400 @item @code{Storage_Size} @tab
17401 @item @code{Stream_Size} @tab
17402 @item @code{Suppress} @tab
17403 @item @code{Suppress_Debug_Info} @tab           -- GNAT
17404 @item @code{Test_Case} @tab                     -- GNAT
17405 @item @code{Unchecked_Union} @tab
17406 @item @code{Universal_Aliasing} @tab            -- GNAT
17407 @item @code{Unmodified} @tab                    -- GNAT
17408 @item @code{Unreferenced} @tab                  -- GNAT
17409 @item @code{Unreferenced_Objects} @tab          -- GNAT
17410 @item @code{Unsuppress} @tab
17411 @item @code{Value_Size} @tab                    -- GNAT
17412 @item @code{Volatile} @tab
17413 @item @code{Volatile_Components}
17414 @item @code{Warnings} @tab                      -- GNAT
17415 @end multitable
17416
17417 @noindent
17418   Note that for aspects with an expression, e.g. @code{Size}, the expression is
17419   treated like a default expression (visibility is analyzed at the point of
17420   occurrence of the aspect, but evaluation of the expression occurs at the
17421   freeze point of the entity involved.
17422
17423 @noindent
17424   RM References:  3.02.01 (3)   3.02.02 (2)   3.03.01 (2/2)   3.08 (6)
17425   3.09.03 (1.1/2)   6.01 (2/2)   6.07 (2/2)   9.05.02 (2/2)   7.01 (3)   7.03
17426   (2)   7.03 (3)   9.01 (2/2)   9.01 (3/2)   9.04 (2/2)   9.04 (3/2)
17427   9.05.02 (2/2)   11.01 (2)   12.01 (3)   12.03 (2/2)   12.04 (2/2)   12.05 (2)
17428   12.06 (2.1/2)   12.06 (2.2/2)   12.07 (2)   13.01 (0.1/2)   13.03 (5/1)
17429   13.03.01 (0)
17430
17431
17432 @item
17433 @emph{AI-0128 Inequality is a primitive operation (0000-00-00)}
17434 @cindex AI-0128 (Ada 2012 feature)
17435
17436 @noindent
17437   If an equality operator ("=") is declared for a type, then the implicitly
17438   declared inequality operator ("/=") is a primitive operation of the type.
17439   This is the only reasonable interpretation, and is the one always implemented
17440   by GNAT, but the RM was not entirely clear in making this point.
17441
17442 @noindent
17443   RM References:  3.02.03 (6)   6.06 (6)
17444
17445 @item
17446 @emph{AI-0003 Qualified expressions as names (2010-07-11)}
17447 @cindex AI-0003 (Ada 2012 feature)
17448
17449 @noindent
17450    In Ada 2012, a qualified expression is considered to be syntactically a name,
17451    meaning that constructs such as @code{A'(F(X)).B} are now legal. This is
17452    useful in disambiguating some cases of overloading.
17453
17454 @noindent
17455   RM References:  3.03 (11)   3.03 (21)   4.01 (2)   4.04 (7)   4.07 (3)
17456   5.04 (7)
17457
17458 @item
17459 @emph{AI-0120 Constant instance of protected object (0000-00-00)}
17460 @cindex AI-0120 (Ada 2012 feature)
17461
17462 @noindent
17463   This is an RM editorial change only. The section that lists objects that are
17464   constant failed to include the current instance of a protected object
17465   within a protected function. This has always been treated as a constant
17466   in GNAT.
17467
17468 @noindent
17469   RM References:  3.03 (21)
17470
17471 @item
17472 @emph{AI-0008 General access to constrained objects (0000-00-00)}
17473 @cindex AI-0008 (Ada 2012 feature)
17474
17475 @noindent
17476   The wording in the RM implied that if you have a general access to a
17477   constrained object, it could be used to modify the discriminants. This was
17478   obviously not intended. @code{Constraint_Error} should be raised, and GNAT
17479   has always done so in this situation.
17480
17481 @noindent
17482   RM References:  3.03 (23)   3.10.02 (26/2)   4.01 (9)   6.04.01 (17)   8.05.01 (5/2)
17483
17484
17485 @item
17486 @emph{AI-0093 Additional rules use immutably limited (0000-00-00)}
17487 @cindex AI-0093 (Ada 2012 feature)
17488
17489 @noindent
17490   This is an editorial change only, to make more widespread use of the Ada 2012
17491   ``immutably limited''.
17492
17493 @noindent
17494   RM References:  3.03 (23.4/3)
17495
17496
17497
17498 @item
17499 @emph{AI-0096 Deriving from formal private types (2010-07-20)}
17500 @cindex AI-0096 (Ada 2012 feature)
17501
17502 @noindent
17503   In general it is illegal for a type derived from a formal limited type to be
17504   nonlimited.  This AI makes an exception to this rule: derivation is legal
17505   if it appears in the private part of the generic, and the formal type is not
17506   tagged. If the type is tagged, the legality check must be applied to the
17507   private part of the package.
17508
17509 @noindent
17510   RM References:  3.04 (5.1/2)   6.02 (7)
17511
17512
17513 @item
17514 @emph{AI-0181 Soft hyphen is a non-graphic character (2010-07-23)}
17515 @cindex AI-0181 (Ada 2012 feature)
17516
17517 @noindent
17518   From Ada 2005 on, soft hyphen is considered a non-graphic character, which
17519   means that it has a special name (@code{SOFT_HYPHEN}) in conjunction with the
17520   @code{Image} and @code{Value} attributes for the character types. Strictly
17521   speaking this is an inconsistency with Ada 95, but in practice the use of
17522   these attributes is so obscure that it will not cause problems.
17523
17524 @noindent
17525   RM References:  3.05.02 (2/2)   A.01 (35/2)   A.03.03 (21)
17526
17527
17528 @item
17529 @emph{AI-0182 Additional forms for @code{Character'Value} (0000-00-00)}
17530 @cindex AI-0182 (Ada 2012 feature)
17531
17532 @noindent
17533   This AI allows @code{Character'Value} to accept the string @code{'?'} where
17534   @code{?} is any character including non-graphic control characters. GNAT has
17535   always accepted such strings. It also allows strings such as
17536   @code{HEX_00000041} to be accepted, but GNAT does not take advantage of this
17537   permission and raises @code{Constraint_Error}, as is certainly still
17538   permitted.
17539
17540 @noindent
17541   RM References:  3.05 (56/2)
17542
17543
17544 @item
17545 @emph{AI-0214 Defaulted discriminants for limited tagged (2010-10-01)}
17546 @cindex AI-0214 (Ada 2012 feature)
17547
17548 @noindent
17549   Ada 2012 relaxes the restriction that forbids discriminants of tagged types
17550   to have default expressions by allowing them when the type is limited. It
17551   is often useful to define a default value for a discriminant even though
17552   it can't be changed by assignment.
17553
17554 @noindent
17555   RM References:  3.07 (9.1/2)   3.07.02 (3)
17556
17557
17558 @item
17559 @emph{AI-0102 Some implicit conversions are illegal (0000-00-00)}
17560 @cindex AI-0102 (Ada 2012 feature)
17561
17562 @noindent
17563   It is illegal to assign an anonymous access constant to an anonymous access
17564   variable. The RM did not have a clear rule to prevent this, but GNAT has
17565   always generated an error for this usage.
17566
17567 @noindent
17568   RM References:  3.07 (16)   3.07.01 (9)   6.04.01 (6)   8.06 (27/2)
17569
17570
17571 @item
17572 @emph{AI-0158 Generalizing membership tests (2010-09-16)}
17573 @cindex AI-0158 (Ada 2012 feature)
17574
17575 @noindent
17576   This AI extends the syntax of membership tests to simplify complex conditions
17577   that can be expressed as membership in a subset of values of any type. It
17578   introduces syntax for a list of expressions that may be used in loop contexts
17579   as well.
17580
17581 @noindent
17582   RM References:  3.08.01 (5)   4.04 (3)   4.05.02 (3)   4.05.02 (5)   4.05.02 (27)
17583
17584
17585 @item
17586 @emph{AI-0173 Testing if tags represent abstract types (2010-07-03)}
17587 @cindex AI-0173 (Ada 2012 feature)
17588
17589 @noindent
17590   The function @code{Ada.Tags.Type_Is_Abstract} returns @code{True} if invoked
17591   with the tag of an abstract type, and @code{False} otherwise.
17592
17593 @noindent
17594   RM References:  3.09 (7.4/2)   3.09 (12.4/2)
17595
17596
17597
17598 @item
17599 @emph{AI-0076 function with controlling result (0000-00-00)}
17600 @cindex AI-0076 (Ada 2012 feature)
17601
17602 @noindent
17603   This is an editorial change only. The RM defines calls with controlling
17604   results, but uses the term ``function with controlling result'' without an
17605   explicit definition.
17606
17607 @noindent
17608   RM References:  3.09.02 (2/2)
17609
17610
17611 @item
17612 @emph{AI-0126 Dispatching with no declared operation (0000-00-00)}
17613 @cindex AI-0126 (Ada 2012 feature)
17614
17615 @noindent
17616   This AI clarifies dispatching rules, and simply confirms that dispatching
17617   executes the operation of the parent type when there is no explicitly or
17618   implicitly declared operation for the descendant type. This has always been
17619   the case in all versions of GNAT.
17620
17621 @noindent
17622   RM References:  3.09.02 (20/2)   3.09.02 (20.1/2)   3.09.02 (20.2/2)
17623
17624
17625 @item
17626 @emph{AI-0097 Treatment of abstract null extension (2010-07-19)}
17627 @cindex AI-0097 (Ada 2012 feature)
17628
17629 @noindent
17630   The RM as written implied that in some cases it was possible to create an
17631   object of an abstract type, by having an abstract extension inherit a non-
17632   abstract constructor from its parent type. This mistake has been corrected
17633   in GNAT and in the RM, and this construct is now illegal.
17634
17635 @noindent
17636   RM References:  3.09.03 (4/2)
17637
17638
17639 @item
17640 @emph{AI-0203 Extended return cannot be abstract (0000-00-00)}
17641 @cindex AI-0203 (Ada 2012 feature)
17642
17643 @noindent
17644   A return_subtype_indication cannot denote an abstract subtype. GNAT has never
17645   permitted such usage.
17646
17647 @noindent
17648   RM References:  3.09.03 (8/3)
17649
17650
17651 @item
17652 @emph{AI-0198 Inheriting abstract operators  (0000-00-00)}
17653 @cindex AI-0198 (Ada 2012 feature)
17654
17655 @noindent
17656   This AI resolves a conflict between two rules involving inherited abstract
17657   operations and predefined operators. If a derived numeric type inherits
17658   an abstract operator, it overrides the predefined one. This interpretation
17659   was always the one implemented in GNAT.
17660
17661 @noindent
17662   RM References:  3.09.03 (4/3)
17663
17664 @item
17665 @emph{AI-0073 Functions returning abstract types (2010-07-10)}
17666 @cindex AI-0073 (Ada 2012 feature)
17667
17668 @noindent
17669   This AI covers a number of issues regarding returning abstract types. In
17670   particular generic functions cannot have abstract result types or access
17671   result types designated an abstract type. There are some other cases which
17672   are detailed in the AI. Note that this binding interpretation has not been
17673   retrofitted to operate before Ada 2012 mode, since it caused a significant
17674   number of regressions.
17675
17676 @noindent
17677   RM References:  3.09.03 (8)   3.09.03 (10)   6.05 (8/2)
17678
17679
17680 @item
17681 @emph{AI-0070 Elaboration of interface types (0000-00-00)}
17682 @cindex AI-0070 (Ada 2012 feature)
17683
17684 @noindent
17685   This is an editorial change only, there are no testable consequences short of
17686   checking for the absence of generated code for an interface declaration.
17687
17688 @noindent
17689   RM References:  3.09.04 (18/2)
17690
17691
17692 @item
17693 @emph{AI-0208 Characteristics of incomplete views (0000-00-00)}
17694 @cindex AI-0208 (Ada 2012 feature)
17695
17696 @noindent
17697   The wording in the Ada 2005 RM concerning characteristics of incomplete views
17698   was incorrect and implied that some programs intended to be legal were now
17699   illegal. GNAT had never considered such programs illegal, so it has always
17700   implemented the intent of this AI.
17701
17702 @noindent
17703   RM References:  3.10.01 (2.4/2)   3.10.01 (2.6/2)
17704
17705
17706 @item
17707 @emph{AI-0162 Incomplete type completed by partial view (2010-09-15)}
17708 @cindex AI-0162 (Ada 2012 feature)
17709
17710 @noindent
17711   Incomplete types are made more useful by allowing them to be completed by
17712   private types and private extensions.
17713
17714 @noindent
17715   RM References:  3.10.01 (2.5/2)   3.10.01 (2.6/2)   3.10.01 (3)   3.10.01 (4/2)
17716
17717
17718
17719 @item
17720 @emph{AI-0098 Anonymous subprogram access restrictions (0000-00-00)}
17721 @cindex AI-0098 (Ada 2012 feature)
17722
17723 @noindent
17724   An unintentional omission in the RM implied some inconsistent restrictions on
17725   the use of anonymous access to subprogram values. These restrictions were not
17726   intentional, and have never been enforced by GNAT.
17727
17728 @noindent
17729   RM References:  3.10.01 (6)   3.10.01 (9.2/2)
17730
17731
17732 @item
17733 @emph{AI-0199 Aggregate with anonymous access components (2010-07-14)}
17734 @cindex AI-0199 (Ada 2012 feature)
17735
17736 @noindent
17737   A choice list in a record aggregate can include several components of
17738   (distinct) anonymous access types as long as they have matching designated
17739   subtypes.
17740
17741 @noindent
17742   RM References:  4.03.01 (16)
17743
17744
17745 @item
17746 @emph{AI-0220 Needed components for aggregates (0000-00-00)}
17747 @cindex AI-0220 (Ada 2012 feature)
17748
17749 @noindent
17750   This AI addresses a wording problem in the RM that appears to permit some
17751   complex cases of aggregates with non-static discriminants. GNAT has always
17752   implemented the intended semantics.
17753
17754 @noindent
17755   RM References:  4.03.01 (17)
17756
17757 @item
17758 @emph{AI-0147 Conditional expressions (2009-03-29)}
17759 @cindex AI-0147 (Ada 2012 feature)
17760
17761 @noindent
17762   Conditional expressions are permitted. The form of such an expression is:
17763
17764 @smallexample
17765     (@b{if} @i{expr} @b{then} @i{expr} @{@b{elsif} @i{expr} @b{then} @i{expr}@} [@b{else} @i{expr}])
17766 @end smallexample
17767
17768   The parentheses can be omitted in contexts where parentheses are present
17769   anyway, such as subprogram arguments and pragma arguments. If the @b{else}
17770   clause is omitted, @b{else True} is assumed;
17771   thus @code{(@b{if} A @b{then} B)} is a way to conveniently represent
17772   @emph{(A implies B)} in standard logic.
17773
17774 @noindent
17775   RM References:  4.03.03 (15)   4.04 (1)   4.04 (7)   4.05.07 (0)   4.07 (2)
17776   4.07 (3)   4.09 (12)   4.09 (33)   5.03 (3)   5.03 (4)   7.05 (2.1/2)
17777
17778
17779 @item
17780 @emph{AI-0037 Out-of-range box associations in aggregate (0000-00-00)}
17781 @cindex AI-0037 (Ada 2012 feature)
17782
17783 @noindent
17784   This AI confirms that an association of the form @code{Indx => <>} in an
17785   array aggregate must raise @code{Constraint_Error} if @code{Indx}
17786   is out of range. The RM specified a range check on other associations, but
17787   not when the value of the association was defaulted. GNAT has always inserted
17788   a constraint check on the index value.
17789
17790 @noindent
17791   RM References:  4.03.03 (29)
17792
17793
17794 @item
17795 @emph{AI-0123 Composability of equality (2010-04-13)}
17796 @cindex AI-0123 (Ada 2012 feature)
17797
17798 @noindent
17799   Equality of untagged record composes, so that the predefined equality for a
17800   composite type that includes a component of some untagged record type
17801   @code{R} uses the equality operation of @code{R} (which may be user-defined
17802   or predefined). This makes the behavior of untagged records identical to that
17803   of tagged types in this respect.
17804
17805   This change is an incompatibility with previous versions of Ada, but it
17806   corrects a non-uniformity that was often a source of confusion. Analysis of
17807   a large number of industrial programs indicates that in those rare cases
17808   where a composite type had an untagged record component with a user-defined
17809   equality, either there was no use of the composite equality, or else the code
17810   expected the same composability as for tagged types, and thus had a bug that
17811   would be fixed by this change.
17812
17813 @noindent
17814   RM References:  4.05.02 (9.7/2)   4.05.02 (14)   4.05.02 (15)   4.05.02 (24)
17815   8.05.04 (8)
17816
17817
17818 @item
17819 @emph{AI-0088 The value of exponentiation (0000-00-00)}
17820 @cindex AI-0088 (Ada 2012 feature)
17821
17822 @noindent
17823   This AI clarifies the equivalence rule given for the dynamic semantics of
17824   exponentiation: the value of the operation can be obtained by repeated
17825   multiplication, but the operation can be implemented otherwise (for example
17826   using the familiar divide-by-two-and-square algorithm, even if this is less
17827   accurate), and does not imply repeated reads of a volatile base.
17828
17829 @noindent
17830   RM References:  4.05.06 (11)
17831
17832 @item
17833 @emph{AI-0188 Case expressions (2010-01-09)}
17834 @cindex AI-0188 (Ada 2012 feature)
17835
17836 @noindent
17837   Case expressions are permitted. This allows use of constructs such as:
17838 @smallexample
17839   X := (@b{case} Y @b{is when} 1 => 2, @b{when} 2 => 3, @b{when others} => 31)
17840 @end smallexample
17841
17842 @noindent
17843   RM References:  4.05.07 (0)   4.05.08 (0)   4.09 (12)   4.09 (33)
17844
17845 @item
17846 @emph{AI-0104 Null exclusion and uninitialized allocator (2010-07-15)}
17847 @cindex AI-0104 (Ada 2012 feature)
17848
17849 @noindent
17850   The assignment @code{Ptr := @b{new not null} Some_Ptr;} will raise
17851   @code{Constraint_Error} because the default value of the allocated object is
17852   @b{null}. This useless construct is illegal in Ada 2012.
17853
17854 @noindent
17855   RM References:  4.08 (2)
17856
17857 @item
17858 @emph{AI-0157 Allocation/Deallocation from empty pool (2010-07-11)}
17859 @cindex AI-0157 (Ada 2012 feature)
17860
17861 @noindent
17862   Allocation and Deallocation from an empty storage pool (i.e. allocation or
17863   deallocation of a pointer for which a static storage size clause of zero
17864   has been given) is now illegal and is detected as such. GNAT
17865   previously gave a warning but not an error.
17866
17867 @noindent
17868   RM References:  4.08 (5.3/2)   13.11.02 (4)   13.11.02 (17)
17869
17870 @item
17871 @emph{AI-0179 Statement not required after label (2010-04-10)}
17872 @cindex AI-0179 (Ada 2012 feature)
17873
17874 @noindent
17875   It is not necessary to have a statement following a label, so a label
17876   can appear at the end of a statement sequence without the need for putting a
17877   null statement afterwards, but it is not allowable to have only labels and
17878   no real statements in a statement sequence.
17879
17880 @noindent
17881   RM References:  5.01 (2)
17882
17883
17884 @item
17885 @emph{AI-139-2 Syntactic sugar for iterators (2010-09-29)}
17886 @cindex AI-139-2 (Ada 2012 feature)
17887
17888 @noindent
17889   The new syntax for iterating over arrays and containers is now implemented.
17890   Iteration over containers is for now limited to read-only iterators. Only
17891   default iterators are supported, with the syntax:  @code{@b{for} Elem @b{of} C}.
17892
17893 @noindent
17894   RM References:  5.05
17895
17896 @item
17897 @emph{AI-0134 Profiles must match for full conformance (0000-00-00)}
17898 @cindex AI-0134 (Ada 2012 feature)
17899
17900 @noindent
17901   For full conformance, the profiles of anonymous-access-to-subprogram
17902   parameters must match. GNAT has always enforced this rule.
17903
17904 @noindent
17905   RM References:  6.03.01 (18)
17906
17907 @item
17908 @emph{AI-0207 Mode conformance and access constant (0000-00-00)}
17909 @cindex AI-0207 (Ada 2012 feature)
17910
17911 @noindent
17912   This AI confirms that access_to_constant indication must match for mode
17913   conformance. This was implemented in GNAT when the qualifier was originally
17914   introduced in Ada 2005.
17915
17916 @noindent
17917   RM References:  6.03.01 (16/2)
17918
17919
17920 @item
17921 @emph{AI-0046 Null exclusion match for full conformance (2010-07-17)}
17922 @cindex AI-0046 (Ada 2012 feature)
17923
17924 @noindent
17925   For full conformance, in the case of access parameters, the null exclusion
17926   must match (either both or neither must have @code{@b{not null}}).
17927
17928 @noindent
17929   RM References:  6.03.02 (18)
17930
17931
17932 @item
17933 @emph{AI-0118 The association of parameter associations (0000-00-00)}
17934 @cindex AI-0118 (Ada 2012 feature)
17935
17936 @noindent
17937   This AI clarifies the rules for named associations in subprogram calls and
17938   generic instantiations. The rules have been in place since Ada 83.
17939
17940 @noindent
17941   RM References:  6.04.01 (2)   12.03 (9)
17942
17943
17944 @item
17945 @emph{AI-0196 Null exclusion tests for out parameters (0000-00-00)}
17946 @cindex AI-0196 (Ada 2012 feature)
17947
17948 @noindent
17949   Null exclusion checks are not made for @code{@b{out}} parameters when
17950   evaluating the actual parameters. GNAT has never generated these checks.
17951
17952 @noindent
17953   RM References:  6.04.01 (13)
17954
17955 @item
17956 @emph{AI-0015 Constant return objects (0000-00-00)}
17957 @cindex AI-0015 (Ada 2012 feature)
17958
17959 @noindent
17960   The return object declared in an @i{extended_return_statement} may be
17961   declared constant. This was always intended, and GNAT has always allowed it.
17962
17963 @noindent
17964   RM References:  6.05 (2.1/2)   3.03 (10/2)   3.03 (21)   6.05 (5/2)
17965   6.05 (5.7/2)
17966
17967
17968 @item
17969 @emph{AI-0032 Extended return for class-wide functions (0000-00-00)}
17970 @cindex AI-0032 (Ada 2012 feature)
17971
17972 @noindent
17973   If a function returns a class-wide type, the object of an extended return
17974   statement can be declared with a specific type that is covered by the class-
17975   wide type. This has been implemented in GNAT since the introduction of
17976   extended returns. Note AI-0103 complements this AI by imposing matching
17977   rules for constrained return types.
17978
17979 @noindent
17980   RM References:  6.05 (5.2/2)   6.05 (5.3/2)   6.05 (5.6/2)   6.05 (5.8/2)
17981   6.05 (8/2)
17982
17983 @item
17984 @emph{AI-0103 Static matching for extended return (2010-07-23)}
17985 @cindex AI-0103 (Ada 2012 feature)
17986
17987 @noindent
17988   If the return subtype of a function is an elementary type or a constrained
17989   type, the subtype indication in an extended return statement must match
17990   statically this return subtype.
17991
17992 @noindent
17993   RM References:  6.05 (5.2/2)
17994
17995
17996 @item
17997 @emph{AI-0058 Abnormal completion of an extended return (0000-00-00)}
17998 @cindex AI-0058 (Ada 2012 feature)
17999
18000 @noindent
18001   The RM had some incorrect wording implying wrong treatment of abnormal
18002   completion in an extended return. GNAT has always implemented the intended
18003   correct semantics as described by this AI.
18004
18005 @noindent
18006   RM References:  6.05 (22/2)
18007
18008
18009 @item
18010 @emph{AI-0050 Raising Constraint_Error early for function call (0000-00-00)}
18011 @cindex AI-0050 (Ada 2012 feature)
18012
18013 @noindent
18014   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
18015   not take advantage of these incorrect permissions in any case.
18016
18017 @noindent
18018   RM References:  6.05 (24/2)
18019
18020
18021 @item
18022 @emph{AI-0125 Nonoverridable operations of an ancestor (2010-09-28)}
18023 @cindex AI-0125 (Ada 2012 feature)
18024
18025 @noindent
18026   In Ada 2012, the declaration of a primitive operation of a type extension
18027   or private extension can also override an inherited primitive that is not
18028   visible at the point of this declaration.
18029
18030 @noindent
18031   RM References:  7.03.01 (6)   8.03 (23)   8.03.01 (5/2)   8.03.01 (6/2)
18032
18033 @item
18034 @emph{AI-0062 Null exclusions and deferred constants (0000-00-00)}
18035 @cindex AI-0062 (Ada 2012 feature)
18036
18037 @noindent
18038   A full constant may have a null exclusion even if its associated deferred
18039   constant does not. GNAT has always allowed this.
18040
18041 @noindent
18042   RM References:  7.04 (6/2)   7.04 (7.1/2)
18043
18044
18045 @item
18046 @emph{AI-0178 Incomplete views are limited (0000-00-00)}
18047 @cindex AI-0178 (Ada 2012 feature)
18048
18049 @noindent
18050   This AI clarifies the role of incomplete views and plugs an omission in the
18051   RM. GNAT always correctly restricted the use of incomplete views and types.
18052
18053 @noindent
18054   RM References:  7.05 (3/2)   7.05 (6/2)
18055
18056 @item
18057 @emph{AI-0087 Actual for formal nonlimited derived type (2010-07-15)}
18058 @cindex AI-0087 (Ada 2012 feature)
18059
18060 @noindent
18061   The actual for a formal nonlimited derived type cannot be limited. In
18062   particular, a formal derived type that extends a limited interface but which
18063   is not explicitly limited cannot be instantiated with a limited type.
18064
18065 @noindent
18066   RM References:  7.05 (5/2)   12.05.01 (5.1/2)
18067
18068 @item
18069 @emph{AI-0099 Tag determines whether finalization needed (0000-00-00)}
18070 @cindex AI-0099 (Ada 2012 feature)
18071
18072 @noindent
18073   This AI clarifies that ``needs finalization'' is part of dynamic semantics,
18074   and therefore depends on the run-time characteristics of an object (i.e. its
18075   tag) and not on its nominal type. As the AI indicates: ``we do not expect
18076   this to affect any implementation''.
18077
18078 @noindent
18079   RM References:  7.06.01 (6)   7.06.01 (7)   7.06.01 (8)   7.06.01 (9/2)
18080
18081
18082
18083 @item
18084 @emph{AI-0064 Redundant finalization rule (0000-00-00)}
18085 @cindex AI-0064 (Ada 2012 feature)
18086
18087 @noindent
18088   This is an editorial change only. The intended behavior is already checked
18089   by an existing ACATS test, which GNAT has always executed correctly.
18090
18091 @noindent
18092   RM References:  7.06.01 (17.1/1)
18093
18094 @item
18095 @emph{AI-0026 Missing rules for Unchecked_Union (2010-07-07)}
18096 @cindex AI-0026 (Ada 2012 feature)
18097
18098 @noindent
18099   Record representation clauses concerning Unchecked_Union types cannot mention
18100   the discriminant of the type. The type of a component declared in the variant
18101   part of an Unchecked_Union cannot be controlled, have controlled components,
18102   nor have protected or task parts. If an Unchecked_Union type is declared
18103   within the body of a generic unit or its descendants, then the type of a
18104   component declared in the variant part cannot be a formal private type or a
18105   formal private extension declared within the same generic unit.
18106
18107 @noindent
18108   RM References:  7.06 (9.4/2)   B.03.03 (9/2)   B.03.03 (10/2)
18109
18110
18111 @item
18112 @emph{AI-0205 Extended return declares visible name (0000-00-00)}
18113 @cindex AI-0205 (Ada 2012 feature)
18114
18115 @noindent
18116   This AI corrects a simple omission in the RM. Return objects have always
18117   been visible within an extended return statement.
18118
18119 @noindent
18120   RM References:  8.03 (17)
18121
18122
18123 @item
18124 @emph{AI-0042 Overriding versus implemented-by (0000-00-00)}
18125 @cindex AI-0042 (Ada 2012 feature)
18126
18127 @noindent
18128   This AI fixes a wording gap in the RM. An operation of a synchronized
18129   interface can be implemented by a protected or task entry, but the abstract
18130   operation is not being overridden in the usual sense, and it must be stated
18131   separately that this implementation is legal. This has always been the case
18132   in GNAT.
18133
18134 @noindent
18135   RM References:  9.01 (9.2/2)   9.04 (11.1/2)
18136
18137 @item
18138 @emph{AI-0030 Requeue on synchronized interfaces (2010-07-19)}
18139 @cindex AI-0030 (Ada 2012 feature)
18140
18141 @noindent
18142   Requeue is permitted to a protected, synchronized or task interface primitive
18143   providing it is known that the overriding operation is an entry. Otherwise
18144   the requeue statement has the same effect as a procedure call. Use of pragma
18145   @code{Implemented} provides a way to impose a static requirement on the
18146   overriding operation by adhering to one of the implementation kinds: entry,
18147   protected procedure or any of the above.
18148
18149 @noindent
18150   RM References:  9.05 (9)   9.05.04 (2)   9.05.04 (3)   9.05.04 (5)
18151   9.05.04 (6)   9.05.04 (7)   9.05.04 (12)
18152
18153
18154 @item
18155 @emph{AI-0201 Independence of atomic object components (2010-07-22)}
18156 @cindex AI-0201 (Ada 2012 feature)
18157
18158 @noindent
18159   If an Atomic object has a pragma @code{Pack} or a @code{Component_Size}
18160   attribute, then individual components may not be addressable by independent
18161   tasks. However, if the representation clause has no effect (is confirming),
18162   then independence is not compromised. Furthermore, in GNAT, specification of
18163   other appropriately addressable component sizes (e.g. 16 for 8-bit
18164   characters) also preserves independence. GNAT now gives very clear warnings
18165   both for the declaration of such a type, and for any assignment to its components.
18166
18167 @noindent
18168   RM References:  9.10 (1/3)   C.06 (22/2)   C.06 (23/2)
18169
18170 @item
18171 @emph{AI-0009 Pragma Independent[_Components] (2010-07-23)}
18172 @cindex AI-0009 (Ada 2012 feature)
18173
18174 @noindent
18175   This AI introduces the new pragmas @code{Independent} and
18176   @code{Independent_Components},
18177   which control guaranteeing independence of access to objects and components.
18178   The AI also requires independence not unaffected by confirming rep clauses.
18179
18180 @noindent
18181   RM References:  9.10 (1)   13.01 (15/1)   13.02 (9)   13.03 (13)   C.06 (2)
18182   C.06 (4)   C.06 (6)   C.06 (9)   C.06 (13)   C.06 (14)
18183
18184
18185 @item
18186 @emph{AI-0072 Task signalling using 'Terminated (0000-00-00)}
18187 @cindex AI-0072 (Ada 2012 feature)
18188
18189 @noindent
18190   This AI clarifies that task signalling for reading @code{'Terminated} only
18191   occurs if the result is True. GNAT semantics has always been consistent with
18192   this notion of task signalling.
18193
18194 @noindent
18195   RM References:  9.10 (6.1/1)
18196
18197 @item
18198 @emph{AI-0108 Limited incomplete view and discriminants (0000-00-00)}
18199 @cindex AI-0108 (Ada 2012 feature)
18200
18201 @noindent
18202   This AI confirms that an incomplete type from a limited view does not have
18203   discriminants. This has always been the case in GNAT.
18204
18205 @noindent
18206   RM References:  10.01.01 (12.3/2)
18207
18208 @item
18209 @emph{AI-0129 Limited views and incomplete types (0000-00-00)}
18210 @cindex AI-0129 (Ada 2012 feature)
18211
18212 @noindent
18213   This AI clarifies the description of limited views: a limited view of a
18214   package includes only one view of a type that has an incomplete declaration
18215   and a full declaration (there is no possible ambiguity in a client package).
18216   This AI also fixes an omission: a nested package in the private part has no
18217   limited view. GNAT always implemented this correctly.
18218
18219 @noindent
18220   RM References:  10.01.01 (12.2/2)   10.01.01 (12.3/2)
18221
18222
18223
18224 @item
18225 @emph{AI-0077 Limited withs and scope of declarations (0000-00-00)}
18226 @cindex AI-0077 (Ada 2012 feature)
18227
18228 @noindent
18229   This AI clarifies that a declaration does not include a context clause,
18230   and confirms that it is illegal to have a context in which both a limited
18231   and a nonlimited view of a package are accessible. Such double visibility
18232   was always rejected by GNAT.
18233
18234 @noindent
18235   RM References:  10.01.02 (12/2)   10.01.02 (21/2)   10.01.02 (22/2)
18236
18237 @item
18238 @emph{AI-0122 Private with and children of generics (0000-00-00)}
18239 @cindex AI-0122 (Ada 2012 feature)
18240
18241 @noindent
18242   This AI clarifies the visibility of private children of generic units within
18243   instantiations of a parent. GNAT has always handled this correctly.
18244
18245 @noindent
18246   RM References:  10.01.02 (12/2)
18247
18248
18249
18250 @item
18251 @emph{AI-0040 Limited with clauses on descendant (0000-00-00)}
18252 @cindex AI-0040 (Ada 2012 feature)
18253
18254 @noindent
18255   This AI confirms that a limited with clause in a child unit cannot name
18256   an ancestor of the unit. This has always been checked in GNAT.
18257
18258 @noindent
18259   RM References:  10.01.02 (20/2)
18260
18261 @item
18262 @emph{AI-0132 Placement of library unit pragmas (0000-00-00)}
18263 @cindex AI-0132 (Ada 2012 feature)
18264
18265 @noindent
18266   This AI fills a gap in the description of library unit pragmas. The pragma
18267   clearly must apply to a library unit, even if it does not carry the name
18268   of the enclosing unit. GNAT has always enforced the required check.
18269
18270 @noindent
18271   RM References:  10.01.05 (7)
18272
18273
18274 @item
18275 @emph{AI-0034 Categorization of limited views (0000-00-00)}
18276 @cindex AI-0034 (Ada 2012 feature)
18277
18278 @noindent
18279   The RM makes certain limited with clauses illegal because of categorization
18280   considerations, when the corresponding normal with would be legal. This is
18281   not intended, and GNAT has always implemented the recommended behavior.
18282
18283 @noindent
18284   RM References:  10.02.01 (11/1)   10.02.01 (17/2)
18285
18286
18287 @item
18288 @emph{AI-0035 Inconsistencies with Pure units (0000-00-00)}
18289 @cindex AI-0035 (Ada 2012 feature)
18290
18291 @noindent
18292   This AI remedies some inconsistencies in the legality rules for Pure units.
18293   Derived access types are legal in a pure unit (on the assumption that the
18294   rule for a zero storage pool size has been enforced on the ancestor type).
18295   The rules are enforced in generic instances and in subunits. GNAT has always
18296   implemented the recommended behavior.
18297
18298 @noindent
18299   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)
18300
18301
18302 @item
18303 @emph{AI-0219 Pure permissions and limited parameters (2010-05-25)}
18304 @cindex AI-0219 (Ada 2012 feature)
18305
18306 @noindent
18307   This AI refines the rules for the cases with limited parameters which do not
18308   allow the implementations to omit ``redundant''. GNAT now properly conforms
18309   to the requirements of this binding interpretation.
18310
18311 @noindent
18312   RM References:  10.02.01 (18/2)
18313
18314 @item
18315 @emph{AI-0043 Rules about raising exceptions (0000-00-00)}
18316 @cindex AI-0043 (Ada 2012 feature)
18317
18318 @noindent
18319   This AI covers various omissions in the RM regarding the raising of
18320   exceptions. GNAT has always implemented the intended semantics.
18321
18322 @noindent
18323   RM References:  11.04.01 (10.1/2)   11 (2)
18324
18325
18326 @item
18327 @emph{AI-0200 Mismatches in formal package declarations (0000-00-00)}
18328 @cindex AI-0200 (Ada 2012 feature)
18329
18330 @noindent
18331   This AI plugs a gap in the RM which appeared to allow some obviously intended
18332   illegal instantiations. GNAT has never allowed these instantiations.
18333
18334 @noindent
18335   RM References:  12.07 (16)
18336
18337
18338 @item
18339 @emph{AI-0112 Detection of duplicate pragmas (2010-07-24)}
18340 @cindex AI-0112 (Ada 2012 feature)
18341
18342 @noindent
18343   This AI concerns giving names to various representation aspects, but the
18344   practical effect is simply to make the use of duplicate
18345   @code{Atomic}[@code{_Components}],
18346   @code{Volatile}[@code{_Components}] and
18347   @code{Independent}[@code{_Components}] pragmas illegal, and GNAT
18348   now performs this required check.
18349
18350 @noindent
18351   RM References:  13.01 (8)
18352
18353 @item
18354 @emph{AI-0106 No representation pragmas on generic formals (0000-00-00)}
18355 @cindex AI-0106 (Ada 2012 feature)
18356
18357 @noindent
18358   The RM appeared to allow representation pragmas on generic formal parameters,
18359   but this was not intended, and GNAT has never permitted this usage.
18360
18361 @noindent
18362   RM References:  13.01 (9.1/1)
18363
18364
18365 @item
18366 @emph{AI-0012 Pack/Component_Size for aliased/atomic (2010-07-15)}
18367 @cindex AI-0012 (Ada 2012 feature)
18368
18369 @noindent
18370   It is now illegal to give an inappropriate component size or a pragma
18371   @code{Pack} that attempts to change the component size in the case of atomic
18372   or aliased components. Previously GNAT ignored such an attempt with a
18373   warning.
18374
18375 @noindent
18376   RM References:  13.02 (6.1/2)   13.02 (7)   C.06 (10)   C.06 (11)   C.06 (21)
18377
18378
18379 @item
18380 @emph{AI-0039 Stream attributes cannot be dynamic (0000-00-00)}
18381 @cindex AI-0039 (Ada 2012 feature)
18382
18383 @noindent
18384   The RM permitted the use of dynamic expressions (such as @code{ptr.@b{all})}
18385   for stream attributes, but these were never useful and are now illegal. GNAT
18386   has always regarded such expressions as illegal.
18387
18388 @noindent
18389   RM References:  13.03 (4)   13.03 (6)   13.13.02 (38/2)
18390
18391
18392 @item
18393 @emph{AI-0095 Address of intrinsic subprograms (0000-00-00)}
18394 @cindex AI-0095 (Ada 2012 feature)
18395
18396 @noindent
18397   The prefix of @code{'Address} cannot statically denote a subprogram with
18398   convention @code{Intrinsic}. The use of the @code{Address} attribute raises
18399   @code{Program_Error} if the prefix denotes a subprogram with convention
18400   @code{Intrinsic}.
18401
18402 @noindent
18403   RM References:  13.03 (11/1)
18404
18405
18406 @item
18407 @emph{AI-0116 Alignment of class-wide objects (0000-00-00)}
18408 @cindex AI-0116 (Ada 2012 feature)
18409
18410 @noindent
18411   This AI requires that the alignment of a class-wide object be no greater
18412   than the alignment of any type in the class. GNAT has always followed this
18413   recommendation.
18414
18415 @noindent
18416   RM References:  13.03 (29)   13.11 (16)
18417
18418
18419 @item
18420 @emph{AI-0146 Type invariants (2009-09-21)}
18421 @cindex AI-0146 (Ada 2012 feature)
18422
18423 @noindent
18424   Type invariants may be specified for private types using the aspect notation.
18425   Aspect @code{Invariant} may be specified for any private type,
18426   @code{Invariant'Class} can
18427   only be specified for tagged types, and is inherited by any descendent of the
18428   tagged types. The invariant is a boolean expression that is tested for being
18429   true in the following situations: conversions to the private type, object
18430   declarations for the private type that are default initialized, and
18431   [@b{in}] @b{out}
18432   parameters and returned result on return from any primitive operation for
18433   the type that is visible to a client.
18434
18435 @noindent
18436   RM References:  13.03.03 (00)
18437
18438 @item
18439 @emph{AI-0078 Relax Unchecked_Conversion alignment rules (0000-00-00)}
18440 @cindex AI-0078 (Ada 2012 feature)
18441
18442 @noindent
18443   In Ada 2012, compilers are required to support unchecked conversion where the
18444   target alignment is a multiple of the source alignment. GNAT always supported
18445   this case (and indeed all cases of differing alignments, doing copies where
18446   required if the alignment was reduced).
18447
18448 @noindent
18449   RM References:  13.09 (7)
18450
18451
18452 @item
18453 @emph{AI-0195 Invalid value handling is implementation defined (2010-07-03)}
18454 @cindex AI-0195 (Ada 2012 feature)
18455
18456 @noindent
18457   The handling of invalid values is now designated to be implementation
18458   defined. This is a documentation change only, requiring Annex M in the GNAT
18459   Reference Manual to document this handling.
18460   In GNAT, checks for invalid values are made
18461   only when necessary to avoid erroneous behavior. Operations like assignments
18462   which cannot cause erroneous behavior ignore the possibility of invalid
18463   values and do not do a check. The date given above applies only to the
18464   documentation change, this behavior has always been implemented by GNAT.
18465
18466 @noindent
18467   RM References:  13.09.01 (10)
18468
18469 @item
18470 @emph{AI-0193 Alignment of allocators (2010-09-16)}
18471 @cindex AI-0193 (Ada 2012 feature)
18472
18473 @noindent
18474   This AI introduces a new attribute @code{Max_Alignment_For_Allocation},
18475   analogous to @code{Max_Size_In_Storage_Elements}, but for alignment instead
18476   of size.
18477
18478 @noindent
18479   RM References:  13.11 (16)   13.11 (21)   13.11.01 (0)   13.11.01 (1)
18480   13.11.01 (2)   13.11.01 (3)
18481
18482
18483 @item
18484 @emph{AI-0177 Parameterized expressions (2010-07-10)}
18485 @cindex AI-0177 (Ada 2012 feature)
18486
18487 @noindent
18488   The new Ada 2012 notion of parameterized expressions is implemented. The form
18489   is:
18490 @smallexample
18491   @i{function specification} @b{is} (@i{expression})
18492 @end smallexample
18493
18494 @noindent
18495   This is exactly equivalent to the
18496   corresponding function body that returns the expression, but it can appear
18497   in a package spec. Note that the expression must be parenthesized.
18498
18499 @noindent
18500   RM References:  13.11.01 (3/2)
18501
18502 @item
18503 @emph{AI-0033 Attach/Interrupt_Handler in generic (2010-07-24)}
18504 @cindex AI-0033 (Ada 2012 feature)
18505
18506 @noindent
18507   Neither of these two pragmas may appear within a generic template, because
18508   the generic might be instantiated at other than the library level.
18509
18510 @noindent
18511   RM References:  13.11.02 (16)   C.03.01 (7/2)   C.03.01 (8/2)
18512
18513
18514 @item
18515 @emph{AI-0161 Restriction No_Default_Stream_Attributes (2010-09-11)}
18516 @cindex AI-0161 (Ada 2012 feature)
18517
18518 @noindent
18519   A new restriction @code{No_Default_Stream_Attributes} prevents the use of any
18520   of the default stream attributes for elementary types. If this restriction is
18521   in force, then it is necessary to provide explicit subprograms for any
18522   stream attributes used.
18523
18524 @noindent
18525   RM References:  13.12.01 (4/2)   13.13.02 (40/2)   13.13.02 (52/2)
18526
18527 @item
18528 @emph{AI-0194 Value of Stream_Size attribute (0000-00-00)}
18529 @cindex AI-0194 (Ada 2012 feature)
18530
18531 @noindent
18532   The @code{Stream_Size} attribute returns the default number of bits in the
18533   stream representation of the given type.
18534   This value is not affected by the presence
18535   of stream subprogram attributes for the type. GNAT has always implemented
18536   this interpretation.
18537
18538 @noindent
18539   RM References:  13.13.02 (1.2/2)
18540
18541 @item
18542 @emph{AI-0109 Redundant check in S'Class'Input (0000-00-00)}
18543 @cindex AI-0109 (Ada 2012 feature)
18544
18545 @noindent
18546   This AI is an editorial change only. It removes the need for a tag check
18547   that can never fail.
18548
18549 @noindent
18550   RM References:  13.13.02 (34/2)
18551
18552 @item
18553 @emph{AI-0007 Stream read and private scalar types (0000-00-00)}
18554 @cindex AI-0007 (Ada 2012 feature)
18555
18556 @noindent
18557   The RM as written appeared to limit the possibilities of declaring read
18558   attribute procedures for private scalar types. This limitation was not
18559   intended, and has never been enforced by GNAT.
18560
18561 @noindent
18562   RM References:  13.13.02 (50/2)   13.13.02 (51/2)
18563
18564
18565 @item
18566 @emph{AI-0065 Remote access types and external streaming (0000-00-00)}
18567 @cindex AI-0065 (Ada 2012 feature)
18568
18569 @noindent
18570   This AI clarifies the fact that all remote access types support external
18571   streaming. This fixes an obvious oversight in the definition of the
18572   language, and GNAT always implemented the intended correct rules.
18573
18574 @noindent
18575   RM References:  13.13.02 (52/2)
18576
18577 @item
18578 @emph{AI-0019 Freezing of primitives for tagged types (0000-00-00)}
18579 @cindex AI-0019 (Ada 2012 feature)
18580
18581 @noindent
18582   The RM suggests that primitive subprograms of a specific tagged type are
18583   frozen when the tagged type is frozen. This would be an incompatible change
18584   and is not intended. GNAT has never attempted this kind of freezing and its
18585   behavior is consistent with the recommendation of this AI.
18586
18587 @noindent
18588   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)
18589
18590 @item
18591 @emph{AI-0017 Freezing and incomplete types (0000-00-00)}
18592 @cindex AI-0017 (Ada 2012 feature)
18593
18594 @noindent
18595   So-called ``Taft-amendment types'' (i.e., types that are completed in package
18596   bodies) are not frozen by the occurrence of bodies in the
18597   enclosing declarative part. GNAT always implemented this properly.
18598
18599 @noindent
18600   RM References:  13.14 (3/1)
18601
18602
18603 @item
18604 @emph{AI-0060 Extended definition of remote access types (0000-00-00)}
18605 @cindex AI-0060 (Ada 2012 feature)
18606
18607 @noindent
18608   This AI extends the definition of remote access types to include access
18609   to limited, synchronized, protected or task class-wide interface types.
18610   GNAT already implemented this extension.
18611
18612 @noindent
18613   RM References:  A (4)   E.02.02 (9/1)   E.02.02 (9.2/1)   E.02.02 (14/2)   E.02.02 (18)
18614
18615 @item
18616 @emph{AI-0114 Classification of letters (0000-00-00)}
18617 @cindex AI-0114 (Ada 2012 feature)
18618
18619 @noindent
18620   The code points 170 (@code{FEMININE ORDINAL INDICATOR}),
18621   181 (@code{MICRO SIGN}), and
18622   186 (@code{MASCULINE ORDINAL INDICATOR}) are technically considered
18623   lower case letters by Unicode.
18624   However, they are not allowed in identifiers, and they
18625   return @code{False} to @code{Ada.Characters.Handling.Is_Letter/Is_Lower}.
18626   This behavior is consistent with that defined in Ada 95.
18627
18628 @noindent
18629   RM References:  A.03.02 (59)   A.04.06 (7)
18630
18631
18632 @item
18633 @emph{AI-0185 Ada.Wide_[Wide_]Characters.Handling (2010-07-06)}
18634 @cindex AI-0185 (Ada 2012 feature)
18635
18636 @noindent
18637   Two new packages @code{Ada.Wide_[Wide_]Characters.Handling} provide
18638   classification functions for @code{Wide_Character} and
18639   @code{Wide_Wide_Character}, as well as providing
18640   case folding routines for @code{Wide_[Wide_]Character} and
18641   @code{Wide_[Wide_]String}.
18642
18643 @noindent
18644   RM References:  A.03.05 (0)   A.03.06 (0)
18645
18646
18647 @item
18648 @emph{AI-0031 Add From parameter to Find_Token (2010-07-25)}
18649 @cindex AI-0031 (Ada 2012 feature)
18650
18651 @noindent
18652   A new version of @code{Find_Token} is added to all relevant string packages,
18653   with an extra parameter @code{From}. Instead of starting at the first
18654   character of the string, the search for a matching Token starts at the
18655   character indexed by the value of @code{From}.
18656   These procedures are available in all versions of Ada
18657   but if used in versions earlier than Ada 2012 they will generate a warning
18658   that an Ada 2012 subprogram is being used.
18659
18660 @noindent
18661   RM References:  A.04.03 (16)   A.04.03 (67)   A.04.03 (68/1)   A.04.04 (51)
18662   A.04.05 (46)
18663
18664
18665 @item
18666 @emph{AI-0056 Index on null string returns zero (0000-00-00)}
18667 @cindex AI-0056 (Ada 2012 feature)
18668
18669 @noindent
18670   The wording in the Ada 2005 RM implied an incompatible handling of the
18671   @code{Index} functions, resulting in raising an exception instead of
18672   returning zero in some situations.
18673   This was not intended and has been corrected.
18674   GNAT always returned zero, and is thus consistent with this AI.
18675
18676 @noindent
18677   RM References:  A.04.03 (56.2/2)   A.04.03 (58.5/2)
18678
18679
18680 @item
18681 @emph{AI-0137 String encoding package (2010-03-25)}
18682 @cindex AI-0137 (Ada 2012 feature)
18683
18684 @noindent
18685   The packages @code{Ada.Strings.UTF_Encoding}, together with its child
18686   packages, @code{Conversions}, @code{Strings}, @code{Wide_Strings},
18687   and @code{Wide_Wide_Strings} have been
18688   implemented. These packages (whose documentation can be found in the spec
18689   files @file{a-stuten.ads}, @file{a-suenco.ads}, @file{a-suenst.ads},
18690   @file{a-suewst.ads}, @file{a-suezst.ads}) allow encoding and decoding of
18691   @code{String}, @code{Wide_String}, and @code{Wide_Wide_String}
18692   values using UTF coding schemes (including UTF-8, UTF-16LE, UTF-16BE, and
18693   UTF-16), as well as conversions between the different UTF encodings. With
18694   the exception of @code{Wide_Wide_Strings}, these packages are available in
18695   Ada 95 and Ada 2005 mode as well as Ada 2012 mode.
18696   The @code{Wide_Wide_Strings package}
18697   is available in Ada 2005 mode as well as Ada 2012 mode (but not in Ada 95
18698   mode since it uses @code{Wide_Wide_Character}).
18699
18700 @noindent
18701   RM References:  A.04.11
18702
18703 @item
18704 @emph{AI-0038 Minor errors in Text_IO (0000-00-00)}
18705 @cindex AI-0038 (Ada 2012 feature)
18706
18707 @noindent
18708   These are minor errors in the description on three points. The intent on
18709   all these points has always been clear, and GNAT has always implemented the
18710   correct intended semantics.
18711
18712 @noindent
18713   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)
18714
18715 @item
18716 @emph{AI-0044 Restrictions on container instantiations (0000-00-00)}
18717 @cindex AI-0044 (Ada 2012 feature)
18718
18719 @noindent
18720   This AI places restrictions on allowed instantiations of generic containers.
18721   These restrictions are not checked by the compiler, so there is nothing to
18722   change in the implementation. This affects only the RM documentation.
18723
18724 @noindent
18725   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)
18726
18727 @item
18728 @emph{AI-0127 Adding Locale Capabilities (2010-09-29)}
18729 @cindex AI-0127 (Ada 2012 feature)
18730
18731 @noindent
18732   This package provides an interface for identifying the current locale.
18733
18734 @noindent
18735   RM References:  A.19    A.19.01    A.19.02    A.19.03    A.19.05    A.19.06
18736   A.19.07    A.19.08    A.19.09    A.19.10    A.19.11    A.19.12    A.19.13
18737
18738
18739
18740 @item
18741 @emph{AI-0002 Export C with unconstrained arrays (0000-00-00)}
18742 @cindex AI-0002 (Ada 2012 feature)
18743
18744 @noindent
18745   The compiler is not required to support exporting an Ada subprogram with
18746   convention C if there are parameters or a return type of an unconstrained
18747   array type (such as @code{String}). GNAT allows such declarations but
18748   generates warnings. It is possible, but complicated, to write the
18749   corresponding C code and certainly such code would be specific to GNAT and
18750   non-portable.
18751
18752 @noindent
18753   RM References:  B.01 (17)   B.03 (62)   B.03 (71.1/2)
18754
18755
18756 @item
18757 @emph{AI-0216 No_Task_Hierarchy forbids local tasks (0000-00-00)}
18758 @cindex AI05-0216 (Ada 2012 feature)
18759
18760 @noindent
18761   It is clearly the intention that @code{No_Task_Hierarchy} is intended to
18762   forbid tasks declared locally within subprograms, or functions returning task
18763   objects, and that is the implementation that GNAT has always provided.
18764   However the language in the RM was not sufficiently clear on this point.
18765   Thus this is a documentation change in the RM only.
18766
18767 @noindent
18768   RM References:  D.07 (3/3)
18769
18770 @item
18771 @emph{AI-0211 No_Relative_Delays forbids Set_Handler use (2010-07-09)}
18772 @cindex AI-0211 (Ada 2012 feature)
18773
18774 @noindent
18775   The restriction @code{No_Relative_Delays} forbids any calls to the subprogram
18776   @code{Ada.Real_Time.Timing_Events.Set_Handler}.
18777
18778 @noindent
18779   RM References:  D.07 (5)   D.07 (10/2)   D.07 (10.4/2)   D.07 (10.7/2)
18780
18781 @item
18782 @emph{AI-0190 pragma Default_Storage_Pool (2010-09-15)}
18783 @cindex AI-0190 (Ada 2012 feature)
18784
18785 @noindent
18786   This AI introduces a new pragma @code{Default_Storage_Pool}, which can be
18787   used to control storage pools globally.
18788   In particular, you can force every access
18789   type that is used for allocation (@b{new}) to have an explicit storage pool,
18790   or you can declare a pool globally to be used for all access types that lack
18791   an explicit one.
18792
18793 @noindent
18794   RM References:  D.07 (8)
18795
18796 @item
18797 @emph{AI-0189 No_Allocators_After_Elaboration (2010-01-23)}
18798 @cindex AI-0189 (Ada 2012 feature)
18799
18800 @noindent
18801   This AI introduces a new restriction @code{No_Allocators_After_Elaboration},
18802   which says that no dynamic allocation will occur once elaboration is
18803   completed.
18804   In general this requires a run-time check, which is not required, and which
18805   GNAT does not attempt. But the static cases of allocators in a task body or
18806   in the body of the main program are detected and flagged at compile or bind
18807   time.
18808
18809 @noindent
18810   RM References:  D.07 (19.1/2)   H.04 (23.3/2)
18811
18812 @item
18813 @emph{AI-0171 Pragma CPU and Ravenscar Profile (2010-09-24)}
18814 @cindex AI-0171 (Ada 2012 feature)
18815
18816 @noindent
18817   A new package @code{System.Multiprocessors} is added, together with the
18818   definition of pragma @code{CPU} for controlling task affinity. A new no
18819   dependence restriction, on @code{System.Multiprocessors.Dispatching_Domains},
18820   is added to the Ravenscar profile.
18821
18822 @noindent
18823   RM References:  D.13.01 (4/2)   D.16
18824
18825
18826 @item
18827 @emph{AI-0210 Correct Timing_Events metric (0000-00-00)}
18828 @cindex AI-0210 (Ada 2012 feature)
18829
18830 @noindent
18831   This is a documentation only issue regarding wording of metric requirements,
18832   that does not affect the implementation of the compiler.
18833
18834 @noindent
18835   RM References:  D.15 (24/2)
18836
18837
18838 @item
18839 @emph{AI-0206 Remote types packages and preelaborate (2010-07-24)}
18840 @cindex AI-0206 (Ada 2012 feature)
18841
18842 @noindent
18843   Remote types packages are now allowed to depend on preelaborated packages.
18844   This was formerly considered illegal.
18845
18846 @noindent
18847   RM References:  E.02.02 (6)
18848
18849
18850
18851 @item
18852 @emph{AI-0152 Restriction No_Anonymous_Allocators (2010-09-08)}
18853 @cindex AI-0152 (Ada 2012 feature)
18854
18855 @noindent
18856   Restriction @code{No_Anonymous_Allocators} prevents the use of allocators
18857   where the type of the returned value is an anonymous access type.
18858
18859 @noindent
18860   RM References:  H.04 (8/1)
18861 @end itemize
18862
18863
18864 @node Obsolescent Features
18865 @chapter Obsolescent Features
18866
18867 @noindent
18868 This chapter describes features that are provided by GNAT, but are
18869 considered obsolescent since there are preferred ways of achieving
18870 the same effect. These features are provided solely for historical
18871 compatibility purposes.
18872
18873 @menu
18874 * pragma No_Run_Time::
18875 * pragma Ravenscar::
18876 * pragma Restricted_Run_Time::
18877 @end menu
18878
18879 @node pragma No_Run_Time
18880 @section pragma No_Run_Time
18881
18882 The pragma @code{No_Run_Time} is used to achieve an affect similar
18883 to the use of the "Zero Foot Print" configurable run time, but without
18884 requiring a specially configured run time. The result of using this
18885 pragma, which must be used for all units in a partition, is to restrict
18886 the use of any language features requiring run-time support code. The
18887 preferred usage is to use an appropriately configured run-time that
18888 includes just those features that are to be made accessible.
18889
18890 @node pragma Ravenscar
18891 @section pragma Ravenscar
18892
18893 The pragma @code{Ravenscar} has exactly the same effect as pragma
18894 @code{Profile (Ravenscar)}. The latter usage is preferred since it
18895 is part of the new Ada 2005 standard.
18896
18897 @node pragma Restricted_Run_Time
18898 @section pragma Restricted_Run_Time
18899
18900 The pragma @code{Restricted_Run_Time} has exactly the same effect as
18901 pragma @code{Profile (Restricted)}. The latter usage is
18902 preferred since the Ada 2005 pragma @code{Profile} is intended for
18903 this kind of implementation dependent addition.
18904
18905 @include fdl.texi
18906 @c GNU Free Documentation License
18907
18908 @node Index,,GNU Free Documentation License, Top
18909 @unnumbered Index
18910
18911 @printindex cp
18912
18913 @contents
18914
18915 @bye