| \input texinfo @c -*-texinfo-*- |
| |
| @c %**start of header |
| |
| @c oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo |
| @c o |
| @c GNAT DOCUMENTATION o |
| @c o |
| @c G N A T _ RM o |
| @c o |
| @c Copyright (C) 1995-2003 Free Software Foundation o |
| @c o |
| @c o |
| @c GNAT is maintained by Ada Core Technologies Inc (http://www.gnat.com). o |
| @c o |
| @c oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo |
| |
| @setfilename gnat_rm.info |
| @settitle GNAT Reference Manual |
| @setchapternewpage odd |
| @syncodeindex fn cp |
| |
| @include gcc-common.texi |
| |
| @dircategory GNU Ada tools |
| @direntry |
| * GNAT Reference Manual: (gnat_rm). Reference Manual for GNU Ada tools. |
| @end direntry |
| |
| @copying |
| Copyright @copyright{} 1995-2004, Free Software Foundation |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.2 |
| or any later version published by the Free Software Foundation; |
| with the Invariant Sections being ``GNU Free Documentation License'', |
| with the Front-Cover Texts being ``GNAT Reference Manual'', and with |
| no Back-Cover Texts. A copy of the license is included in the section |
| entitled ``GNU Free Documentation License''. |
| @end copying |
| |
| @titlepage |
| |
| @title GNAT Reference Manual |
| @subtitle GNAT, The GNU Ada 95 Compiler |
| @subtitle GCC version @value{version-GCC} |
| @author Ada Core Technologies, Inc. |
| |
| @page |
| @vskip 0pt plus 1filll |
| |
| @insertcopying |
| |
| @end titlepage |
| |
| @ifnottex |
| @node Top, About This Guide, (dir), (dir) |
| @top GNAT Reference Manual |
| |
| @noindent |
| GNAT Reference Manual |
| |
| @noindent |
| GNAT, The GNU Ada 95 Compiler@* |
| Version @value{gnat_version}@* |
| Document revision level $Revision: 1.381 $@* |
| Date: $Date: 2004/01/05 19:49:12 $ |
| |
| @noindent |
| Ada Core Technologies, Inc. |
| |
| @noindent |
| Copyright @copyright{} 1995-2003, Free Software Foundation |
| |
| @noindent |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.1 |
| or any later version published by the Free Software Foundation; |
| with the Invariant Sections being ``GNU Free Documentation License'', with the |
| Front-Cover Texts being ``GNAT Reference Manual'', and with no Back-Cover |
| Texts. A copy of the license is included in the section entitled ``GNU |
| Free Documentation License''. |
| |
| @menu |
| * About This Guide:: |
| * Implementation Defined Pragmas:: |
| * Implementation Defined Attributes:: |
| * Implementation Advice:: |
| * Implementation Defined Characteristics:: |
| * Intrinsic Subprograms:: |
| * Representation Clauses and Pragmas:: |
| * Standard Library Routines:: |
| * The Implementation of Standard I/O:: |
| * The GNAT Library:: |
| * Interfacing to Other Languages:: |
| * Specialized Needs Annexes:: |
| * Implementation of Specific Ada Features:: |
| * Project File Reference:: |
| * GNU Free Documentation License:: |
| * Index:: |
| |
| --- The Detailed Node Listing --- |
| |
| About This Guide |
| |
| * What This Reference Manual Contains:: |
| * Related Information:: |
| |
| Implementation Defined Pragmas |
| |
| * Pragma Abort_Defer:: |
| * Pragma Ada_83:: |
| * Pragma Ada_95:: |
| * Pragma Annotate:: |
| * Pragma Assert:: |
| * Pragma Ast_Entry:: |
| * Pragma C_Pass_By_Copy:: |
| * Pragma Comment:: |
| * Pragma Common_Object:: |
| * Pragma Compile_Time_Warning:: |
| * Pragma Complex_Representation:: |
| * Pragma Component_Alignment:: |
| * Pragma Convention_Identifier:: |
| * Pragma CPP_Class:: |
| * Pragma CPP_Constructor:: |
| * Pragma CPP_Virtual:: |
| * Pragma CPP_Vtable:: |
| * Pragma Debug:: |
| * Pragma Elaboration_Checks:: |
| * Pragma Eliminate:: |
| * Pragma Export_Exception:: |
| * Pragma Export_Function:: |
| * Pragma Export_Object:: |
| * Pragma Export_Procedure:: |
| * Pragma Export_Value:: |
| * Pragma Export_Valued_Procedure:: |
| * Pragma Extend_System:: |
| * Pragma External:: |
| * Pragma External_Name_Casing:: |
| * Pragma Finalize_Storage_Only:: |
| * Pragma Float_Representation:: |
| * Pragma Ident:: |
| * Pragma Import_Exception:: |
| * Pragma Import_Function:: |
| * Pragma Import_Object:: |
| * Pragma Import_Procedure:: |
| * Pragma Import_Valued_Procedure:: |
| * Pragma Initialize_Scalars:: |
| * Pragma Inline_Always:: |
| * Pragma Inline_Generic:: |
| * Pragma Interface:: |
| * Pragma Interface_Name:: |
| * Pragma Interrupt_Handler:: |
| * Pragma Interrupt_State:: |
| * Pragma Keep_Names:: |
| * Pragma License:: |
| * Pragma Link_With:: |
| * Pragma Linker_Alias:: |
| * Pragma Linker_Section:: |
| * Pragma Long_Float:: |
| * Pragma Machine_Attribute:: |
| * Pragma Main_Storage:: |
| * Pragma No_Return:: |
| * Pragma Normalize_Scalars:: |
| * Pragma Obsolescent:: |
| * Pragma Passive:: |
| * Pragma Polling:: |
| * Pragma Propagate_Exceptions:: |
| * Pragma Psect_Object:: |
| * Pragma Pure_Function:: |
| * Pragma Ravenscar:: |
| * Pragma Restricted_Run_Time:: |
| * Pragma Restriction_Warnings:: |
| * Pragma Source_File_Name:: |
| * Pragma Source_File_Name_Project:: |
| * Pragma Source_Reference:: |
| * Pragma Stream_Convert:: |
| * Pragma Style_Checks:: |
| * Pragma Subtitle:: |
| * Pragma Suppress_All:: |
| * Pragma Suppress_Exception_Locations:: |
| * Pragma Suppress_Initialization:: |
| * Pragma Task_Info:: |
| * Pragma Task_Name:: |
| * Pragma Task_Storage:: |
| * Pragma Thread_Body:: |
| * Pragma Time_Slice:: |
| * Pragma Title:: |
| * Pragma Unchecked_Union:: |
| * Pragma Unimplemented_Unit:: |
| * Pragma Universal_Data:: |
| * Pragma Unreferenced:: |
| * Pragma Unreserve_All_Interrupts:: |
| * Pragma Unsuppress:: |
| * Pragma Use_VADS_Size:: |
| * Pragma Validity_Checks:: |
| * Pragma Volatile:: |
| * Pragma Warnings:: |
| * Pragma Weak_External:: |
| |
| Implementation Defined Attributes |
| |
| * Abort_Signal:: |
| * Address_Size:: |
| * Asm_Input:: |
| * Asm_Output:: |
| * AST_Entry:: |
| * Bit:: |
| * Bit_Position:: |
| * Code_Address:: |
| * Default_Bit_Order:: |
| * Elaborated:: |
| * Elab_Body:: |
| * Elab_Spec:: |
| * Emax:: |
| * Enum_Rep:: |
| * Epsilon:: |
| * Fixed_Value:: |
| * Has_Discriminants:: |
| * Img:: |
| * Integer_Value:: |
| * Large:: |
| * Machine_Size:: |
| * Mantissa:: |
| * Max_Interrupt_Priority:: |
| * Max_Priority:: |
| * Maximum_Alignment:: |
| * Mechanism_Code:: |
| * Null_Parameter:: |
| * Object_Size:: |
| * Passed_By_Reference:: |
| * Range_Length:: |
| * Safe_Emax:: |
| * Safe_Large:: |
| * Small:: |
| * Storage_Unit:: |
| * Target_Name:: |
| * Tick:: |
| * To_Address:: |
| * Type_Class:: |
| * UET_Address:: |
| * Unconstrained_Array:: |
| * Universal_Literal_String:: |
| * Unrestricted_Access:: |
| * VADS_Size:: |
| * Value_Size:: |
| * Wchar_T_Size:: |
| * Word_Size:: |
| |
| The Implementation of Standard I/O |
| |
| * Standard I/O Packages:: |
| * FORM Strings:: |
| * Direct_IO:: |
| * Sequential_IO:: |
| * Text_IO:: |
| * Wide_Text_IO:: |
| * Stream_IO:: |
| * Shared Files:: |
| * Open Modes:: |
| * Operations on C Streams:: |
| * Interfacing to C Streams:: |
| |
| The GNAT Library |
| |
| * Ada.Characters.Latin_9 (a-chlat9.ads):: |
| * Ada.Characters.Wide_Latin_1 (a-cwila1.ads):: |
| * Ada.Characters.Wide_Latin_9 (a-cwila9.ads):: |
| * Ada.Command_Line.Remove (a-colire.ads):: |
| * Ada.Command_Line.Environment (a-colien.ads):: |
| * Ada.Direct_IO.C_Streams (a-diocst.ads):: |
| * Ada.Exceptions.Is_Null_Occurrence (a-einuoc.ads):: |
| * Ada.Exceptions.Traceback (a-exctra.ads):: |
| * Ada.Sequential_IO.C_Streams (a-siocst.ads):: |
| * Ada.Streams.Stream_IO.C_Streams (a-ssicst.ads):: |
| * Ada.Strings.Unbounded.Text_IO (a-suteio.ads):: |
| * Ada.Strings.Wide_Unbounded.Wide_Text_IO (a-swuwti.ads):: |
| * Ada.Text_IO.C_Streams (a-tiocst.ads):: |
| * Ada.Wide_Text_IO.C_Streams (a-wtcstr.ads):: |
| * GNAT.Array_Split (g-arrspl.ads):: |
| * GNAT.AWK (g-awk.ads):: |
| * GNAT.Bounded_Buffers (g-boubuf.ads):: |
| * GNAT.Bounded_Mailboxes (g-boumai.ads):: |
| * GNAT.Bubble_Sort (g-bubsor.ads):: |
| * GNAT.Bubble_Sort_A (g-busora.ads):: |
| * GNAT.Bubble_Sort_G (g-busorg.ads):: |
| * GNAT.Calendar (g-calend.ads):: |
| * GNAT.Calendar.Time_IO (g-catiio.ads):: |
| * GNAT.Case_Util (g-casuti.ads):: |
| * GNAT.CGI (g-cgi.ads):: |
| * GNAT.CGI.Cookie (g-cgicoo.ads):: |
| * GNAT.CGI.Debug (g-cgideb.ads):: |
| * GNAT.Command_Line (g-comlin.ads):: |
| * GNAT.Compiler_Version (g-comver.ads):: |
| * GNAT.Ctrl_C (g-ctrl_c.ads):: |
| * GNAT.CRC32 (g-crc32.ads):: |
| * GNAT.Current_Exception (g-curexc.ads):: |
| * GNAT.Debug_Pools (g-debpoo.ads):: |
| * GNAT.Debug_Utilities (g-debuti.ads):: |
| * GNAT.Directory_Operations (g-dirope.ads):: |
| * GNAT.Dynamic_HTables (g-dynhta.ads):: |
| * GNAT.Dynamic_Tables (g-dyntab.ads):: |
| * GNAT.Exception_Actions (g-excact.ads):: |
| * GNAT.Exception_Traces (g-exctra.ads):: |
| * GNAT.Exceptions (g-except.ads):: |
| * GNAT.Expect (g-expect.ads):: |
| * GNAT.Float_Control (g-flocon.ads):: |
| * GNAT.Heap_Sort (g-heasor.ads):: |
| * GNAT.Heap_Sort_A (g-hesora.ads):: |
| * GNAT.Heap_Sort_G (g-hesorg.ads):: |
| * GNAT.HTable (g-htable.ads):: |
| * GNAT.IO (g-io.ads):: |
| * GNAT.IO_Aux (g-io_aux.ads):: |
| * GNAT.Lock_Files (g-locfil.ads):: |
| * GNAT.MD5 (g-md5.ads):: |
| * GNAT.Memory_Dump (g-memdum.ads):: |
| * GNAT.Most_Recent_Exception (g-moreex.ads):: |
| * GNAT.OS_Lib (g-os_lib.ads):: |
| * GNAT.Perfect_Hash.Generators (g-pehage.ads):: |
| * GNAT.Regexp (g-regexp.ads):: |
| * GNAT.Registry (g-regist.ads):: |
| * GNAT.Regpat (g-regpat.ads):: |
| * GNAT.Secondary_Stack_Info (g-sestin.ads):: |
| * GNAT.Semaphores (g-semaph.ads):: |
| * GNAT.Signals (g-signal.ads):: |
| * GNAT.Sockets (g-socket.ads):: |
| * GNAT.Source_Info (g-souinf.ads):: |
| * GNAT.Spell_Checker (g-speche.ads):: |
| * GNAT.Spitbol.Patterns (g-spipat.ads):: |
| * GNAT.Spitbol (g-spitbo.ads):: |
| * GNAT.Spitbol.Table_Boolean (g-sptabo.ads):: |
| * GNAT.Spitbol.Table_Integer (g-sptain.ads):: |
| * GNAT.Spitbol.Table_VString (g-sptavs.ads):: |
| * GNAT.Strings (g-string.ads):: |
| * GNAT.String_Split (g-strspl.ads):: |
| * GNAT.Table (g-table.ads):: |
| * GNAT.Task_Lock (g-tasloc.ads):: |
| * GNAT.Threads (g-thread.ads):: |
| * GNAT.Traceback (g-traceb.ads):: |
| * GNAT.Traceback.Symbolic (g-trasym.ads):: |
| * GNAT.Wide_String_Split (g-wistsp.ads):: |
| * Interfaces.C.Extensions (i-cexten.ads):: |
| * Interfaces.C.Streams (i-cstrea.ads):: |
| * Interfaces.CPP (i-cpp.ads):: |
| * Interfaces.Os2lib (i-os2lib.ads):: |
| * Interfaces.Os2lib.Errors (i-os2err.ads):: |
| * Interfaces.Os2lib.Synchronization (i-os2syn.ads):: |
| * Interfaces.Os2lib.Threads (i-os2thr.ads):: |
| * Interfaces.Packed_Decimal (i-pacdec.ads):: |
| * Interfaces.VxWorks (i-vxwork.ads):: |
| * Interfaces.VxWorks.IO (i-vxwoio.ads):: |
| * System.Address_Image (s-addima.ads):: |
| * System.Assertions (s-assert.ads):: |
| * System.Memory (s-memory.ads):: |
| * System.Partition_Interface (s-parint.ads):: |
| * System.Task_Info (s-tasinf.ads):: |
| * System.Wch_Cnv (s-wchcnv.ads):: |
| * System.Wch_Con (s-wchcon.ads):: |
| |
| Text_IO |
| |
| * Text_IO Stream Pointer Positioning:: |
| * Text_IO Reading and Writing Non-Regular Files:: |
| * Get_Immediate:: |
| * Treating Text_IO Files as Streams:: |
| * Text_IO Extensions:: |
| * Text_IO Facilities for Unbounded Strings:: |
| |
| Wide_Text_IO |
| |
| * Wide_Text_IO Stream Pointer Positioning:: |
| * Wide_Text_IO Reading and Writing Non-Regular Files:: |
| |
| Interfacing to Other Languages |
| |
| * Interfacing to C:: |
| * Interfacing to C++:: |
| * Interfacing to COBOL:: |
| * Interfacing to Fortran:: |
| * Interfacing to non-GNAT Ada code:: |
| |
| Specialized Needs Annexes |
| |
| Implementation of Specific Ada Features |
| * Machine Code Insertions:: |
| * GNAT Implementation of Tasking:: |
| * GNAT Implementation of Shared Passive Packages:: |
| * Code Generation for Array Aggregates:: |
| |
| Project File Reference |
| |
| GNU Free Documentation License |
| |
| Index |
| @end menu |
| |
| @end ifnottex |
| |
| @node About This Guide |
| @unnumbered About This Guide |
| |
| @noindent |
| This manual contains useful information in writing programs using the |
| GNAT compiler. It includes information on implementation dependent |
| characteristics of GNAT, including all the information required by Annex |
| M of the standard. |
| |
| Ada 95 is designed to be highly portable. |
| In general, a program will have the same effect even when compiled by |
| different compilers on different platforms. |
| However, since Ada 95 is designed to be used in a |
| wide variety of applications, it also contains a number of system |
| dependent features to be used in interfacing to the external world. |
| @cindex Implementation-dependent features |
| @cindex Portability |
| |
| Note: Any program that makes use of implementation-dependent features |
| may be non-portable. You should follow good programming practice and |
| isolate and clearly document any sections of your program that make use |
| of these features in a non-portable manner. |
| |
| @menu |
| * What This Reference Manual Contains:: |
| * Conventions:: |
| * Related Information:: |
| @end menu |
| |
| @node What This Reference Manual Contains |
| @unnumberedsec What This Reference Manual Contains |
| |
| @noindent |
| This reference manual contains the following chapters: |
| |
| @itemize @bullet |
| @item |
| @ref{Implementation Defined Pragmas}, lists GNAT implementation-dependent |
| pragmas, which can be used to extend and enhance the functionality of the |
| compiler. |
| |
| @item |
| @ref{Implementation Defined Attributes}, lists GNAT |
| implementation-dependent attributes which can be used to extend and |
| enhance the functionality of the compiler. |
| |
| @item |
| @ref{Implementation Advice}, provides information on generally |
| desirable behavior which are not requirements that all compilers must |
| follow since it cannot be provided on all systems, or which may be |
| undesirable on some systems. |
| |
| @item |
| @ref{Implementation Defined Characteristics}, provides a guide to |
| minimizing implementation dependent features. |
| |
| @item |
| @ref{Intrinsic Subprograms}, describes the intrinsic subprograms |
| implemented by GNAT, and how they can be imported into user |
| application programs. |
| |
| @item |
| @ref{Representation Clauses and Pragmas}, describes in detail the |
| way that GNAT represents data, and in particular the exact set |
| of representation clauses and pragmas that is accepted. |
| |
| @item |
| @ref{Standard Library Routines}, provides a listing of packages and a |
| brief description of the functionality that is provided by Ada's |
| extensive set of standard library routines as implemented by GNAT@. |
| |
| @item |
| @ref{The Implementation of Standard I/O}, details how the GNAT |
| implementation of the input-output facilities. |
| |
| @item |
| @ref{The GNAT Library}, is a catalog of packages that complement |
| the Ada predefined library. |
| |
| @item |
| @ref{Interfacing to Other Languages}, describes how programs |
| written in Ada using GNAT can be interfaced to other programming |
| languages. |
| |
| @ref{Specialized Needs Annexes}, describes the GNAT implementation of all |
| of the specialized needs annexes. |
| |
| @item |
| @ref{Implementation of Specific Ada Features}, discusses issues related |
| to GNAT's implementation of machine code insertions, tasking, and several |
| other features. |
| |
| @item |
| @ref{Project File Reference}, presents the syntax and semantics |
| of project files. |
| |
| @end itemize |
| |
| @cindex Ada 95 ISO/ANSI Standard |
| @noindent |
| This reference manual assumes that you are familiar with Ada 95 |
| language, as described in the International Standard |
| ANSI/ISO/IEC-8652:1995, Jan 1995. |
| |
| @node Conventions |
| @unnumberedsec Conventions |
| @cindex Conventions, typographical |
| @cindex Typographical conventions |
| |
| @noindent |
| Following are examples of the typographical and graphic conventions used |
| in this guide: |
| |
| @itemize @bullet |
| @item |
| @code{Functions}, @code{utility program names}, @code{standard names}, |
| and @code{classes}. |
| |
| @item |
| @code{Option flags} |
| |
| @item |
| @file{File Names}, @samp{button names}, and @samp{field names}. |
| |
| @item |
| @code{Variables}. |
| |
| @item |
| @emph{Emphasis}. |
| |
| @item |
| [optional information or parameters] |
| |
| @item |
| Examples are described by text |
| @smallexample |
| and then shown this way. |
| @end smallexample |
| @end itemize |
| |
| @noindent |
| Commands that are entered by the user are preceded in this manual by the |
| characters @samp{$ } (dollar sign followed by space). If your system uses this |
| sequence as a prompt, then the commands will appear exactly as you see them |
| in the manual. If your system uses some other prompt, then the command will |
| appear with the @samp{$} replaced by whatever prompt character you are using. |
| |
| @node Related Information |
| @unnumberedsec Related Information |
| @noindent |
| See the following documents for further information on GNAT: |
| |
| @itemize @bullet |
| @item |
| @cite{GNAT User's Guide}, which provides information on how to use |
| the GNAT compiler system. |
| |
| @item |
| @cite{Ada 95 Reference Manual}, which contains all reference |
| material for the Ada 95 programming language. |
| |
| @item |
| @cite{Ada 95 Annotated Reference Manual}, which is an annotated version |
| of the standard reference manual cited above. The annotations describe |
| detailed aspects of the design decision, and in particular contain useful |
| sections on Ada 83 compatibility. |
| |
| @item |
| @cite{DEC Ada, Technical Overview and Comparison on DIGITAL Platforms}, |
| which contains specific information on compatibility between GNAT and |
| DEC Ada 83 systems. |
| |
| @item |
| @cite{DEC Ada, Language Reference Manual, part number AA-PYZAB-TK} which |
| describes in detail the pragmas and attributes provided by the DEC Ada 83 |
| compiler system. |
| |
| @end itemize |
| |
| @node Implementation Defined Pragmas |
| @chapter Implementation Defined Pragmas |
| |
| @noindent |
| Ada 95 defines a set of pragmas that can be used to supply additional |
| information to the compiler. These language defined pragmas are |
| implemented in GNAT and work as described in the Ada 95 Reference |
| Manual. |
| |
| In addition, Ada 95 allows implementations to define additional pragmas |
| whose meaning is defined by the implementation. GNAT provides a number |
| of these implementation-dependent pragmas which can be used to extend |
| and enhance the functionality of the compiler. This section of the GNAT |
| Reference Manual describes these additional pragmas. |
| |
| Note that any program using these pragmas may not be portable to other |
| compilers (although GNAT implements this set of pragmas on all |
| platforms). Therefore if portability to other compilers is an important |
| consideration, the use of these pragmas should be minimized. |
| |
| @menu |
| * Pragma Abort_Defer:: |
| * Pragma Ada_83:: |
| * Pragma Ada_95:: |
| * Pragma Annotate:: |
| * Pragma Assert:: |
| * Pragma Ast_Entry:: |
| * Pragma C_Pass_By_Copy:: |
| * Pragma Comment:: |
| * Pragma Common_Object:: |
| * Pragma Compile_Time_Warning:: |
| * Pragma Complex_Representation:: |
| * Pragma Component_Alignment:: |
| * Pragma Convention_Identifier:: |
| * Pragma CPP_Class:: |
| * Pragma CPP_Constructor:: |
| * Pragma CPP_Virtual:: |
| * Pragma CPP_Vtable:: |
| * Pragma Debug:: |
| * Pragma Elaboration_Checks:: |
| * Pragma Eliminate:: |
| * Pragma Export_Exception:: |
| * Pragma Export_Function:: |
| * Pragma Export_Object:: |
| * Pragma Export_Procedure:: |
| * Pragma Export_Value:: |
| * Pragma Export_Valued_Procedure:: |
| * Pragma Extend_System:: |
| * Pragma External:: |
| * Pragma External_Name_Casing:: |
| * Pragma Finalize_Storage_Only:: |
| * Pragma Float_Representation:: |
| * Pragma Ident:: |
| * Pragma Import_Exception:: |
| * Pragma Import_Function:: |
| * Pragma Import_Object:: |
| * Pragma Import_Procedure:: |
| * Pragma Import_Valued_Procedure:: |
| * Pragma Initialize_Scalars:: |
| * Pragma Inline_Always:: |
| * Pragma Inline_Generic:: |
| * Pragma Interface:: |
| * Pragma Interface_Name:: |
| * Pragma Interrupt_Handler:: |
| * Pragma Interrupt_State:: |
| * Pragma Keep_Names:: |
| * Pragma License:: |
| * Pragma Link_With:: |
| * Pragma Linker_Alias:: |
| * Pragma Linker_Section:: |
| * Pragma Long_Float:: |
| * Pragma Machine_Attribute:: |
| * Pragma Main_Storage:: |
| * Pragma No_Return:: |
| * Pragma Normalize_Scalars:: |
| * Pragma Obsolescent:: |
| * Pragma Passive:: |
| * Pragma Polling:: |
| * Pragma Propagate_Exceptions:: |
| * Pragma Psect_Object:: |
| * Pragma Pure_Function:: |
| * Pragma Ravenscar:: |
| * Pragma Restricted_Run_Time:: |
| * Pragma Restriction_Warnings:: |
| * Pragma Source_File_Name:: |
| * Pragma Source_File_Name_Project:: |
| * Pragma Source_Reference:: |
| * Pragma Stream_Convert:: |
| * Pragma Style_Checks:: |
| * Pragma Subtitle:: |
| * Pragma Suppress_All:: |
| * Pragma Suppress_Exception_Locations:: |
| * Pragma Suppress_Initialization:: |
| * Pragma Task_Info:: |
| * Pragma Task_Name:: |
| * Pragma Task_Storage:: |
| * Pragma Thread_Body:: |
| * Pragma Time_Slice:: |
| * Pragma Title:: |
| * Pragma Unchecked_Union:: |
| * Pragma Unimplemented_Unit:: |
| * Pragma Universal_Data:: |
| * Pragma Unreferenced:: |
| * Pragma Unreserve_All_Interrupts:: |
| * Pragma Unsuppress:: |
| * Pragma Use_VADS_Size:: |
| * Pragma Validity_Checks:: |
| * Pragma Volatile:: |
| * Pragma Warnings:: |
| * Pragma Weak_External:: |
| @end menu |
| |
| @node Pragma Abort_Defer |
| @unnumberedsec Pragma Abort_Defer |
| @findex Abort_Defer |
| @cindex Deferring aborts |
| @noindent |
| Syntax: |
| @smallexample |
| pragma Abort_Defer; |
| @end smallexample |
| |
| @noindent |
| This pragma must appear at the start of the statement sequence of a |
| handled sequence of statements (right after the @code{begin}). It has |
| the effect of deferring aborts for the sequence of statements (but not |
| for the declarations or handlers, if any, associated with this statement |
| sequence). |
| |
| @node Pragma Ada_83 |
| @unnumberedsec Pragma Ada_83 |
| @findex Ada_83 |
| @noindent |
| Syntax: |
| @smallexample @c ada |
| pragma Ada_83; |
| @end smallexample |
| |
| @noindent |
| A configuration pragma that establishes Ada 83 mode for the unit to |
| which it applies, regardless of the mode set by the command line |
| switches. In Ada 83 mode, GNAT attempts to be as compatible with |
| the syntax and semantics of Ada 83, as defined in the original Ada |
| 83 Reference Manual as possible. In particular, the new Ada 95 |
| keywords are not recognized, optional package bodies are allowed, |
| and generics may name types with unknown discriminants without using |
| the @code{(<>)} notation. In addition, some but not all of the additional |
| restrictions of Ada 83 are enforced. |
| |
| Ada 83 mode is intended for two purposes. Firstly, it allows existing |
| legacy Ada 83 code to be compiled and adapted to GNAT with less effort. |
| Secondly, it aids in keeping code backwards compatible with Ada 83. |
| However, there is no guarantee that code that is processed correctly |
| by GNAT in Ada 83 mode will in fact compile and execute with an Ada |
| 83 compiler, since GNAT does not enforce all the additional checks |
| required by Ada 83. |
| |
| @node Pragma Ada_95 |
| @unnumberedsec Pragma Ada_95 |
| @findex Ada_95 |
| @noindent |
| Syntax: |
| @smallexample @c ada |
| pragma Ada_95; |
| @end smallexample |
| |
| @noindent |
| A configuration pragma that establishes Ada 95 mode for the unit to which |
| it applies, regardless of the mode set by the command line switches. |
| This mode is set automatically for the @code{Ada} and @code{System} |
| packages and their children, so you need not specify it in these |
| contexts. This pragma is useful when writing a reusable component that |
| itself uses Ada 95 features, but which is intended to be usable from |
| either Ada 83 or Ada 95 programs. |
| |
| @node Pragma Annotate |
| @unnumberedsec Pragma Annotate |
| @findex Annotate |
| @noindent |
| Syntax: |
| @smallexample @c ada |
| pragma Annotate (IDENTIFIER @{, ARG@}); |
| |
| ARG ::= NAME | EXPRESSION |
| @end smallexample |
| |
| @noindent |
| This pragma is used to annotate programs. @var{identifier} identifies |
| the type of annotation. GNAT verifies this is an identifier, but does |
| not otherwise analyze it. The @var{arg} argument |
| can be either a string literal or an |
| expression. String literals are assumed to be of type |
| @code{Standard.String}. Names of entities are simply analyzed as entity |
| names. All other expressions are analyzed as expressions, and must be |
| unambiguous. |
| |
| The analyzed pragma is retained in the tree, but not otherwise processed |
| by any part of the GNAT compiler. This pragma is intended for use by |
| external tools, including ASIS@. |
| |
| @node Pragma Assert |
| @unnumberedsec Pragma Assert |
| @findex Assert |
| @noindent |
| Syntax: |
| @smallexample @c ada |
| pragma Assert ( |
| boolean_EXPRESSION |
| [, static_string_EXPRESSION]); |
| @end smallexample |
| |
| @noindent |
| The effect of this pragma depends on whether the corresponding command |
| line switch is set to activate assertions. The pragma expands into code |
| equivalent to the following: |
| |
| @smallexample @c ada |
| if assertions-enabled then |
| if not boolean_EXPRESSION then |
| System.Assertions.Raise_Assert_Failure |
| (string_EXPRESSION); |
| end if; |
| end if; |
| @end smallexample |
| |
| @noindent |
| The string argument, if given, is the message that will be associated |
| with the exception occurrence if the exception is raised. If no second |
| argument is given, the default message is @samp{@var{file}:@var{nnn}}, |
| where @var{file} is the name of the source file containing the assert, |
| and @var{nnn} is the line number of the assert. A pragma is not a |
| statement, so if a statement sequence contains nothing but a pragma |
| assert, then a null statement is required in addition, as in: |
| |
| @smallexample @c ada |
| @dots{} |
| if J > 3 then |
| pragma Assert (K > 3, "Bad value for K"); |
| null; |
| end if; |
| @end smallexample |
| |
| @noindent |
| Note that, as with the @code{if} statement to which it is equivalent, the |
| type of the expression is either @code{Standard.Boolean}, or any type derived |
| from this standard type. |
| |
| If assertions are disabled (switch @code{-gnata} not used), then there |
| is no effect (and in particular, any side effects from the expression |
| are suppressed). More precisely it is not quite true that the pragma |
| has no effect, since the expression is analyzed, and may cause types |
| to be frozen if they are mentioned here for the first time. |
| |
| If assertions are enabled, then the given expression is tested, and if |
| it is @code{False} then @code{System.Assertions.Raise_Assert_Failure} is called |
| which results in the raising of @code{Assert_Failure} with the given message. |
| |
| If the boolean expression has side effects, these side effects will turn |
| on and off with the setting of the assertions mode, resulting in |
| assertions that have an effect on the program. You should generally |
| avoid side effects in the expression arguments of this pragma. However, |
| the expressions are analyzed for semantic correctness whether or not |
| assertions are enabled, so turning assertions on and off cannot affect |
| the legality of a program. |
| |
| @node Pragma Ast_Entry |
| @unnumberedsec Pragma Ast_Entry |
| @cindex OpenVMS |
| @findex Ast_Entry |
| @noindent |
| Syntax: |
| @smallexample @c ada |
| pragma AST_Entry (entry_IDENTIFIER); |
| @end smallexample |
| |
| @noindent |
| This pragma is implemented only in the OpenVMS implementation of GNAT@. The |
| argument is the simple name of a single entry; at most one @code{AST_Entry} |
| pragma is allowed for any given entry. This pragma must be used in |
| conjunction with the @code{AST_Entry} attribute, and is only allowed after |
| the entry declaration and in the same task type specification or single task |
| as the entry to which it applies. This pragma specifies that the given entry |
| may be used to handle an OpenVMS asynchronous system trap (@code{AST}) |
| resulting from an OpenVMS system service call. The pragma does not affect |
| normal use of the entry. For further details on this pragma, see the |
| DEC Ada Language Reference Manual, section 9.12a. |
| |
| @node Pragma C_Pass_By_Copy |
| @unnumberedsec Pragma C_Pass_By_Copy |
| @cindex Passing by copy |
| @findex C_Pass_By_Copy |
| @noindent |
| Syntax: |
| @smallexample @c ada |
| pragma C_Pass_By_Copy |
| ([Max_Size =>] static_integer_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| Normally the default mechanism for passing C convention records to C |
| convention subprograms is to pass them by reference, as suggested by RM |
| B.3(69). Use the configuration pragma @code{C_Pass_By_Copy} to change |
| this default, by requiring that record formal parameters be passed by |
| copy if all of the following conditions are met: |
| |
| @itemize @bullet |
| @item |
| The size of the record type does not exceed@*@var{static_integer_expression}. |
| @item |
| The record type has @code{Convention C}. |
| @item |
| The formal parameter has this record type, and the subprogram has a |
| foreign (non-Ada) convention. |
| @end itemize |
| |
| @noindent |
| If these conditions are met the argument is passed by copy, i.e.@: in a |
| manner consistent with what C expects if the corresponding formal in the |
| C prototype is a struct (rather than a pointer to a struct). |
| |
| You can also pass records by copy by specifying the convention |
| @code{C_Pass_By_Copy} for the record type, or by using the extended |
| @code{Import} and @code{Export} pragmas, which allow specification of |
| passing mechanisms on a parameter by parameter basis. |
| |
| @node Pragma Comment |
| @unnumberedsec Pragma Comment |
| @findex Comment |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Comment (static_string_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This is almost identical in effect to pragma @code{Ident}. It allows the |
| placement of a comment into the object file and hence into the |
| executable file if the operating system permits such usage. The |
| difference is that @code{Comment}, unlike @code{Ident}, has |
| no limitations on placement of the pragma (it can be placed |
| anywhere in the main source unit), and if more than one pragma |
| is used, all comments are retained. |
| |
| @node Pragma Common_Object |
| @unnumberedsec Pragma Common_Object |
| @findex Common_Object |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Common_Object ( |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Size =>] EXTERNAL_SYMBOL] ); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| @end smallexample |
| |
| @noindent |
| This pragma enables the shared use of variables stored in overlaid |
| linker areas corresponding to the use of @code{COMMON} |
| in Fortran. The single |
| object @var{local_name} is assigned to the area designated by |
| the @var{External} argument. |
| You may define a record to correspond to a series |
| of fields. The @var{size} argument |
| is syntax checked in GNAT, but otherwise ignored. |
| |
| @code{Common_Object} is not supported on all platforms. If no |
| support is available, then the code generator will issue a message |
| indicating that the necessary attribute for implementation of this |
| pragma is not available. |
| |
| @node Pragma Compile_Time_Warning |
| @unnumberedsec Pragma Compile_Time_Warning |
| @findex Compile_Time_Warning |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Compile_Time_Warning |
| (boolean_EXPRESSION, static_string_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This pragma can be used to generate additional compile time warnings. It |
| is particularly useful in generics, where warnings can be issued for |
| specific problematic instantiations. The first parameter is a boolean |
| expression. The pragma is effective only if the value of this expression |
| is known at compile time, and has the value True. The set of expressions |
| whose values are known at compile time includes all static boolean |
| expressions, and also other values which the compiler can determine |
| at compile time (e.g. the size of a record type set by an explicit |
| size representation clause, or the value of a variable which was |
| initialized to a constant and is known not to have been modified). |
| If these conditions are met, a warning message is generated using |
| the value given as the second argument. This string value may contain |
| embedded ASCII.LF characters to break the message into multiple lines. |
| |
| @node Pragma Complex_Representation |
| @unnumberedsec Pragma Complex_Representation |
| @findex Complex_Representation |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Complex_Representation |
| ([Entity =>] LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| The @var{Entity} argument must be the name of a record type which has |
| two fields of the same floating-point type. The effect of this pragma is |
| to force gcc to use the special internal complex representation form for |
| this record, which may be more efficient. Note that this may result in |
| the code for this type not conforming to standard ABI (application |
| binary interface) requirements for the handling of record types. For |
| example, in some environments, there is a requirement for passing |
| records by pointer, and the use of this pragma may result in passing |
| this type in floating-point registers. |
| |
| @node Pragma Component_Alignment |
| @unnumberedsec Pragma Component_Alignment |
| @cindex Alignments of components |
| @findex Component_Alignment |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Component_Alignment ( |
| [Form =>] ALIGNMENT_CHOICE |
| [, [Name =>] type_LOCAL_NAME]); |
| |
| ALIGNMENT_CHOICE ::= |
| Component_Size |
| | Component_Size_4 |
| | Storage_Unit |
| | Default |
| @end smallexample |
| |
| @noindent |
| Specifies the alignment of components in array or record types. |
| The meaning of the @var{Form} argument is as follows: |
| |
| @table @code |
| @findex Component_Size |
| @item Component_Size |
| Aligns scalar components and subcomponents of the array or record type |
| on boundaries appropriate to their inherent size (naturally |
| aligned). For example, 1-byte components are aligned on byte boundaries, |
| 2-byte integer components are aligned on 2-byte boundaries, 4-byte |
| integer components are aligned on 4-byte boundaries and so on. These |
| alignment rules correspond to the normal rules for C compilers on all |
| machines except the VAX@. |
| |
| @findex Component_Size_4 |
| @item Component_Size_4 |
| Naturally aligns components with a size of four or fewer |
| bytes. Components that are larger than 4 bytes are placed on the next |
| 4-byte boundary. |
| |
| @findex Storage_Unit |
| @item Storage_Unit |
| Specifies that array or record components are byte aligned, i.e.@: |
| aligned on boundaries determined by the value of the constant |
| @code{System.Storage_Unit}. |
| |
| @cindex OpenVMS |
| @item Default |
| Specifies that array or record components are aligned on default |
| boundaries, appropriate to the underlying hardware or operating system or |
| both. For OpenVMS VAX systems, the @code{Default} choice is the same as |
| the @code{Storage_Unit} choice (byte alignment). For all other systems, |
| the @code{Default} choice is the same as @code{Component_Size} (natural |
| alignment). |
| @end table |
| |
| @noindent |
| If the @code{Name} parameter is present, @var{type_local_name} must |
| refer to a local record or array type, and the specified alignment |
| choice applies to the specified type. The use of |
| @code{Component_Alignment} together with a pragma @code{Pack} causes the |
| @code{Component_Alignment} pragma to be ignored. The use of |
| @code{Component_Alignment} together with a record representation clause |
| is only effective for fields not specified by the representation clause. |
| |
| If the @code{Name} parameter is absent, the pragma can be used as either |
| a configuration pragma, in which case it applies to one or more units in |
| accordance with the normal rules for configuration pragmas, or it can be |
| used within a declarative part, in which case it applies to types that |
| are declared within this declarative part, or within any nested scope |
| within this declarative part. In either case it specifies the alignment |
| to be applied to any record or array type which has otherwise standard |
| representation. |
| |
| If the alignment for a record or array type is not specified (using |
| pragma @code{Pack}, pragma @code{Component_Alignment}, or a record rep |
| clause), the GNAT uses the default alignment as described previously. |
| |
| @node Pragma Convention_Identifier |
| @unnumberedsec Pragma Convention_Identifier |
| @findex Convention_Identifier |
| @cindex Conventions, synonyms |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Convention_Identifier ( |
| [Name =>] IDENTIFIER, |
| [Convention =>] convention_IDENTIFIER); |
| @end smallexample |
| |
| @noindent |
| This pragma provides a mechanism for supplying synonyms for existing |
| convention identifiers. The @code{Name} identifier can subsequently |
| be used as a synonym for the given convention in other pragmas (including |
| for example pragma @code{Import} or another @code{Convention_Identifier} |
| pragma). As an example of the use of this, suppose you had legacy code |
| which used Fortran77 as the identifier for Fortran. Then the pragma: |
| |
| @smallexample @c ada |
| pragma Convention_Indentifier (Fortran77, Fortran); |
| @end smallexample |
| |
| @noindent |
| would allow the use of the convention identifier @code{Fortran77} in |
| subsequent code, avoiding the need to modify the sources. As another |
| example, you could use this to parametrize convention requirements |
| according to systems. Suppose you needed to use @code{Stdcall} on |
| windows systems, and @code{C} on some other system, then you could |
| define a convention identifier @code{Library} and use a single |
| @code{Convention_Identifier} pragma to specify which convention |
| would be used system-wide. |
| |
| @node Pragma CPP_Class |
| @unnumberedsec Pragma CPP_Class |
| @findex CPP_Class |
| @cindex Interfacing with C++ |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma CPP_Class ([Entity =>] LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| The argument denotes an entity in the current declarative region |
| that is declared as a tagged or untagged record type. It indicates that |
| the type corresponds to an externally declared C++ class type, and is to |
| be laid out the same way that C++ would lay out the type. |
| |
| If (and only if) the type is tagged, at least one component in the |
| record must be of type @code{Interfaces.CPP.Vtable_Ptr}, corresponding |
| to the C++ Vtable (or Vtables in the case of multiple inheritance) used |
| for dispatching. |
| |
| Types for which @code{CPP_Class} is specified do not have assignment or |
| equality operators defined (such operations can be imported or declared |
| as subprograms as required). Initialization is allowed only by |
| constructor functions (see pragma @code{CPP_Constructor}). |
| |
| Pragma @code{CPP_Class} is intended primarily for automatic generation |
| using an automatic binding generator tool. |
| See @ref{Interfacing to C++} for related information. |
| |
| @node Pragma CPP_Constructor |
| @unnumberedsec Pragma CPP_Constructor |
| @cindex Interfacing with C++ |
| @findex CPP_Constructor |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma CPP_Constructor ([Entity =>] LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| This pragma identifies an imported function (imported in the usual way |
| with pragma @code{Import}) as corresponding to a C++ |
| constructor. The argument is a name that must have been |
| previously mentioned in a pragma @code{Import} |
| with @code{Convention} = @code{CPP}, and must be of one of the following |
| forms: |
| |
| @itemize @bullet |
| @item |
| @code{function @var{Fname} return @var{T}'Class} |
| |
| @item |
| @code{function @var{Fname} (@dots{}) return @var{T}'Class} |
| @end itemize |
| |
| @noindent |
| where @var{T} is a tagged type to which the pragma @code{CPP_Class} applies. |
| |
| The first form is the default constructor, used when an object of type |
| @var{T} is created on the Ada side with no explicit constructor. Other |
| constructors (including the copy constructor, which is simply a special |
| case of the second form in which the one and only argument is of type |
| @var{T}), can only appear in two contexts: |
| |
| @itemize @bullet |
| @item |
| On the right side of an initialization of an object of type @var{T}. |
| @item |
| In an extension aggregate for an object of a type derived from @var{T}. |
| @end itemize |
| |
| @noindent |
| Although the constructor is described as a function that returns a value |
| on the Ada side, it is typically a procedure with an extra implicit |
| argument (the object being initialized) at the implementation |
| level. GNAT issues the appropriate call, whatever it is, to get the |
| object properly initialized. |
| |
| In the case of derived objects, you may use one of two possible forms |
| for declaring and creating an object: |
| |
| @itemize @bullet |
| @item @code{New_Object : Derived_T} |
| @item @code{New_Object : Derived_T := (@var{constructor-call with} @dots{})} |
| @end itemize |
| |
| @noindent |
| In the first case the default constructor is called and extension fields |
| if any are initialized according to the default initialization |
| expressions in the Ada declaration. In the second case, the given |
| constructor is called and the extension aggregate indicates the explicit |
| values of the extension fields. |
| |
| If no constructors are imported, it is impossible to create any objects |
| on the Ada side. If no default constructor is imported, only the |
| initialization forms using an explicit call to a constructor are |
| permitted. |
| |
| Pragma @code{CPP_Constructor} is intended primarily for automatic generation |
| using an automatic binding generator tool. |
| See @ref{Interfacing to C++} for more related information. |
| |
| @node Pragma CPP_Virtual |
| @unnumberedsec Pragma CPP_Virtual |
| @cindex Interfacing to C++ |
| @findex CPP_Virtual |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma CPP_Virtual |
| [Entity =>] ENTITY, |
| [, [Vtable_Ptr =>] vtable_ENTITY,] |
| [, [Position =>] static_integer_EXPRESSION]); |
| @end smallexample |
| |
| @noindent |
| This pragma serves the same function as pragma @code{Import} in that |
| case of a virtual function imported from C++. The @var{Entity} argument |
| must be a |
| primitive subprogram of a tagged type to which pragma @code{CPP_Class} |
| applies. The @var{Vtable_Ptr} argument specifies |
| the Vtable_Ptr component which contains the |
| entry for this virtual function. The @var{Position} argument |
| is the sequential number |
| counting virtual functions for this Vtable starting at 1. |
| |
| The @code{Vtable_Ptr} and @code{Position} arguments may be omitted if |
| there is one Vtable_Ptr present (single inheritance case) and all |
| virtual functions are imported. In that case the compiler can deduce both |
| these values. |
| |
| No @code{External_Name} or @code{Link_Name} arguments are required for a |
| virtual function, since it is always accessed indirectly via the |
| appropriate Vtable entry. |
| |
| Pragma @code{CPP_Virtual} is intended primarily for automatic generation |
| using an automatic binding generator tool. |
| See @ref{Interfacing to C++} for related information. |
| |
| @node Pragma CPP_Vtable |
| @unnumberedsec Pragma CPP_Vtable |
| @cindex Interfacing with C++ |
| @findex CPP_Vtable |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma CPP_Vtable ( |
| [Entity =>] ENTITY, |
| [Vtable_Ptr =>] vtable_ENTITY, |
| [Entry_Count =>] static_integer_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| Given a record to which the pragma @code{CPP_Class} applies, |
| this pragma can be specified for each component of type |
| @code{CPP.Interfaces.Vtable_Ptr}. |
| @var{Entity} is the tagged type, @var{Vtable_Ptr} |
| is the record field of type @code{Vtable_Ptr}, and @var{Entry_Count} is |
| the number of virtual functions on the C++ side. Not all of these |
| functions need to be imported on the Ada side. |
| |
| You may omit the @code{CPP_Vtable} pragma if there is only one |
| @code{Vtable_Ptr} component in the record and all virtual functions are |
| imported on the Ada side (the default value for the entry count in this |
| case is simply the total number of virtual functions). |
| |
| Pragma @code{CPP_Vtable} is intended primarily for automatic generation |
| using an automatic binding generator tool. |
| See @ref{Interfacing to C++} for related information. |
| |
| @node Pragma Debug |
| @unnumberedsec Pragma Debug |
| @findex Debug |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Debug (PROCEDURE_CALL_WITHOUT_SEMICOLON); |
| |
| PROCEDURE_CALL_WITHOUT_SEMICOLON ::= |
| PROCEDURE_NAME |
| | PROCEDURE_PREFIX ACTUAL_PARAMETER_PART |
| @end smallexample |
| |
| @noindent |
| The argument has the syntactic form of an expression, meeting the |
| syntactic requirements for pragmas. |
| |
| If assertions are not enabled on the command line, this pragma has no |
| effect. If asserts are enabled, the semantics of the pragma is exactly |
| equivalent to the procedure call statement corresponding to the argument |
| with a terminating semicolon. Pragmas are permitted in sequences of |
| declarations, so you can use pragma @code{Debug} to intersperse calls to |
| debug procedures in the middle of declarations. |
| |
| @node Pragma Elaboration_Checks |
| @unnumberedsec Pragma Elaboration_Checks |
| @cindex Elaboration control |
| @findex Elaboration_Checks |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Elaboration_Checks (RM | Static); |
| @end smallexample |
| |
| @noindent |
| This is a configuration pragma that provides control over the |
| elaboration model used by the compilation affected by the |
| pragma. If the parameter is RM, then the dynamic elaboration |
| model described in the Ada Reference Manual is used, as though |
| the @code{-gnatE} switch had been specified on the command |
| line. If the parameter is Static, then the default GNAT static |
| model is used. This configuration pragma overrides the setting |
| of the command line. For full details on the elaboration models |
| used by the GNAT compiler, see section ``Elaboration Order |
| Handling in GNAT'' in the @cite{GNAT User's Guide}. |
| |
| @node Pragma Eliminate |
| @unnumberedsec Pragma Eliminate |
| @cindex Elimination of unused subprograms |
| @findex Eliminate |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Eliminate ( |
| [Unit_Name =>] IDENTIFIER | |
| SELECTED_COMPONENT); |
| |
| pragma Eliminate ( |
| [Unit_Name =>] IDENTIFIER | |
| SELECTED_COMPONENT, |
| [Entity =>] IDENTIFIER | |
| SELECTED_COMPONENT | |
| STRING_LITERAL |
| [,[Parameter_Types =>] PARAMETER_TYPES] |
| [,[Result_Type =>] result_SUBTYPE_NAME] |
| [,[Homonym_Number =>] INTEGER_LITERAL]); |
| |
| PARAMETER_TYPES ::= (SUBTYPE_NAME @{, SUBTYPE_NAME@}) |
| SUBTYPE_NAME ::= STRING_LITERAL |
| @end smallexample |
| |
| @noindent |
| This pragma indicates that the given entity is not used outside the |
| compilation unit it is defined in. The entity may be either a subprogram |
| or a variable. |
| |
| If the entity to be eliminated is a library level subprogram, then |
| the first form of pragma @code{Eliminate} is used with only a single argument. |
| In this form, the @code{Unit_Name} argument specifies the name of the |
| library level unit to be eliminated. |
| |
| In all other cases, both @code{Unit_Name} and @code{Entity} arguments |
| are required. If item is an entity of a library package, then the first |
| argument specifies the unit name, and the second argument specifies |
| the particular entity. If the second argument is in string form, it must |
| correspond to the internal manner in which GNAT stores entity names (see |
| compilation unit Namet in the compiler sources for details). |
| |
| The remaining parameters are optionally used to distinguish |
| between overloaded subprograms. There are two ways of doing this. |
| |
| Use @code{Parameter_Types} and @code{Result_Type} to specify the |
| profile of the subprogram to be eliminated in a manner similar to that |
| used for |
| the extended @code{Import} and @code{Export} pragmas, except that the |
| subtype names are always given as string literals, again corresponding |
| to the internal manner in which GNAT stores entity names. |
| |
| Alternatively, the @code{Homonym_Number} parameter is used to specify |
| which overloaded alternative is to be eliminated. A value of 1 indicates |
| the first subprogram (in lexical order), 2 indicates the second etc. |
| |
| The effect of the pragma is to allow the compiler to eliminate |
| the code or data associated with the named entity. Any reference to |
| an eliminated entity outside the compilation unit it is defined in, |
| causes a compile time or link time error. |
| |
| The parameters of this pragma may be given in any order, as long as |
| the usual rules for use of named parameters and position parameters |
| are used. |
| |
| The intention of pragma @code{Eliminate} is to allow a program to be compiled |
| in a system independent manner, with unused entities eliminated, without |
| the requirement of modifying the source text. Normally the required set |
| of @code{Eliminate} pragmas is constructed automatically using the gnatelim |
| tool. Elimination of unused entities local to a compilation unit is |
| automatic, without requiring the use of pragma @code{Eliminate}. |
| |
| Note that the reason this pragma takes string literals where names might |
| be expected is that a pragma @code{Eliminate} can appear in a context where the |
| relevant names are not visible. |
| |
| @node Pragma Export_Exception |
| @unnumberedsec Pragma Export_Exception |
| @cindex OpenVMS |
| @findex Export_Exception |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Export_Exception ( |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL,] |
| [, [Form =>] Ada | VMS] |
| [, [Code =>] static_integer_EXPRESSION]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| @end smallexample |
| |
| @noindent |
| This pragma is implemented only in the OpenVMS implementation of GNAT@. It |
| causes the specified exception to be propagated outside of the Ada program, |
| so that it can be handled by programs written in other OpenVMS languages. |
| This pragma establishes an external name for an Ada exception and makes the |
| name available to the OpenVMS Linker as a global symbol. For further details |
| on this pragma, see the |
| DEC Ada Language Reference Manual, section 13.9a3.2. |
| |
| @node Pragma Export_Function |
| @unnumberedsec Pragma Export_Function |
| @cindex Argument passing mechanisms |
| @findex Export_Function |
| |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Export_Function ( |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Parameter_Types =>] PARAMETER_TYPES] |
| [, [Result_Type =>] result_SUBTYPE_MARK] |
| [, [Mechanism =>] MECHANISM] |
| [, [Result_Mechanism =>] MECHANISM_NAME]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| | "" |
| |
| PARAMETER_TYPES ::= |
| null |
| | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@} |
| |
| TYPE_DESIGNATOR ::= |
| subtype_NAME |
| | subtype_Name ' Access |
| |
| MECHANISM ::= |
| MECHANISM_NAME |
| | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@}) |
| |
| MECHANISM_ASSOCIATION ::= |
| [formal_parameter_NAME =>] MECHANISM_NAME |
| |
| MECHANISM_NAME ::= |
| Value |
| | Reference |
| @end smallexample |
| |
| @noindent |
| Use this pragma to make a function externally callable and optionally |
| provide information on mechanisms to be used for passing parameter and |
| result values. We recommend, for the purposes of improving portability, |
| this pragma always be used in conjunction with a separate pragma |
| @code{Export}, which must precede the pragma @code{Export_Function}. |
| GNAT does not require a separate pragma @code{Export}, but if none is |
| present, @code{Convention Ada} is assumed, which is usually |
| not what is wanted, so it is usually appropriate to use this |
| pragma in conjunction with a @code{Export} or @code{Convention} |
| pragma that specifies the desired foreign convention. |
| Pragma @code{Export_Function} |
| (and @code{Export}, if present) must appear in the same declarative |
| region as the function to which they apply. |
| |
| @var{internal_name} must uniquely designate the function to which the |
| pragma applies. If more than one function name exists of this name in |
| the declarative part you must use the @code{Parameter_Types} and |
| @code{Result_Type} parameters is mandatory to achieve the required |
| unique designation. @var{subtype_ mark}s in these parameters must |
| exactly match the subtypes in the corresponding function specification, |
| using positional notation to match parameters with subtype marks. |
| The form with an @code{'Access} attribute can be used to match an |
| anonymous access parameter. |
| |
| @cindex OpenVMS |
| @cindex Passing by descriptor |
| Note that passing by descriptor is not supported, even on the OpenVMS |
| ports of GNAT@. |
| |
| @cindex Suppressing external name |
| Special treatment is given if the EXTERNAL is an explicit null |
| string or a static string expressions that evaluates to the null |
| string. In this case, no external name is generated. This form |
| still allows the specification of parameter mechanisms. |
| |
| @node Pragma Export_Object |
| @unnumberedsec Pragma Export_Object |
| @findex Export_Object |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Export_Object |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Size =>] EXTERNAL_SYMBOL] |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| @end smallexample |
| |
| @noindent |
| This pragma designates an object as exported, and apart from the |
| extended rules for external symbols, is identical in effect to the use of |
| the normal @code{Export} pragma applied to an object. You may use a |
| separate Export pragma (and you probably should from the point of view |
| of portability), but it is not required. @var{Size} is syntax checked, |
| but otherwise ignored by GNAT@. |
| |
| @node Pragma Export_Procedure |
| @unnumberedsec Pragma Export_Procedure |
| @findex Export_Procedure |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Export_Procedure ( |
| [Internal =>] LOCAL_NAME |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Parameter_Types =>] PARAMETER_TYPES] |
| [, [Mechanism =>] MECHANISM]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| | "" |
| |
| PARAMETER_TYPES ::= |
| null |
| | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@} |
| |
| TYPE_DESIGNATOR ::= |
| subtype_NAME |
| | subtype_Name ' Access |
| |
| MECHANISM ::= |
| MECHANISM_NAME |
| | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@}) |
| |
| MECHANISM_ASSOCIATION ::= |
| [formal_parameter_NAME =>] MECHANISM_NAME |
| |
| MECHANISM_NAME ::= |
| Value |
| | Reference |
| @end smallexample |
| |
| @noindent |
| This pragma is identical to @code{Export_Function} except that it |
| applies to a procedure rather than a function and the parameters |
| @code{Result_Type} and @code{Result_Mechanism} are not permitted. |
| GNAT does not require a separate pragma @code{Export}, but if none is |
| present, @code{Convention Ada} is assumed, which is usually |
| not what is wanted, so it is usually appropriate to use this |
| pragma in conjunction with a @code{Export} or @code{Convention} |
| pragma that specifies the desired foreign convention. |
| |
| @cindex OpenVMS |
| @cindex Passing by descriptor |
| Note that passing by descriptor is not supported, even on the OpenVMS |
| ports of GNAT@. |
| |
| @cindex Suppressing external name |
| Special treatment is given if the EXTERNAL is an explicit null |
| string or a static string expressions that evaluates to the null |
| string. In this case, no external name is generated. This form |
| still allows the specification of parameter mechanisms. |
| |
| @node Pragma Export_Value |
| @unnumberedsec Pragma Export_Value |
| @findex Export_Value |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Export_Value ( |
| [Value =>] static_integer_EXPRESSION, |
| [Link_Name =>] static_string_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This pragma serves to export a static integer value for external use. |
| The first argument specifies the value to be exported. The Link_Name |
| argument specifies the symbolic name to be associated with the integer |
| value. This pragma is useful for defining a named static value in Ada |
| that can be referenced in assembly language units to be linked with |
| the application. This pragma is currently supported only for the |
| AAMP target and is ignored for other targets. |
| |
| @node Pragma Export_Valued_Procedure |
| @unnumberedsec Pragma Export_Valued_Procedure |
| @findex Export_Valued_Procedure |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Export_Valued_Procedure ( |
| [Internal =>] LOCAL_NAME |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Parameter_Types =>] PARAMETER_TYPES] |
| [, [Mechanism =>] MECHANISM]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| | "" |
| |
| PARAMETER_TYPES ::= |
| null |
| | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@} |
| |
| TYPE_DESIGNATOR ::= |
| subtype_NAME |
| | subtype_Name ' Access |
| |
| MECHANISM ::= |
| MECHANISM_NAME |
| | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@}) |
| |
| MECHANISM_ASSOCIATION ::= |
| [formal_parameter_NAME =>] MECHANISM_NAME |
| |
| MECHANISM_NAME ::= |
| Value |
| | Reference |
| @end smallexample |
| |
| @noindent |
| This pragma is identical to @code{Export_Procedure} except that the |
| first parameter of @var{local_name}, which must be present, must be of |
| mode @code{OUT}, and externally the subprogram is treated as a function |
| with this parameter as the result of the function. GNAT provides for |
| this capability to allow the use of @code{OUT} and @code{IN OUT} |
| parameters in interfacing to external functions (which are not permitted |
| in Ada functions). |
| GNAT does not require a separate pragma @code{Export}, but if none is |
| present, @code{Convention Ada} is assumed, which is almost certainly |
| not what is wanted since the whole point of this pragma is to interface |
| with foreign language functions, so it is usually appropriate to use this |
| pragma in conjunction with a @code{Export} or @code{Convention} |
| pragma that specifies the desired foreign convention. |
| |
| @cindex OpenVMS |
| @cindex Passing by descriptor |
| Note that passing by descriptor is not supported, even on the OpenVMS |
| ports of GNAT@. |
| |
| @cindex Suppressing external name |
| Special treatment is given if the EXTERNAL is an explicit null |
| string or a static string expressions that evaluates to the null |
| string. In this case, no external name is generated. This form |
| still allows the specification of parameter mechanisms. |
| |
| @node Pragma Extend_System |
| @unnumberedsec Pragma Extend_System |
| @cindex @code{system}, extending |
| @cindex Dec Ada 83 |
| @findex Extend_System |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Extend_System ([Name =>] IDENTIFIER); |
| @end smallexample |
| |
| @noindent |
| This pragma is used to provide backwards compatibility with other |
| implementations that extend the facilities of package @code{System}. In |
| GNAT, @code{System} contains only the definitions that are present in |
| the Ada 95 RM@. However, other implementations, notably the DEC Ada 83 |
| implementation, provide many extensions to package @code{System}. |
| |
| For each such implementation accommodated by this pragma, GNAT provides a |
| package @code{Aux_@var{xxx}}, e.g.@: @code{Aux_DEC} for the DEC Ada 83 |
| implementation, which provides the required additional definitions. You |
| can use this package in two ways. You can @code{with} it in the normal |
| way and access entities either by selection or using a @code{use} |
| clause. In this case no special processing is required. |
| |
| However, if existing code contains references such as |
| @code{System.@var{xxx}} where @var{xxx} is an entity in the extended |
| definitions provided in package @code{System}, you may use this pragma |
| to extend visibility in @code{System} in a non-standard way that |
| provides greater compatibility with the existing code. Pragma |
| @code{Extend_System} is a configuration pragma whose single argument is |
| the name of the package containing the extended definition |
| (e.g.@: @code{Aux_DEC} for the DEC Ada case). A unit compiled under |
| control of this pragma will be processed using special visibility |
| processing that looks in package @code{System.Aux_@var{xxx}} where |
| @code{Aux_@var{xxx}} is the pragma argument for any entity referenced in |
| package @code{System}, but not found in package @code{System}. |
| |
| You can use this pragma either to access a predefined @code{System} |
| extension supplied with the compiler, for example @code{Aux_DEC} or |
| you can construct your own extension unit following the above |
| definition. Note that such a package is a child of @code{System} |
| and thus is considered part of the implementation. To compile |
| it you will have to use the appropriate switch for compiling |
| system units. See the GNAT User's Guide for details. |
| |
| @node Pragma External |
| @unnumberedsec Pragma External |
| @findex External |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma External ( |
| [ Convention =>] convention_IDENTIFIER, |
| [ Entity =>] local_NAME |
| [, [External_Name =>] static_string_EXPRESSION ] |
| [, [Link_Name =>] static_string_EXPRESSION ]); |
| @end smallexample |
| |
| @noindent |
| This pragma is identical in syntax and semantics to pragma |
| @code{Export} as defined in the Ada Reference Manual. It is |
| provided for compatibility with some Ada 83 compilers that |
| used this pragma for exactly the same purposes as pragma |
| @code{Export} before the latter was standardized. |
| |
| @node Pragma External_Name_Casing |
| @unnumberedsec Pragma External_Name_Casing |
| @cindex Dec Ada 83 casing compatibility |
| @cindex External Names, casing |
| @cindex Casing of External names |
| @findex External_Name_Casing |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma External_Name_Casing ( |
| Uppercase | Lowercase |
| [, Uppercase | Lowercase | As_Is]); |
| @end smallexample |
| |
| @noindent |
| This pragma provides control over the casing of external names associated |
| with Import and Export pragmas. There are two cases to consider: |
| |
| @table @asis |
| @item Implicit external names |
| Implicit external names are derived from identifiers. The most common case |
| arises when a standard Ada 95 Import or Export pragma is used with only two |
| arguments, as in: |
| |
| @smallexample @c ada |
| pragma Import (C, C_Routine); |
| @end smallexample |
| |
| @noindent |
| Since Ada is a case insensitive language, the spelling of the identifier in |
| the Ada source program does not provide any information on the desired |
| casing of the external name, and so a convention is needed. In GNAT the |
| default treatment is that such names are converted to all lower case |
| letters. This corresponds to the normal C style in many environments. |
| The first argument of pragma @code{External_Name_Casing} can be used to |
| control this treatment. If @code{Uppercase} is specified, then the name |
| will be forced to all uppercase letters. If @code{Lowercase} is specified, |
| then the normal default of all lower case letters will be used. |
| |
| This same implicit treatment is also used in the case of extended DEC Ada 83 |
| compatible Import and Export pragmas where an external name is explicitly |
| specified using an identifier rather than a string. |
| |
| @item Explicit external names |
| Explicit external names are given as string literals. The most common case |
| arises when a standard Ada 95 Import or Export pragma is used with three |
| arguments, as in: |
| |
| @smallexample @c ada |
| pragma Import (C, C_Routine, "C_routine"); |
| @end smallexample |
| |
| @noindent |
| In this case, the string literal normally provides the exact casing required |
| for the external name. The second argument of pragma |
| @code{External_Name_Casing} may be used to modify this behavior. |
| If @code{Uppercase} is specified, then the name |
| will be forced to all uppercase letters. If @code{Lowercase} is specified, |
| then the name will be forced to all lowercase letters. A specification of |
| @code{As_Is} provides the normal default behavior in which the casing is |
| taken from the string provided. |
| @end table |
| |
| @noindent |
| This pragma may appear anywhere that a pragma is valid. In particular, it |
| can be used as a configuration pragma in the @file{gnat.adc} file, in which |
| case it applies to all subsequent compilations, or it can be used as a program |
| unit pragma, in which case it only applies to the current unit, or it can |
| be used more locally to control individual Import/Export pragmas. |
| |
| It is primarily intended for use with OpenVMS systems, where many |
| compilers convert all symbols to upper case by default. For interfacing to |
| such compilers (e.g.@: the DEC C compiler), it may be convenient to use |
| the pragma: |
| |
| @smallexample @c ada |
| pragma External_Name_Casing (Uppercase, Uppercase); |
| @end smallexample |
| |
| @noindent |
| to enforce the upper casing of all external symbols. |
| |
| @node Pragma Finalize_Storage_Only |
| @unnumberedsec Pragma Finalize_Storage_Only |
| @findex Finalize_Storage_Only |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Finalize_Storage_Only (first_subtype_LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| This pragma allows the compiler not to emit a Finalize call for objects |
| defined at the library level. This is mostly useful for types where |
| finalization is only used to deal with storage reclamation since in most |
| environments it is not necessary to reclaim memory just before terminating |
| execution, hence the name. |
| |
| @node Pragma Float_Representation |
| @unnumberedsec Pragma Float_Representation |
| @cindex OpenVMS |
| @findex Float_Representation |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Float_Representation (FLOAT_REP); |
| |
| FLOAT_REP ::= VAX_Float | IEEE_Float |
| @end smallexample |
| |
| @noindent |
| This pragma |
| allows control over the internal representation chosen for the predefined |
| floating point types declared in the packages @code{Standard} and |
| @code{System}. On all systems other than OpenVMS, the argument must |
| be @code{IEEE_Float} and the pragma has no effect. On OpenVMS, the |
| argument may be @code{VAX_Float} to specify the use of the VAX float |
| format for the floating-point types in Standard. This requires that |
| the standard runtime libraries be recompiled. See the |
| description of the @code{GNAT LIBRARY} command in the OpenVMS version |
| of the GNAT Users Guide for details on the use of this command. |
| |
| @node Pragma Ident |
| @unnumberedsec Pragma Ident |
| @findex Ident |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Ident (static_string_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This pragma provides a string identification in the generated object file, |
| if the system supports the concept of this kind of identification string. |
| This pragma is allowed only in the outermost declarative part or |
| declarative items of a compilation unit. If more than one @code{Ident} |
| pragma is given, only the last one processed is effective. |
| @cindex OpenVMS |
| On OpenVMS systems, the effect of the pragma is identical to the effect of |
| the DEC Ada 83 pragma of the same name. Note that in DEC Ada 83, the |
| maximum allowed length is 31 characters, so if it is important to |
| maintain compatibility with this compiler, you should obey this length |
| limit. |
| |
| @node Pragma Import_Exception |
| @unnumberedsec Pragma Import_Exception |
| @cindex OpenVMS |
| @findex Import_Exception |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Import_Exception ( |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL,] |
| [, [Form =>] Ada | VMS] |
| [, [Code =>] static_integer_EXPRESSION]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| @end smallexample |
| |
| @noindent |
| This pragma is implemented only in the OpenVMS implementation of GNAT@. |
| It allows OpenVMS conditions (for example, from OpenVMS system services or |
| other OpenVMS languages) to be propagated to Ada programs as Ada exceptions. |
| The pragma specifies that the exception associated with an exception |
| declaration in an Ada program be defined externally (in non-Ada code). |
| For further details on this pragma, see the |
| DEC Ada Language Reference Manual, section 13.9a.3.1. |
| |
| @node Pragma Import_Function |
| @unnumberedsec Pragma Import_Function |
| @findex Import_Function |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Import_Function ( |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Parameter_Types =>] PARAMETER_TYPES] |
| [, [Result_Type =>] SUBTYPE_MARK] |
| [, [Mechanism =>] MECHANISM] |
| [, [Result_Mechanism =>] MECHANISM_NAME] |
| [, [First_Optional_Parameter =>] IDENTIFIER]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| |
| PARAMETER_TYPES ::= |
| null |
| | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@} |
| |
| TYPE_DESIGNATOR ::= |
| subtype_NAME |
| | subtype_Name ' Access |
| |
| MECHANISM ::= |
| MECHANISM_NAME |
| | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@}) |
| |
| MECHANISM_ASSOCIATION ::= |
| [formal_parameter_NAME =>] MECHANISM_NAME |
| |
| MECHANISM_NAME ::= |
| Value |
| | Reference |
| | Descriptor [([Class =>] CLASS_NAME)] |
| |
| CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca |
| @end smallexample |
| |
| @noindent |
| This pragma is used in conjunction with a pragma @code{Import} to |
| specify additional information for an imported function. The pragma |
| @code{Import} (or equivalent pragma @code{Interface}) must precede the |
| @code{Import_Function} pragma and both must appear in the same |
| declarative part as the function specification. |
| |
| The @var{Internal} argument must uniquely designate |
| the function to which the |
| pragma applies. If more than one function name exists of this name in |
| the declarative part you must use the @code{Parameter_Types} and |
| @var{Result_Type} parameters to achieve the required unique |
| designation. Subtype marks in these parameters must exactly match the |
| subtypes in the corresponding function specification, using positional |
| notation to match parameters with subtype marks. |
| The form with an @code{'Access} attribute can be used to match an |
| anonymous access parameter. |
| |
| You may optionally use the @var{Mechanism} and @var{Result_Mechanism} |
| parameters to specify passing mechanisms for the |
| parameters and result. If you specify a single mechanism name, it |
| applies to all parameters. Otherwise you may specify a mechanism on a |
| parameter by parameter basis using either positional or named |
| notation. If the mechanism is not specified, the default mechanism |
| is used. |
| |
| @cindex OpenVMS |
| @cindex Passing by descriptor |
| Passing by descriptor is supported only on the OpenVMS ports of GNAT@. |
| |
| @code{First_Optional_Parameter} applies only to OpenVMS ports of GNAT@. |
| It specifies that the designated parameter and all following parameters |
| are optional, meaning that they are not passed at the generated code |
| level (this is distinct from the notion of optional parameters in Ada |
| where the parameters are passed anyway with the designated optional |
| parameters). All optional parameters must be of mode @code{IN} and have |
| default parameter values that are either known at compile time |
| expressions, or uses of the @code{'Null_Parameter} attribute. |
| |
| @node Pragma Import_Object |
| @unnumberedsec Pragma Import_Object |
| @findex Import_Object |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Import_Object |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL], |
| [, [Size =>] EXTERNAL_SYMBOL]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| @end smallexample |
| |
| @noindent |
| This pragma designates an object as imported, and apart from the |
| extended rules for external symbols, is identical in effect to the use of |
| the normal @code{Import} pragma applied to an object. Unlike the |
| subprogram case, you need not use a separate @code{Import} pragma, |
| although you may do so (and probably should do so from a portability |
| point of view). @var{size} is syntax checked, but otherwise ignored by |
| GNAT@. |
| |
| @node Pragma Import_Procedure |
| @unnumberedsec Pragma Import_Procedure |
| @findex Import_Procedure |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Import_Procedure ( |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Parameter_Types =>] PARAMETER_TYPES] |
| [, [Mechanism =>] MECHANISM] |
| [, [First_Optional_Parameter =>] IDENTIFIER]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| |
| PARAMETER_TYPES ::= |
| null |
| | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@} |
| |
| TYPE_DESIGNATOR ::= |
| subtype_NAME |
| | subtype_Name ' Access |
| |
| MECHANISM ::= |
| MECHANISM_NAME |
| | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@}) |
| |
| MECHANISM_ASSOCIATION ::= |
| [formal_parameter_NAME =>] MECHANISM_NAME |
| |
| MECHANISM_NAME ::= |
| Value |
| | Reference |
| | Descriptor [([Class =>] CLASS_NAME)] |
| |
| CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca |
| @end smallexample |
| |
| @noindent |
| This pragma is identical to @code{Import_Function} except that it |
| applies to a procedure rather than a function and the parameters |
| @code{Result_Type} and @code{Result_Mechanism} are not permitted. |
| |
| @node Pragma Import_Valued_Procedure |
| @unnumberedsec Pragma Import_Valued_Procedure |
| @findex Import_Valued_Procedure |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Import_Valued_Procedure ( |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Parameter_Types =>] PARAMETER_TYPES] |
| [, [Mechanism =>] MECHANISM] |
| [, [First_Optional_Parameter =>] IDENTIFIER]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| |
| PARAMETER_TYPES ::= |
| null |
| | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@} |
| |
| TYPE_DESIGNATOR ::= |
| subtype_NAME |
| | subtype_Name ' Access |
| |
| MECHANISM ::= |
| MECHANISM_NAME |
| | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@}) |
| |
| MECHANISM_ASSOCIATION ::= |
| [formal_parameter_NAME =>] MECHANISM_NAME |
| |
| MECHANISM_NAME ::= |
| Value |
| | Reference |
| | Descriptor [([Class =>] CLASS_NAME)] |
| |
| CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca |
| @end smallexample |
| |
| @noindent |
| This pragma is identical to @code{Import_Procedure} except that the |
| first parameter of @var{local_name}, which must be present, must be of |
| mode @code{OUT}, and externally the subprogram is treated as a function |
| with this parameter as the result of the function. The purpose of this |
| capability is to allow the use of @code{OUT} and @code{IN OUT} |
| parameters in interfacing to external functions (which are not permitted |
| in Ada functions). You may optionally use the @code{Mechanism} |
| parameters to specify passing mechanisms for the parameters. |
| If you specify a single mechanism name, it applies to all parameters. |
| Otherwise you may specify a mechanism on a parameter by parameter |
| basis using either positional or named notation. If the mechanism is not |
| specified, the default mechanism is used. |
| |
| Note that it is important to use this pragma in conjunction with a separate |
| pragma Import that specifies the desired convention, since otherwise the |
| default convention is Ada, which is almost certainly not what is required. |
| |
| @node Pragma Initialize_Scalars |
| @unnumberedsec Pragma Initialize_Scalars |
| @findex Initialize_Scalars |
| @cindex debugging with Initialize_Scalars |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Initialize_Scalars; |
| @end smallexample |
| |
| @noindent |
| This pragma is similar to @code{Normalize_Scalars} conceptually but has |
| two important differences. First, there is no requirement for the pragma |
| to be used uniformly in all units of a partition, in particular, it is fine |
| to use this just for some or all of the application units of a partition, |
| without needing to recompile the run-time library. |
| |
| In the case where some units are compiled with the pragma, and some without, |
| then a declaration of a variable where the type is defined in package |
| Standard or is locally declared will always be subject to initialization, |
| as will any declaration of a scalar variable. For composite variables, |
| whether the variable is initialized may also depend on whether the package |
| in which the type of the variable is declared is compiled with the pragma. |
| |
| The other important difference is that there is control over the value used |
| for initializing scalar objects. At bind time, you can select whether to |
| initialize with invalid values (like Normalize_Scalars), or with high or |
| low values, or with a specified bit pattern. See the users guide for binder |
| options for specifying these cases. |
| |
| This means that you can compile a program, and then without having to |
| recompile the program, you can run it with different values being used |
| for initializing otherwise uninitialized values, to test if your program |
| behavior depends on the choice. Of course the behavior should not change, |
| and if it does, then most likely you have an erroneous reference to an |
| uninitialized value. |
| |
| Note that pragma @code{Initialize_Scalars} is particularly useful in |
| conjunction with the enhanced validity checking that is now provided |
| in GNAT, which checks for invalid values under more conditions. |
| Using this feature (see description of the @code{-gnatV} flag in the |
| users guide) in conjunction with pragma @code{Initialize_Scalars} |
| provides a powerful new tool to assist in the detection of problems |
| caused by uninitialized variables. |
| |
| @node Pragma Inline_Always |
| @unnumberedsec Pragma Inline_Always |
| @findex Inline_Always |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Inline_Always (NAME [, NAME]); |
| @end smallexample |
| |
| @noindent |
| Similar to pragma @code{Inline} except that inlining is not subject to |
| the use of option @code{-gnatn} and the inlining happens regardless of |
| whether this option is used. |
| |
| @node Pragma Inline_Generic |
| @unnumberedsec Pragma Inline_Generic |
| @findex Inline_Generic |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Inline_Generic (generic_package_NAME); |
| @end smallexample |
| |
| @noindent |
| This is implemented for compatibility with DEC Ada 83 and is recognized, |
| but otherwise ignored, by GNAT@. All generic instantiations are inlined |
| by default when using GNAT@. |
| |
| @node Pragma Interface |
| @unnumberedsec Pragma Interface |
| @findex Interface |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Interface ( |
| [Convention =>] convention_identifier, |
| [Entity =>] local_name |
| [, [External_Name =>] static_string_expression], |
| [, [Link_Name =>] static_string_expression]); |
| @end smallexample |
| |
| @noindent |
| This pragma is identical in syntax and semantics to |
| the standard Ada 95 pragma @code{Import}. It is provided for compatibility |
| with Ada 83. The definition is upwards compatible both with pragma |
| @code{Interface} as defined in the Ada 83 Reference Manual, and also |
| with some extended implementations of this pragma in certain Ada 83 |
| implementations. |
| |
| @node Pragma Interface_Name |
| @unnumberedsec Pragma Interface_Name |
| @findex Interface_Name |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Interface_Name ( |
| [Entity =>] LOCAL_NAME |
| [, [External_Name =>] static_string_EXPRESSION] |
| [, [Link_Name =>] static_string_EXPRESSION]); |
| @end smallexample |
| |
| @noindent |
| This pragma provides an alternative way of specifying the interface name |
| for an interfaced subprogram, and is provided for compatibility with Ada |
| 83 compilers that use the pragma for this purpose. You must provide at |
| least one of @var{External_Name} or @var{Link_Name}. |
| |
| @node Pragma Interrupt_Handler |
| @unnumberedsec Pragma Interrupt_Handler |
| @findex Interrupt_Handler |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Interrupt_Handler (procedure_LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| This program unit pragma is supported for parameterless protected procedures |
| as described in Annex C of the Ada Reference Manual. On the AAMP target |
| the pragma can also be specified for nonprotected parameterless procedures |
| that are declared at the library level (which includes procedures |
| declared at the top level of a library package). In the case of AAMP, |
| when this pragma is applied to a nonprotected procedure, the instruction |
| @code{IERET} is generated for returns from the procedure, enabling |
| maskable interrupts, in place of the normal return instruction. |
| |
| @node Pragma Interrupt_State |
| @unnumberedsec Pragma Interrupt_State |
| @findex Interrupt_State |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Interrupt_State (Name => value, State => SYSTEM | RUNTIME | USER); |
| @end smallexample |
| |
| @noindent |
| Normally certain interrupts are reserved to the implementation. Any attempt |
| to attach an interrupt causes Program_Error to be raised, as described in |
| RM C.3.2(22). A typical example is the @code{SIGINT} interrupt used in |
| many systems for an @kbd{Ctrl-C} interrupt. Normally this interrupt is |
| reserved to the implementation, so that @kbd{Ctrl-C} can be used to |
| interrupt execution. Additionally, signals such as @code{SIGSEGV}, |
| @code{SIGABRT}, @code{SIGFPE} and @code{SIGILL} are often mapped to specific |
| Ada exceptions, or used to implement run-time functions such as the |
| @code{abort} statement and stack overflow checking. |
| |
| Pragma @code{Interrupt_State} provides a general mechanism for overriding |
| such uses of interrupts. It subsumes the functionality of pragma |
| @code{Unreserve_All_Interrupts}. Pragma @code{Interrupt_State} is not |
| available on OS/2, Windows or VMS. On all other platforms than VxWorks, |
| it applies to signals; on VxWorks, it applies to vectored hardware interrupts |
| and may be used to mark interrupts required by the board support package |
| as reserved. |
| |
| Interrupts can be in one of three states: |
| @itemize @bullet |
| @item System |
| |
| The interrupt is reserved (no Ada handler can be installed), and the |
| Ada run-time may not install a handler. As a result you are guaranteed |
| standard system default action if this interrupt is raised. |
| |
| @item Runtime |
| |
| The interrupt is reserved (no Ada handler can be installed). The run time |
| is allowed to install a handler for internal control purposes, but is |
| not required to do so. |
| |
| @item User |
| |
| The interrupt is unreserved. The user may install a handler to provide |
| some other action. |
| @end itemize |
| |
| @noindent |
| These states are the allowed values of the @code{State} parameter of the |
| pragma. The @code{Name} parameter is a value of the type |
| @code{Ada.Interrupts.Interrupt_ID}. Typically, it is a name declared in |
| @code{Ada.Interrupts.Names}. |
| |
| This is a configuration pragma, and the binder will check that there |
| are no inconsistencies between different units in a partition in how a |
| given interrupt is specified. It may appear anywhere a pragma is legal. |
| |
| The effect is to move the interrupt to the specified state. |
| |
| By declaring interrupts to be SYSTEM, you guarantee the standard system |
| action, such as a core dump. |
| |
| By declaring interrupts to be USER, you guarantee that you can install |
| a handler. |
| |
| Note that certain signals on many operating systems cannot be caught and |
| handled by applications. In such cases, the pragma is ignored. See the |
| operating system documentation, or the value of the array @code{Reserved} |
| declared in the specification of package @code{System.OS_Interface}. |
| |
| Overriding the default state of signals used by the Ada runtime may interfere |
| with an application's runtime behavior in the cases of the synchronous signals, |
| and in the case of the signal used to implement the @code{abort} statement. |
| |
| @node Pragma Keep_Names |
| @unnumberedsec Pragma Keep_Names |
| @findex Keep_Names |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Keep_Names ([On =>] enumeration_first_subtype_LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| The @var{LOCAL_NAME} argument |
| must refer to an enumeration first subtype |
| in the current declarative part. The effect is to retain the enumeration |
| literal names for use by @code{Image} and @code{Value} even if a global |
| @code{Discard_Names} pragma applies. This is useful when you want to |
| generally suppress enumeration literal names and for example you therefore |
| use a @code{Discard_Names} pragma in the @file{gnat.adc} file, but you |
| want to retain the names for specific enumeration types. |
| |
| @node Pragma License |
| @unnumberedsec Pragma License |
| @findex License |
| @cindex License checking |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma License (Unrestricted | GPL | Modified_GPL | Restricted); |
| @end smallexample |
| |
| @noindent |
| This pragma is provided to allow automated checking for appropriate license |
| conditions with respect to the standard and modified GPL@. A pragma |
| @code{License}, which is a configuration pragma that typically appears at |
| the start of a source file or in a separate @file{gnat.adc} file, specifies |
| the licensing conditions of a unit as follows: |
| |
| @itemize @bullet |
| @item Unrestricted |
| This is used for a unit that can be freely used with no license restrictions. |
| Examples of such units are public domain units, and units from the Ada |
| Reference Manual. |
| |
| @item GPL |
| This is used for a unit that is licensed under the unmodified GPL, and which |
| therefore cannot be @code{with}'ed by a restricted unit. |
| |
| @item Modified_GPL |
| This is used for a unit licensed under the GNAT modified GPL that includes |
| a special exception paragraph that specifically permits the inclusion of |
| the unit in programs without requiring the entire program to be released |
| under the GPL@. This is the license used for the GNAT run-time which ensures |
| that the run-time can be used freely in any program without GPL concerns. |
| |
| @item Restricted |
| This is used for a unit that is restricted in that it is not permitted to |
| depend on units that are licensed under the GPL@. Typical examples are |
| proprietary code that is to be released under more restrictive license |
| conditions. Note that restricted units are permitted to @code{with} units |
| which are licensed under the modified GPL (this is the whole point of the |
| modified GPL). |
| |
| @end itemize |
| |
| @noindent |
| Normally a unit with no @code{License} pragma is considered to have an |
| unknown license, and no checking is done. However, standard GNAT headers |
| are recognized, and license information is derived from them as follows. |
| |
| @itemize @bullet |
| |
| A GNAT license header starts with a line containing 78 hyphens. The following |
| comment text is searched for the appearance of any of the following strings. |
| |
| If the string ``GNU General Public License'' is found, then the unit is assumed |
| to have GPL license, unless the string ``As a special exception'' follows, in |
| which case the license is assumed to be modified GPL@. |
| |
| If one of the strings |
| ``This specification is adapted from the Ada Semantic Interface'' or |
| ``This specification is derived from the Ada Reference Manual'' is found |
| then the unit is assumed to be unrestricted. |
| @end itemize |
| |
| @noindent |
| These default actions means that a program with a restricted license pragma |
| will automatically get warnings if a GPL unit is inappropriately |
| @code{with}'ed. For example, the program: |
| |
| @smallexample @c ada |
| with Sem_Ch3; |
| with GNAT.Sockets; |
| procedure Secret_Stuff is |
| @dots{} |
| end Secret_Stuff |
| @end smallexample |
| |
| @noindent |
| if compiled with pragma @code{License} (@code{Restricted}) in a |
| @file{gnat.adc} file will generate the warning: |
| |
| @smallexample |
| 1. with Sem_Ch3; |
| | |
| >>> license of withed unit "Sem_Ch3" is incompatible |
| |
| 2. with GNAT.Sockets; |
| 3. procedure Secret_Stuff is |
| @end smallexample |
| |
| @noindent |
| Here we get a warning on @code{Sem_Ch3} since it is part of the GNAT |
| compiler and is licensed under the |
| GPL, but no warning for @code{GNAT.Sockets} which is part of the GNAT |
| run time, and is therefore licensed under the modified GPL@. |
| |
| @node Pragma Link_With |
| @unnumberedsec Pragma Link_With |
| @findex Link_With |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Link_With (static_string_EXPRESSION @{,static_string_EXPRESSION@}); |
| @end smallexample |
| |
| @noindent |
| This pragma is provided for compatibility with certain Ada 83 compilers. |
| It has exactly the same effect as pragma @code{Linker_Options} except |
| that spaces occurring within one of the string expressions are treated |
| as separators. For example, in the following case: |
| |
| @smallexample @c ada |
| pragma Link_With ("-labc -ldef"); |
| @end smallexample |
| |
| @noindent |
| results in passing the strings @code{-labc} and @code{-ldef} as two |
| separate arguments to the linker. In addition pragma Link_With allows |
| multiple arguments, with the same effect as successive pragmas. |
| |
| @node Pragma Linker_Alias |
| @unnumberedsec Pragma Linker_Alias |
| @findex Linker_Alias |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Linker_Alias ( |
| [Entity =>] LOCAL_NAME |
| [Alias =>] static_string_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This pragma establishes a linker alias for the given named entity. For |
| further details on the exact effect, consult the GCC manual. |
| |
| @node Pragma Linker_Section |
| @unnumberedsec Pragma Linker_Section |
| @findex Linker_Section |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Linker_Section ( |
| [Entity =>] LOCAL_NAME |
| [Section =>] static_string_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This pragma specifies the name of the linker section for the given entity. |
| For further details on the exact effect, consult the GCC manual. |
| |
| @node Pragma Long_Float |
| @unnumberedsec Pragma Long_Float |
| @cindex OpenVMS |
| @findex Long_Float |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Long_Float (FLOAT_FORMAT); |
| |
| FLOAT_FORMAT ::= D_Float | G_Float |
| @end smallexample |
| |
| @noindent |
| This pragma is implemented only in the OpenVMS implementation of GNAT@. |
| It allows control over the internal representation chosen for the predefined |
| type @code{Long_Float} and for floating point type representations with |
| @code{digits} specified in the range 7 through 15. |
| For further details on this pragma, see the |
| @cite{DEC Ada Language Reference Manual}, section 3.5.7b. Note that to use |
| this pragma, the standard runtime libraries must be recompiled. See the |
| description of the @code{GNAT LIBRARY} command in the OpenVMS version |
| of the GNAT User's Guide for details on the use of this command. |
| |
| @node Pragma Machine_Attribute |
| @unnumberedsec Pragma Machine_Attribute |
| @findex Machine_Attribute |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Machine_Attribute ( |
| [Attribute_Name =>] string_EXPRESSION, |
| [Entity =>] LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| Machine dependent attributes can be specified for types and/or |
| declarations. Currently only subprogram entities are supported. This |
| pragma is semantically equivalent to |
| @code{__attribute__((@var{string_expression}))} in GNU C, |
| where @code{@var{string_expression}} is |
| recognized by the GNU C macros @code{VALID_MACHINE_TYPE_ATTRIBUTE} and |
| @code{VALID_MACHINE_DECL_ATTRIBUTE} which are defined in the |
| configuration header file @file{tm.h} for each machine. See the GCC |
| manual for further information. |
| |
| @node Pragma Main_Storage |
| @unnumberedsec Pragma Main_Storage |
| @cindex OpenVMS |
| @findex Main_Storage |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Main_Storage |
| (MAIN_STORAGE_OPTION [, MAIN_STORAGE_OPTION]); |
| |
| MAIN_STORAGE_OPTION ::= |
| [WORKING_STORAGE =>] static_SIMPLE_EXPRESSION |
| | [TOP_GUARD =>] static_SIMPLE_EXPRESSION |
| |
| @end smallexample |
| |
| @noindent |
| This pragma is provided for compatibility with OpenVMS VAX Systems. It has |
| no effect in GNAT, other than being syntax checked. Note that the pragma |
| also has no effect in DEC Ada 83 for OpenVMS Alpha Systems. |
| |
| @node Pragma No_Return |
| @unnumberedsec Pragma No_Return |
| @findex No_Return |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma No_Return (procedure_LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| @var{procedure_local_NAME} must refer to one or more procedure |
| declarations in the current declarative part. A procedure to which this |
| pragma is applied may not contain any explicit @code{return} statements, |
| and also may not contain any implicit return statements from falling off |
| the end of a statement sequence. One use of this pragma is to identify |
| procedures whose only purpose is to raise an exception. |
| |
| Another use of this pragma is to suppress incorrect warnings about |
| missing returns in functions, where the last statement of a function |
| statement sequence is a call to such a procedure. |
| |
| @node Pragma Normalize_Scalars |
| @unnumberedsec Pragma Normalize_Scalars |
| @findex Normalize_Scalars |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Normalize_Scalars; |
| @end smallexample |
| |
| @noindent |
| This is a language defined pragma which is fully implemented in GNAT@. The |
| effect is to cause all scalar objects that are not otherwise initialized |
| to be initialized. The initial values are implementation dependent and |
| are as follows: |
| |
| @table @code |
| @item Standard.Character |
| @noindent |
| Objects whose root type is Standard.Character are initialized to |
| Character'Last. This will be out of range of the subtype only if |
| the subtype range excludes this value. |
| |
| @item Standard.Wide_Character |
| @noindent |
| Objects whose root type is Standard.Wide_Character are initialized to |
| Wide_Character'Last. This will be out of range of the subtype only if |
| the subtype range excludes this value. |
| |
| @item Integer types |
| @noindent |
| Objects of an integer type are initialized to base_type'First, where |
| base_type is the base type of the object type. This will be out of range |
| of the subtype only if the subtype range excludes this value. For example, |
| if you declare the subtype: |
| |
| @smallexample @c ada |
| subtype Ityp is integer range 1 .. 10; |
| @end smallexample |
| |
| @noindent |
| then objects of type x will be initialized to Integer'First, a negative |
| number that is certainly outside the range of subtype @code{Ityp}. |
| |
| @item Real types |
| Objects of all real types (fixed and floating) are initialized to |
| base_type'First, where base_Type is the base type of the object type. |
| This will be out of range of the subtype only if the subtype range |
| excludes this value. |
| |
| @item Modular types |
| Objects of a modular type are initialized to typ'Last. This will be out |
| of range of the subtype only if the subtype excludes this value. |
| |
| @item Enumeration types |
| Objects of an enumeration type are initialized to all one-bits, i.e.@: to |
| the value @code{2 ** typ'Size - 1}. This will be out of range of the |
| enumeration subtype in all cases except where the subtype contains |
| exactly 2**8, 2**16, or 2**32 elements. |
| |
| @end table |
| |
| @node Pragma Obsolescent |
| @unnumberedsec Pragma Obsolescent |
| @findex Obsolescent |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Obsolescent [(static_string_EXPRESSION)]; |
| @end smallexample |
| |
| @noindent |
| This pragma must occur immediately following a subprogram |
| declaration. It indicates that the associated function or procedure |
| is considered obsolescent and should not be used. Typically this is |
| used when an API must be modified by eventually removing or modifying |
| existing subprograms. The pragma can be used at an intermediate stage |
| when the subprogram is still present, but will be removed later. |
| |
| The effect of this pragma is to output a warning message that the |
| subprogram is obsolescent if the appropriate warning option in the |
| compiler is activated. If a parameter is present, then a second |
| warning message is given containing this text. |
| |
| @node Pragma Passive |
| @unnumberedsec Pragma Passive |
| @findex Passive |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Passive ([Semaphore | No]); |
| @end smallexample |
| |
| @noindent |
| Syntax checked, but otherwise ignored by GNAT@. This is recognized for |
| compatibility with DEC Ada 83 implementations, where it is used within a |
| task definition to request that a task be made passive. If the argument |
| @code{Semaphore} is present, or the argument is omitted, then DEC Ada 83 |
| treats the pragma as an assertion that the containing task is passive |
| and that optimization of context switch with this task is permitted and |
| desired. If the argument @code{No} is present, the task must not be |
| optimized. GNAT does not attempt to optimize any tasks in this manner |
| (since protected objects are available in place of passive tasks). |
| |
| @node Pragma Polling |
| @unnumberedsec Pragma Polling |
| @findex Polling |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Polling (ON | OFF); |
| @end smallexample |
| |
| @noindent |
| This pragma controls the generation of polling code. This is normally off. |
| If @code{pragma Polling (ON)} is used then periodic calls are generated to |
| the routine @code{Ada.Exceptions.Poll}. This routine is a separate unit in the |
| runtime library, and can be found in file @file{a-excpol.adb}. |
| |
| Pragma @code{Polling} can appear as a configuration pragma (for example it |
| can be placed in the @file{gnat.adc} file) to enable polling globally, or it |
| can be used in the statement or declaration sequence to control polling |
| more locally. |
| |
| A call to the polling routine is generated at the start of every loop and |
| at the start of every subprogram call. This guarantees that the @code{Poll} |
| routine is called frequently, and places an upper bound (determined by |
| the complexity of the code) on the period between two @code{Poll} calls. |
| |
| The primary purpose of the polling interface is to enable asynchronous |
| aborts on targets that cannot otherwise support it (for example Windows |
| NT), but it may be used for any other purpose requiring periodic polling. |
| The standard version is null, and can be replaced by a user program. This |
| will require re-compilation of the @code{Ada.Exceptions} package that can |
| be found in files @file{a-except.ads} and @file{a-except.adb}. |
| |
| A standard alternative unit (in file @file{4wexcpol.adb} in the standard GNAT |
| distribution) is used to enable the asynchronous abort capability on |
| targets that do not normally support the capability. The version of |
| @code{Poll} in this file makes a call to the appropriate runtime routine |
| to test for an abort condition. |
| |
| Note that polling can also be enabled by use of the @code{-gnatP} switch. See |
| the @cite{GNAT User's Guide} for details. |
| |
| @node Pragma Propagate_Exceptions |
| @unnumberedsec Pragma Propagate_Exceptions |
| @findex Propagate_Exceptions |
| @cindex Zero Cost Exceptions |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Propagate_Exceptions (subprogram_LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| This pragma indicates that the given entity, which is the name of an |
| imported foreign-language subprogram may receive an Ada exception, |
| and that the exception should be propagated. It is relevant only if |
| zero cost exception handling is in use, and is thus never needed if |
| the alternative @code{longjmp} / @code{setjmp} implementation of |
| exceptions is used (although it is harmless to use it in such cases). |
| |
| The implementation of fast exceptions always properly propagates |
| exceptions through Ada code, as described in the Ada Reference Manual. |
| However, this manual is silent about the propagation of exceptions |
| through foreign code. For example, consider the |
| situation where @code{P1} calls |
| @code{P2}, and @code{P2} calls @code{P3}, where |
| @code{P1} and @code{P3} are in Ada, but @code{P2} is in C@. |
| @code{P3} raises an Ada exception. The question is whether or not |
| it will be propagated through @code{P2} and can be handled in |
| @code{P1}. |
| |
| For the @code{longjmp} / @code{setjmp} implementation of exceptions, |
| the answer is always yes. For some targets on which zero cost exception |
| handling is implemented, the answer is also always yes. However, there |
| are some targets, notably in the current version all x86 architecture |
| targets, in which the answer is that such propagation does not |
| happen automatically. If such propagation is required on these |
| targets, it is mandatory to use @code{Propagate_Exceptions} to |
| name all foreign language routines through which Ada exceptions |
| may be propagated. |
| |
| @node Pragma Psect_Object |
| @unnumberedsec Pragma Psect_Object |
| @findex Psect_Object |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Psect_Object ( |
| [Internal =>] LOCAL_NAME, |
| [, [External =>] EXTERNAL_SYMBOL] |
| [, [Size =>] EXTERNAL_SYMBOL]); |
| |
| EXTERNAL_SYMBOL ::= |
| IDENTIFIER |
| | static_string_EXPRESSION |
| @end smallexample |
| |
| @noindent |
| This pragma is identical in effect to pragma @code{Common_Object}. |
| |
| @node Pragma Pure_Function |
| @unnumberedsec Pragma Pure_Function |
| @findex Pure_Function |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Pure_Function ([Entity =>] function_LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| This pragma appears in the same declarative part as a function |
| declaration (or a set of function declarations if more than one |
| overloaded declaration exists, in which case the pragma applies |
| to all entities). It specifies that the function @code{Entity} is |
| to be considered pure for the purposes of code generation. This means |
| that the compiler can assume that there are no side effects, and |
| in particular that two calls with identical arguments produce the |
| same result. It also means that the function can be used in an |
| address clause. |
| |
| Note that, quite deliberately, there are no static checks to try |
| to ensure that this promise is met, so @code{Pure_Function} can be used |
| with functions that are conceptually pure, even if they do modify |
| global variables. For example, a square root function that is |
| instrumented to count the number of times it is called is still |
| conceptually pure, and can still be optimized, even though it |
| modifies a global variable (the count). Memo functions are another |
| example (where a table of previous calls is kept and consulted to |
| avoid re-computation). |
| |
| @findex Pure |
| Note: Most functions in a @code{Pure} package are automatically pure, and |
| there is no need to use pragma @code{Pure_Function} for such functions. One |
| exception is any function that has at least one formal of type |
| @code{System.Address} or a type derived from it. Such functions are not |
| considered pure by default, since the compiler assumes that the |
| @code{Address} parameter may be functioning as a pointer and that the |
| referenced data may change even if the address value does not. |
| Similarly, imported functions are not consdered to be pure by default, |
| since there is no way of checking that they are in fact pure. The use |
| of pragma @code{Pure_Function} for such a function will override these default |
| assumption, and cause the compiler to treat a designated subprogram as pure |
| in these cases. |
| |
| Note: If pragma @code{Pure_Function} is applied to a renamed function, it |
| applies to the underlying renamed function. This can be used to |
| disambiguate cases of overloading where some but not all functions |
| in a set of overloaded functions are to be designated as pure. |
| |
| @node Pragma Ravenscar |
| @unnumberedsec Pragma Ravenscar |
| @findex Ravenscar |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Ravenscar; |
| @end smallexample |
| |
| @noindent |
| A configuration pragma that establishes the following set of restrictions: |
| |
| @table @code |
| @item No_Abort_Statements |
| [RM D.7] There are no abort_statements, and there are |
| no calls to Task_Identification.Abort_Task. |
| |
| @item No_Select_Statements |
| There are no select_statements. |
| |
| @item No_Task_Hierarchy |
| [RM D.7] All (non-environment) tasks depend |
| directly on the environment task of the partition. |
| |
| @item No_Task_Allocators |
| [RM D.7] There are no allocators for task types |
| or types containing task subcomponents. |
| |
| @item No_Dynamic_Priorities |
| [RM D.7] There are no semantic dependencies on the package Dynamic_Priorities. |
| |
| @item No_Terminate_Alternatives |
| [RM D.7] There are no selective_accepts with terminate_alternatives |
| |
| @item No_Dynamic_Interrupts |
| There are no semantic dependencies on Ada.Interrupts. |
| |
| @item No_Implicit_Heap_Allocations |
| [RM D.7] No constructs are allowed to cause implicit heap allocation |
| |
| @item No_Protected_Type_Allocators |
| There are no allocators for protected types or |
| types containing protected subcomponents. |
| |
| @item No_Local_Protected_Objects |
| Protected objects and access types that designate |
| such objects shall be declared only at library level. |
| |
| @item No_Requeue |
| Requeue statements are not allowed. |
| |
| @item No_Calendar |
| There are no semantic dependencies on the package Ada.Calendar. |
| |
| @item No_Relative_Delay |
| There are no delay_relative_statements. |
| |
| @item No_Task_Attributes |
| There are no semantic dependencies on the Ada.Task_Attributes package and |
| there are no references to the attributes Callable and Terminated [RM 9.9]. |
| |
| @item Boolean_Entry_Barriers |
| Entry barrier condition expressions shall be boolean |
| objects which are declared in the protected type |
| which contains the entry. |
| |
| @item Max_Asynchronous_Select_Nesting = 0 |
| [RM D.7] Specifies the maximum dynamic nesting level of asynchronous_selects. |
| A value of zero prevents the use of any asynchronous_select. |
| |
| @item Max_Task_Entries = 0 |
| [RM D.7] Specifies the maximum number of entries |
| per task. The bounds of every entry family |
| of a task unit shall be static, or shall be |
| defined by a discriminant of a subtype whose |
| corresponding bound is static. A value of zero |
| indicates that no rendezvous are possible. For |
| the Ravenscar pragma, the value of Max_Task_Entries is always |
| 0 (zero). |
| |
| @item Max_Protected_Entries = 1 |
| [RM D.7] Specifies the maximum number of entries per |
| protected type. The bounds of every entry family of |
| a protected unit shall be static, or shall be defined |
| by a discriminant of a subtype whose corresponding |
| bound is static. For the Ravenscar pragma the value of |
| Max_Protected_Entries is always 1. |
| |
| @item Max_Select_Alternatives = 0 |
| [RM D.7] Specifies the maximum number of alternatives in a selective_accept. |
| For the Ravenscar pragma the value is always 0. |
| |
| @item No_Task_Termination |
| Tasks which terminate are erroneous. |
| |
| @item No_Entry_Queue |
| No task can be queued on a protected entry. Note that this restrictions is |
| checked at run time. The violation of this restriction generates a |
| Program_Error exception. |
| @end table |
| |
| @noindent |
| This set of restrictions corresponds to the definition of the ``Ravenscar |
| Profile'' for limited tasking, devised and published by the |
| @cite{International Real-Time Ada Workshop}, 1997, |
| and whose most recent description is available at |
| @url{ftp://ftp.openravenscar.org/openravenscar/ravenscar00.pdf}. |
| |
| The above set is a superset of the restrictions provided by pragma |
| @code{Restricted_Run_Time}, it includes five additional restrictions |
| (@code{Boolean_Entry_Barriers}, @code{No_Select_Statements}, |
| @code{No_Calendar}, |
| @code{No_Relative_Delay} and @code{No_Task_Termination}). This means |
| that pragma @code{Ravenscar}, like the pragma @code{Restricted_Run_Time}, |
| automatically causes the use of a simplified, more efficient version |
| of the tasking run-time system. |
| |
| @node Pragma Restricted_Run_Time |
| @unnumberedsec Pragma Restricted_Run_Time |
| @findex Restricted_Run_Time |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Restricted_Run_Time; |
| @end smallexample |
| |
| @noindent |
| A configuration pragma that establishes the following set of restrictions: |
| |
| @itemize @bullet |
| @item No_Abort_Statements |
| @item No_Entry_Queue |
| @item No_Task_Hierarchy |
| @item No_Task_Allocators |
| @item No_Dynamic_Priorities |
| @item No_Terminate_Alternatives |
| @item No_Dynamic_Interrupts |
| @item No_Protected_Type_Allocators |
| @item No_Local_Protected_Objects |
| @item No_Requeue |
| @item No_Task_Attributes |
| @item Max_Asynchronous_Select_Nesting = 0 |
| @item Max_Task_Entries = 0 |
| @item Max_Protected_Entries = 1 |
| @item Max_Select_Alternatives = 0 |
| @end itemize |
| |
| @noindent |
| This set of restrictions causes the automatic selection of a simplified |
| version of the run time that provides improved performance for the |
| limited set of tasking functionality permitted by this set of restrictions. |
| |
| @node Pragma Restriction_Warnings |
| @unnumberedsec Pragma Restriction_Warnings |
| @findex Restriction_Warnings |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Restriction_Warnings |
| (restriction_IDENTIFIER @{, restriction_IDENTIFIER@}); |
| @end smallexample |
| |
| @noindent |
| This pragma allows a series of restriction identifiers to be |
| specified (the list of allowed identifiers is the same as for |
| pragma @code{Restrictions}). For each of these identifiers |
| the compiler checks for violations of the restriction, but |
| generates a warning message rather than an error message |
| if the restriction is violated. |
| |
| @node Pragma Source_File_Name |
| @unnumberedsec Pragma Source_File_Name |
| @findex Source_File_Name |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Source_File_Name ( |
| [Unit_Name =>] unit_NAME, |
| Spec_File_Name => STRING_LITERAL); |
| |
| pragma Source_File_Name ( |
| [Unit_Name =>] unit_NAME, |
| Body_File_Name => STRING_LITERAL); |
| @end smallexample |
| |
| @noindent |
| Use this to override the normal naming convention. It is a configuration |
| pragma, and so has the usual applicability of configuration pragmas |
| (i.e.@: it applies to either an entire partition, or to all units in a |
| compilation, or to a single unit, depending on how it is used. |
| @var{unit_name} is mapped to @var{file_name_literal}. The identifier for |
| the second argument is required, and indicates whether this is the file |
| name for the spec or for the body. |
| |
| Another form of the @code{Source_File_Name} pragma allows |
| the specification of patterns defining alternative file naming schemes |
| to apply to all files. |
| |
| @smallexample @c ada |
| pragma Source_File_Name |
| (Spec_File_Name => STRING_LITERAL |
| [,Casing => CASING_SPEC] |
| [,Dot_Replacement => STRING_LITERAL]); |
| |
| pragma Source_File_Name |
| (Body_File_Name => STRING_LITERAL |
| [,Casing => CASING_SPEC] |
| [,Dot_Replacement => STRING_LITERAL]); |
| |
| pragma Source_File_Name |
| (Subunit_File_Name => STRING_LITERAL |
| [,Casing => CASING_SPEC] |
| [,Dot_Replacement => STRING_LITERAL]); |
| |
| CASING_SPEC ::= Lowercase | Uppercase | Mixedcase |
| @end smallexample |
| |
| @noindent |
| The first argument is a pattern that contains a single asterisk indicating |
| the point at which the unit name is to be inserted in the pattern string |
| to form the file name. The second argument is optional. If present it |
| specifies the casing of the unit name in the resulting file name string. |
| The default is lower case. Finally the third argument allows for systematic |
| replacement of any dots in the unit name by the specified string literal. |
| |
| A pragma Source_File_Name cannot appear after a |
| @ref{Pragma Source_File_Name_Project}. |
| |
| For more details on the use of the @code{Source_File_Name} pragma, |
| see the sections ``Using Other File Names'' and |
| ``Alternative File Naming Schemes'' in the @cite{GNAT User's Guide}. |
| |
| @node Pragma Source_File_Name_Project |
| @unnumberedsec Pragma Source_File_Name_Project |
| @findex Source_File_Name_Project |
| @noindent |
| |
| This pragma has the same syntax and semantics as pragma Source_File_Name. |
| It is only allowed as a stand alone configuration pragma. |
| It cannot appear after a @ref{Pragma Source_File_Name}, and |
| most importantly, once pragma Source_File_Name_Project appears, |
| no further Source_File_Name pragmas are allowed. |
| |
| The intention is that Source_File_Name_Project pragmas are always |
| generated by the Project Manager in a manner consistent with the naming |
| specified in a project file, and when naming is controlled in this manner, |
| it is not permissible to attempt to modify this naming scheme using |
| Source_File_Name pragmas (which would not be known to the project manager). |
| |
| @node Pragma Source_Reference |
| @unnumberedsec Pragma Source_Reference |
| @findex Source_Reference |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Source_Reference (INTEGER_LITERAL, STRING_LITERAL); |
| @end smallexample |
| |
| @noindent |
| This pragma must appear as the first line of a source file. |
| @var{integer_literal} is the logical line number of the line following |
| the pragma line (for use in error messages and debugging |
| information). @var{string_literal} is a static string constant that |
| specifies the file name to be used in error messages and debugging |
| information. This is most notably used for the output of @code{gnatchop} |
| with the @code{-r} switch, to make sure that the original unchopped |
| source file is the one referred to. |
| |
| The second argument must be a string literal, it cannot be a static |
| string expression other than a string literal. This is because its value |
| is needed for error messages issued by all phases of the compiler. |
| |
| @node Pragma Stream_Convert |
| @unnumberedsec Pragma Stream_Convert |
| @findex Stream_Convert |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Stream_Convert ( |
| [Entity =>] type_LOCAL_NAME, |
| [Read =>] function_NAME, |
| [Write =>] function NAME); |
| @end smallexample |
| |
| @noindent |
| This pragma provides an efficient way of providing stream functions for |
| types defined in packages. Not only is it simpler to use than declaring |
| the necessary functions with attribute representation clauses, but more |
| significantly, it allows the declaration to made in such a way that the |
| stream packages are not loaded unless they are needed. The use of |
| the Stream_Convert pragma adds no overhead at all, unless the stream |
| attributes are actually used on the designated type. |
| |
| The first argument specifies the type for which stream functions are |
| provided. The second parameter provides a function used to read values |
| of this type. It must name a function whose argument type may be any |
| subtype, and whose returned type must be the type given as the first |
| argument to the pragma. |
| |
| The meaning of the @var{Read} |
| parameter is that if a stream attribute directly |
| or indirectly specifies reading of the type given as the first parameter, |
| then a value of the type given as the argument to the Read function is |
| read from the stream, and then the Read function is used to convert this |
| to the required target type. |
| |
| Similarly the @var{Write} parameter specifies how to treat write attributes |
| that directly or indirectly apply to the type given as the first parameter. |
| It must have an input parameter of the type specified by the first parameter, |
| and the return type must be the same as the input type of the Read function. |
| The effect is to first call the Write function to convert to the given stream |
| type, and then write the result type to the stream. |
| |
| The Read and Write functions must not be overloaded subprograms. If necessary |
| renamings can be supplied to meet this requirement. |
| The usage of this attribute is best illustrated by a simple example, taken |
| from the GNAT implementation of package Ada.Strings.Unbounded: |
| |
| @smallexample @c ada |
| function To_Unbounded (S : String) |
| return Unbounded_String |
| renames To_Unbounded_String; |
| |
| pragma Stream_Convert |
| (Unbounded_String, To_Unbounded, To_String); |
| @end smallexample |
| |
| @noindent |
| The specifications of the referenced functions, as given in the Ada 95 |
| Reference Manual are: |
| |
| @smallexample @c ada |
| function To_Unbounded_String (Source : String) |
| return Unbounded_String; |
| |
| function To_String (Source : Unbounded_String) |
| return String; |
| @end smallexample |
| |
| @noindent |
| The effect is that if the value of an unbounded string is written to a |
| stream, then the representation of the item in the stream is in the same |
| format used for @code{Standard.String}, and this same representation is |
| expected when a value of this type is read from the stream. |
| |
| @node Pragma Style_Checks |
| @unnumberedsec Pragma Style_Checks |
| @findex Style_Checks |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Style_Checks (string_LITERAL | ALL_CHECKS | |
| On | Off [, LOCAL_NAME]); |
| @end smallexample |
| |
| @noindent |
| This pragma is used in conjunction with compiler switches to control the |
| built in style checking provided by GNAT@. The compiler switches, if set, |
| provide an initial setting for the switches, and this pragma may be used |
| to modify these settings, or the settings may be provided entirely by |
| the use of the pragma. This pragma can be used anywhere that a pragma |
| is legal, including use as a configuration pragma (including use in |
| the @file{gnat.adc} file). |
| |
| The form with a string literal specifies which style options are to be |
| activated. These are additive, so they apply in addition to any previously |
| set style check options. The codes for the options are the same as those |
| used in the @code{-gnaty} switch to @code{gcc} or @code{gnatmake}. |
| For example the following two methods can be used to enable |
| layout checking: |
| |
| @itemize @bullet |
| @item |
| @smallexample @c ada |
| pragma Style_Checks ("l"); |
| @end smallexample |
| |
| @item |
| @smallexample |
| gcc -c -gnatyl @dots{} |
| @end smallexample |
| @end itemize |
| |
| @noindent |
| The form ALL_CHECKS activates all standard checks (its use is equivalent |
| to the use of the @code{gnaty} switch with no options. See GNAT User's |
| Guide for details. |
| |
| The forms with @code{Off} and @code{On} |
| can be used to temporarily disable style checks |
| as shown in the following example: |
| |
| @smallexample @c ada |
| @iftex |
| @leftskip=0cm |
| @end iftex |
| pragma Style_Checks ("k"); -- requires keywords in lower case |
| pragma Style_Checks (Off); -- turn off style checks |
| NULL; -- this will not generate an error message |
| pragma Style_Checks (On); -- turn style checks back on |
| NULL; -- this will generate an error message |
| @end smallexample |
| |
| @noindent |
| Finally the two argument form is allowed only if the first argument is |
| @code{On} or @code{Off}. The effect is to turn of semantic style checks |
| for the specified entity, as shown in the following example: |
| |
| @smallexample @c ada |
| @iftex |
| @leftskip=0cm |
| @end iftex |
| pragma Style_Checks ("r"); -- require consistency of identifier casing |
| Arg : Integer; |
| Rf1 : Integer := ARG; -- incorrect, wrong case |
| pragma Style_Checks (Off, Arg); |
| Rf2 : Integer := ARG; -- OK, no error |
| @end smallexample |
| |
| @node Pragma Subtitle |
| @unnumberedsec Pragma Subtitle |
| @findex Subtitle |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Subtitle ([Subtitle =>] STRING_LITERAL); |
| @end smallexample |
| |
| @noindent |
| This pragma is recognized for compatibility with other Ada compilers |
| but is ignored by GNAT@. |
| |
| @node Pragma Suppress_All |
| @unnumberedsec Pragma Suppress_All |
| @findex Suppress_All |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Suppress_All; |
| @end smallexample |
| |
| @noindent |
| This pragma can only appear immediately following a compilation |
| unit. The effect is to apply @code{Suppress (All_Checks)} to the unit |
| which it follows. This pragma is implemented for compatibility with DEC |
| Ada 83 usage. The use of pragma @code{Suppress (All_Checks)} as a normal |
| configuration pragma is the preferred usage in GNAT@. |
| |
| @node Pragma Suppress_Exception_Locations |
| @unnumberedsec Pragma Suppress_Exception_Locations |
| @findex Suppress_Exception_Locations |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Suppress_Exception_Locations; |
| @end smallexample |
| |
| @noindent |
| In normal mode, a raise statement for an exception by default generates |
| an exception message giving the file name and line number for the location |
| of the raise. This is useful for debugging and logging purposes, but this |
| entails extra space for the strings for the messages. The configuration |
| pragma @code{Suppress_Exception_Locations} can be used to suppress the |
| generation of these strings, with the result that space is saved, but the |
| exception message for such raises is null. This configuration pragma may |
| appear in a global configuration pragma file, or in a specific unit as |
| usual. It is not required that this pragma be used consistently within |
| a partition, so it is fine to have some units within a partition compiled |
| with this pragma and others compiled in normal mode without it. |
| |
| @node Pragma Suppress_Initialization |
| @unnumberedsec Pragma Suppress_Initialization |
| @findex Suppress_Initialization |
| @cindex Suppressing initialization |
| @cindex Initialization, suppression of |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Suppress_Initialization ([Entity =>] type_Name); |
| @end smallexample |
| |
| @noindent |
| This pragma suppresses any implicit or explicit initialization |
| associated with the given type name for all variables of this type. |
| |
| @node Pragma Task_Info |
| @unnumberedsec Pragma Task_Info |
| @findex Task_Info |
| @noindent |
| Syntax |
| |
| @smallexample @c ada |
| pragma Task_Info (EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This pragma appears within a task definition (like pragma |
| @code{Priority}) and applies to the task in which it appears. The |
| argument must be of type @code{System.Task_Info.Task_Info_Type}. |
| The @code{Task_Info} pragma provides system dependent control over |
| aspects of tasking implementation, for example, the ability to map |
| tasks to specific processors. For details on the facilities available |
| for the version of GNAT that you are using, see the documentation |
| in the specification of package System.Task_Info in the runtime |
| library. |
| |
| @node Pragma Task_Name |
| @unnumberedsec Pragma Task_Name |
| @findex Task_Name |
| @noindent |
| Syntax |
| |
| @smallexample @c ada |
| pragma Task_Name (string_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This pragma appears within a task definition (like pragma |
| @code{Priority}) and applies to the task in which it appears. The |
| argument must be of type String, and provides a name to be used for |
| the task instance when the task is created. Note that this expression |
| is not required to be static, and in particular, it can contain |
| references to task discriminants. This facility can be used to |
| provide different names for different tasks as they are created, |
| as illustrated in the example below. |
| |
| The task name is recorded internally in the run-time structures |
| and is accessible to tools like the debugger. In addition the |
| routine @code{Ada.Task_Identification.Image} will return this |
| string, with a unique task address appended. |
| |
| @smallexample @c ada |
| -- Example of the use of pragma Task_Name |
| |
| with Ada.Task_Identification; |
| use Ada.Task_Identification; |
| with Text_IO; use Text_IO; |
| procedure t3 is |
| |
| type Astring is access String; |
| |
| task type Task_Typ (Name : access String) is |
| pragma Task_Name (Name.all); |
| end Task_Typ; |
| |
| task body Task_Typ is |
| Nam : constant String := Image (Current_Task); |
| begin |
| Put_Line ("-->" & Nam (1 .. 14) & "<--"); |
| end Task_Typ; |
| |
| type Ptr_Task is access Task_Typ; |
| Task_Var : Ptr_Task; |
| |
| begin |
| Task_Var := |
| new Task_Typ (new String'("This is task 1")); |
| Task_Var := |
| new Task_Typ (new String'("This is task 2")); |
| end; |
| @end smallexample |
| |
| @node Pragma Task_Storage |
| @unnumberedsec Pragma Task_Storage |
| @findex Task_Storage |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Task_Storage ( |
| [Task_Type =>] LOCAL_NAME, |
| [Top_Guard =>] static_integer_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| This pragma specifies the length of the guard area for tasks. The guard |
| area is an additional storage area allocated to a task. A value of zero |
| means that either no guard area is created or a minimal guard area is |
| created, depending on the target. This pragma can appear anywhere a |
| @code{Storage_Size} attribute definition clause is allowed for a task |
| type. |
| |
| @node Pragma Thread_Body |
| @unnumberedsec Pragma Thread_Body |
| @findex Thread_Body |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Thread_Body ( |
| [Entity =>] LOCAL_NAME, |
| [[Secondary_Stack_Size =>] static_integer_EXPRESSION)]; |
| @end smallexample |
| |
| @noindent |
| This pragma specifies that the subprogram whose name is given as the |
| @code{Entity} argument is a thread body, which will be activated |
| by being called via its Address from foreign code. The purpose is |
| to allow execution and registration of the foreign thread within the |
| Ada run-time system. |
| |
| See the library unit @code{System.Threads} for details on the expansion of |
| a thread body subprogram, including the calls made to subprograms |
| within System.Threads to register the task. This unit also lists the |
| targets and runtime systems for which this pragma is supported. |
| |
| A thread body subprogram may not be called directly from Ada code, and |
| it is not permitted to apply the Access (or Unrestricted_Access) attributes |
| to such a subprogram. The only legitimate way of calling such a subprogram |
| is to pass its Address to foreign code and then make the call from the |
| foreign code. |
| |
| A thread body subprogram may have any parameters, and it may be a function |
| returning a result. The convention of the thread body subprogram may be |
| set in the usual manner using @code{pragma Convention}. |
| |
| The secondary stack size parameter, if given, is used to set the size |
| of secondary stack for the thread. The secondary stack is allocated as |
| a local variable of the expanded thread body subprogram, and thus is |
| allocated out of the main thread stack size. If no secondary stack |
| size parameter is present, the default size (from the declaration in |
| @code{System.Secondary_Stack} is used. |
| |
| @node Pragma Time_Slice |
| @unnumberedsec Pragma Time_Slice |
| @findex Time_Slice |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Time_Slice (static_duration_EXPRESSION); |
| @end smallexample |
| |
| @noindent |
| For implementations of GNAT on operating systems where it is possible |
| to supply a time slice value, this pragma may be used for this purpose. |
| It is ignored if it is used in a system that does not allow this control, |
| or if it appears in other than the main program unit. |
| @cindex OpenVMS |
| Note that the effect of this pragma is identical to the effect of the |
| DEC Ada 83 pragma of the same name when operating under OpenVMS systems. |
| |
| @node Pragma Title |
| @unnumberedsec Pragma Title |
| @findex Title |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Title (TITLING_OPTION [, TITLING OPTION]); |
| |
| TITLING_OPTION ::= |
| [Title =>] STRING_LITERAL, |
| | [Subtitle =>] STRING_LITERAL |
| @end smallexample |
| |
| @noindent |
| Syntax checked but otherwise ignored by GNAT@. This is a listing control |
| pragma used in DEC Ada 83 implementations to provide a title and/or |
| subtitle for the program listing. The program listing generated by GNAT |
| does not have titles or subtitles. |
| |
| Unlike other pragmas, the full flexibility of named notation is allowed |
| for this pragma, i.e.@: the parameters may be given in any order if named |
| notation is used, and named and positional notation can be mixed |
| following the normal rules for procedure calls in Ada. |
| |
| @node Pragma Unchecked_Union |
| @unnumberedsec Pragma Unchecked_Union |
| @cindex Unions in C |
| @findex Unchecked_Union |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Unchecked_Union (first_subtype_LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| This pragma is used to declare that the specified type should be represented |
| in a manner |
| equivalent to a C union type, and is intended only for use in |
| interfacing with C code that uses union types. In Ada terms, the named |
| type must obey the following rules: |
| |
| @itemize @bullet |
| @item |
| It is a non-tagged non-limited record type. |
| @item |
| It has a single discrete discriminant with a default value. |
| @item |
| The component list consists of a single variant part. |
| @item |
| Each variant has a component list with a single component. |
| @item |
| No nested variants are allowed. |
| @item |
| No component has an explicit default value. |
| @item |
| No component has a non-static constraint. |
| @end itemize |
| |
| @noindent |
| In addition, given a type that meets the above requirements, the |
| following restrictions apply to its use throughout the program: |
| |
| @itemize @bullet |
| @item |
| The discriminant name can be mentioned only in an aggregate. |
| @item |
| No subtypes may be created of this type. |
| @item |
| The type may not be constrained by giving a discriminant value. |
| @item |
| The type cannot be passed as the actual for a generic formal with a |
| discriminant. |
| @end itemize |
| |
| @noindent |
| Equality and inequality operations on @code{unchecked_unions} are not |
| available, since there is no discriminant to compare and the compiler |
| does not even know how many bits to compare. It is implementation |
| dependent whether this is detected at compile time as an illegality or |
| whether it is undetected and considered to be an erroneous construct. In |
| GNAT, a direct comparison is illegal, but GNAT does not attempt to catch |
| the composite case (where two composites are compared that contain an |
| unchecked union component), so such comparisons are simply considered |
| erroneous. |
| |
| The layout of the resulting type corresponds exactly to a C union, where |
| each branch of the union corresponds to a single variant in the Ada |
| record. The semantics of the Ada program is not changed in any way by |
| the pragma, i.e.@: provided the above restrictions are followed, and no |
| erroneous incorrect references to fields or erroneous comparisons occur, |
| the semantics is exactly as described by the Ada reference manual. |
| Pragma @code{Suppress (Discriminant_Check)} applies implicitly to the |
| type and the default convention is C. |
| |
| @node Pragma Unimplemented_Unit |
| @unnumberedsec Pragma Unimplemented_Unit |
| @findex Unimplemented_Unit |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Unimplemented_Unit; |
| @end smallexample |
| |
| @noindent |
| If this pragma occurs in a unit that is processed by the compiler, GNAT |
| aborts with the message @samp{@var{xxx} not implemented}, where |
| @var{xxx} is the name of the current compilation unit. This pragma is |
| intended to allow the compiler to handle unimplemented library units in |
| a clean manner. |
| |
| The abort only happens if code is being generated. Thus you can use |
| specs of unimplemented packages in syntax or semantic checking mode. |
| |
| @node Pragma Universal_Data |
| @unnumberedsec Pragma Universal_Data |
| @findex Universal_Data |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Universal_Data [(library_unit_Name)]; |
| @end smallexample |
| |
| @noindent |
| This pragma is supported only for the AAMP target and is ignored for |
| other targets. The pragma specifies that all library-level objects |
| (Counter 0 data) associated with the library unit are to be accessed |
| and updated using universal addressing (24-bit addresses for AAMP5) |
| rather than the default of 16-bit Data Environment (DENV) addressing. |
| Use of this pragma will generally result in less efficient code for |
| references to global data associated with the library unit, but |
| allows such data to be located anywhere in memory. This pragma is |
| a library unit pragma, but can also be used as a configuration pragma |
| (including use in the @file{gnat.adc} file). The functionality |
| of this pragma is also available by applying the -univ switch on the |
| compilations of units where universal addressing of the data is desired. |
| |
| @node Pragma Unreferenced |
| @unnumberedsec Pragma Unreferenced |
| @findex Unreferenced |
| @cindex Warnings, unreferenced |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Unreferenced (local_Name @{, local_Name@}); |
| @end smallexample |
| |
| @noindent |
| This pragma signals that the entities whose names are listed are |
| deliberately not referenced. This suppresses warnings about the |
| entities being unreferenced, and in addition a warning will be |
| generated if one of these entities is in fact referenced. |
| |
| This is particularly useful for clearly signaling that a particular |
| parameter is not referenced in some particular subprogram implementation |
| and that this is deliberate. It can also be useful in the case of |
| objects declared only for their initialization or finalization side |
| effects. |
| |
| If @code{local_Name} identifies more than one matching homonym in the |
| current scope, then the entity most recently declared is the one to which |
| the pragma applies. |
| |
| The left hand side of an assignment does not count as a reference for the |
| purpose of this pragma. Thus it is fine to assign to an entity for which |
| pragma Unreferenced is given. |
| |
| @node Pragma Unreserve_All_Interrupts |
| @unnumberedsec Pragma Unreserve_All_Interrupts |
| @findex Unreserve_All_Interrupts |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Unreserve_All_Interrupts; |
| @end smallexample |
| |
| @noindent |
| Normally certain interrupts are reserved to the implementation. Any attempt |
| to attach an interrupt causes Program_Error to be raised, as described in |
| RM C.3.2(22). A typical example is the @code{SIGINT} interrupt used in |
| many systems for a @kbd{Ctrl-C} interrupt. Normally this interrupt is |
| reserved to the implementation, so that @kbd{Ctrl-C} can be used to |
| interrupt execution. |
| |
| If the pragma @code{Unreserve_All_Interrupts} appears anywhere in any unit in |
| a program, then all such interrupts are unreserved. This allows the |
| program to handle these interrupts, but disables their standard |
| functions. For example, if this pragma is used, then pressing |
| @kbd{Ctrl-C} will not automatically interrupt execution. However, |
| a program can then handle the @code{SIGINT} interrupt as it chooses. |
| |
| For a full list of the interrupts handled in a specific implementation, |
| see the source code for the specification of @code{Ada.Interrupts.Names} in |
| file @file{a-intnam.ads}. This is a target dependent file that contains the |
| list of interrupts recognized for a given target. The documentation in |
| this file also specifies what interrupts are affected by the use of |
| the @code{Unreserve_All_Interrupts} pragma. |
| |
| For a more general facility for controlling what interrupts can be |
| handled, see pragma @code{Interrupt_State}, which subsumes the functionality |
| of the @code{Unreserve_All_Interrupts} pragma. |
| |
| @node Pragma Unsuppress |
| @unnumberedsec Pragma Unsuppress |
| @findex Unsuppress |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Unsuppress (IDENTIFIER [, [On =>] NAME]); |
| @end smallexample |
| |
| @noindent |
| This pragma undoes the effect of a previous pragma @code{Suppress}. If |
| there is no corresponding pragma @code{Suppress} in effect, it has no |
| effect. The range of the effect is the same as for pragma |
| @code{Suppress}. The meaning of the arguments is identical to that used |
| in pragma @code{Suppress}. |
| |
| One important application is to ensure that checks are on in cases where |
| code depends on the checks for its correct functioning, so that the code |
| will compile correctly even if the compiler switches are set to suppress |
| checks. |
| |
| @node Pragma Use_VADS_Size |
| @unnumberedsec Pragma Use_VADS_Size |
| @cindex @code{Size}, VADS compatibility |
| @findex Use_VADS_Size |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Use_VADS_Size; |
| @end smallexample |
| |
| @noindent |
| This is a configuration pragma. In a unit to which it applies, any use |
| of the 'Size attribute is automatically interpreted as a use of the |
| 'VADS_Size attribute. Note that this may result in incorrect semantic |
| processing of valid Ada 95 programs. This is intended to aid in the |
| handling of legacy code which depends on the interpretation of Size |
| as implemented in the VADS compiler. See description of the VADS_Size |
| attribute for further details. |
| |
| @node Pragma Validity_Checks |
| @unnumberedsec Pragma Validity_Checks |
| @findex Validity_Checks |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Validity_Checks (string_LITERAL | ALL_CHECKS | On | Off); |
| @end smallexample |
| |
| @noindent |
| This pragma is used in conjunction with compiler switches to control the |
| built-in validity checking provided by GNAT@. The compiler switches, if set |
| provide an initial setting for the switches, and this pragma may be used |
| to modify these settings, or the settings may be provided entirely by |
| the use of the pragma. This pragma can be used anywhere that a pragma |
| is legal, including use as a configuration pragma (including use in |
| the @file{gnat.adc} file). |
| |
| The form with a string literal specifies which validity options are to be |
| activated. The validity checks are first set to include only the default |
| reference manual settings, and then a string of letters in the string |
| specifies the exact set of options required. The form of this string |
| is exactly as described for the @code{-gnatVx} compiler switch (see the |
| GNAT users guide for details). For example the following two methods |
| can be used to enable validity checking for mode @code{in} and |
| @code{in out} subprogram parameters: |
| |
| @itemize @bullet |
| @item |
| @smallexample @c ada |
| pragma Validity_Checks ("im"); |
| @end smallexample |
| |
| @item |
| @smallexample |
| gcc -c -gnatVim @dots{} |
| @end smallexample |
| @end itemize |
| |
| @noindent |
| The form ALL_CHECKS activates all standard checks (its use is equivalent |
| to the use of the @code{gnatva} switch. |
| |
| The forms with @code{Off} and @code{On} |
| can be used to temporarily disable validity checks |
| as shown in the following example: |
| |
| @smallexample @c ada |
| @iftex |
| @leftskip=0cm |
| @end iftex |
| pragma Validity_Checks ("c"); -- validity checks for copies |
| pragma Validity_Checks (Off); -- turn off validity checks |
| A := B; -- B will not be validity checked |
| pragma Validity_Checks (On); -- turn validity checks back on |
| A := C; -- C will be validity checked |
| @end smallexample |
| |
| @node Pragma Volatile |
| @unnumberedsec Pragma Volatile |
| @findex Volatile |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Volatile (local_NAME); |
| @end smallexample |
| |
| @noindent |
| This pragma is defined by the Ada 95 Reference Manual, and the GNAT |
| implementation is fully conformant with this definition. The reason it |
| is mentioned in this section is that a pragma of the same name was supplied |
| in some Ada 83 compilers, including DEC Ada 83. The Ada 95 implementation |
| of pragma Volatile is upwards compatible with the implementation in |
| Dec Ada 83. |
| |
| @node Pragma Warnings |
| @unnumberedsec Pragma Warnings |
| @findex Warnings |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Warnings (On | Off [, LOCAL_NAME]); |
| @end smallexample |
| |
| @noindent |
| Normally warnings are enabled, with the output being controlled by |
| the command line switch. Warnings (@code{Off}) turns off generation of |
| warnings until a Warnings (@code{On}) is encountered or the end of the |
| current unit. If generation of warnings is turned off using this |
| pragma, then no warning messages are output, regardless of the |
| setting of the command line switches. |
| |
| The form with a single argument is a configuration pragma. |
| |
| If the @var{local_name} parameter is present, warnings are suppressed for |
| the specified entity. This suppression is effective from the point where |
| it occurs till the end of the extended scope of the variable (similar to |
| the scope of @code{Suppress}). |
| |
| @node Pragma Weak_External |
| @unnumberedsec Pragma Weak_External |
| @findex Weak_External |
| @noindent |
| Syntax: |
| |
| @smallexample @c ada |
| pragma Weak_External ([Entity =>] LOCAL_NAME); |
| @end smallexample |
| |
| @noindent |
| This pragma specifies that the given entity should be marked as a weak |
| external (one that does not have to be resolved) for the linker. For |
| further details, consult the GCC manual. |
| |
| @node Implementation Defined Attributes |
| @chapter Implementation Defined Attributes |
| Ada 95 defines (throughout the Ada 95 reference manual, |
| summarized in annex K), |
| a set of attributes that provide useful additional functionality in all |
| areas of the language. These language defined attributes are implemented |
| in GNAT and work as described in the Ada 95 Reference Manual. |
| |
| In addition, Ada 95 allows implementations to define additional |
| attributes whose meaning is defined by the implementation. GNAT provides |
| a number of these implementation-dependent attributes which can be used |
| to extend and enhance the functionality of the compiler. This section of |
| the GNAT reference manual describes these additional attributes. |
| |
| Note that any program using these attributes may not be portable to |
| other compilers (although GNAT implements this set of attributes on all |
| platforms). Therefore if portability to other compilers is an important |
| consideration, you should minimize the use of these attributes. |
| |
| @menu |
| * Abort_Signal:: |
| * Address_Size:: |
| * Asm_Input:: |
| * Asm_Output:: |
| * AST_Entry:: |
| * Bit:: |
| * Bit_Position:: |
| * Code_Address:: |
| * Default_Bit_Order:: |
| * Elaborated:: |
| * Elab_Body:: |
| * Elab_Spec:: |
| * Emax:: |
| * Enum_Rep:: |
| * Epsilon:: |
| * Fixed_Value:: |
| * Has_Discriminants:: |
| * Img:: |
| * Integer_Value:: |
| * Large:: |
| * Machine_Size:: |
| * Mantissa:: |
| * Max_Interrupt_Priority:: |
| * Max_Priority:: |
| * Maximum_Alignment:: |
| * Mechanism_Code:: |
| * Null_Parameter:: |
| * Object_Size:: |
| * Passed_By_Reference:: |
| * Range_Length:: |
| * Safe_Emax:: |
| * Safe_Large:: |
| * Small:: |
| * Storage_Unit:: |
| * Target_Name:: |
| * Tick:: |
| * To_Address:: |
| * Type_Class:: |
| * UET_Address:: |
| * Unconstrained_Array:: |
| * Universal_Literal_String:: |
| * Unrestricted_Access:: |
| * VADS_Size:: |
| * Value_Size:: |
| * Wchar_T_Size:: |
| * Word_Size:: |
| @end menu |
| |
| @node Abort_Signal |
| @unnumberedsec Abort_Signal |
| @findex Abort_Signal |
| @noindent |
| @code{Standard'Abort_Signal} (@code{Standard} is the only allowed |
| prefix) provides the entity for the special exception used to signal |
| task abort or asynchronous transfer of control. Normally this attribute |
| should only be used in the tasking runtime (it is highly peculiar, and |
| completely outside the normal semantics of Ada, for a user program to |
| intercept the abort exception). |
| |
| @node Address_Size |
| @unnumberedsec Address_Size |
| @cindex Size of @code{Address} |
| @findex Address_Size |
| @noindent |
| @code{Standard'Address_Size} (@code{Standard} is the only allowed |
| prefix) is a static constant giving the number of bits in an |
| @code{Address}. It is the same value as System.Address'Size, |
| but has the advantage of being static, while a direct |
| reference to System.Address'Size is non-static because Address |
| is a private type. |
| |
| @node Asm_Input |
| @unnumberedsec Asm_Input |
| @findex Asm_Input |
| @noindent |
| The @code{Asm_Input} attribute denotes a function that takes two |
| parameters. The first is a string, the second is an expression of the |
| type designated by the prefix. The first (string) argument is required |
| to be a static expression, and is the constraint for the parameter, |
| (e.g.@: what kind of register is required). The second argument is the |
| value to be used as the input argument. The possible values for the |
| constant are the same as those used in the RTL, and are dependent on |
| the configuration file used to built the GCC back end. |
| @ref{Machine Code Insertions} |
| |
| @node Asm_Output |
| @unnumberedsec Asm_Output |
| @findex Asm_Output |
| @noindent |
| The @code{Asm_Output} attribute denotes a function that takes two |
| parameters. The first is a string, the second is the name of a variable |
| of the type designated by the attribute prefix. The first (string) |
| argument is required to be a static expression and designates the |
| constraint for the parameter (e.g.@: what kind of register is |
| required). The second argument is the variable to be updated with the |
| result. The possible values for constraint are the same as those used in |
| the RTL, and are dependent on the configuration file used to build the |
| GCC back end. If there are no output operands, then this argument may |
| either be omitted, or explicitly given as @code{No_Output_Operands}. |
| @ref{Machine Code Insertions} |
| |
| @node AST_Entry |
| @unnumberedsec AST_Entry |
| @cindex OpenVMS |
| @findex AST_Entry |
| @noindent |
| This attribute is implemented only in OpenVMS versions of GNAT@. Applied to |
| the name of an entry, it yields a value of the predefined type AST_Handler |
| (declared in the predefined package System, as extended by the use of |
| pragma @code{Extend_System (Aux_DEC)}). This value enables the given entry to |
| be called when an AST occurs. For further details, refer to the @cite{DEC Ada |
| Language Reference Manual}, section 9.12a. |
| |
| @node Bit |
| @unnumberedsec Bit |
| @findex Bit |
| @code{@var{obj}'Bit}, where @var{obj} is any object, yields the bit |
| offset within the storage unit (byte) that contains the first bit of |
| storage allocated for the object. The value of this attribute is of the |
| type @code{Universal_Integer}, and is always a non-negative number not |
| exceeding the value of @code{System.Storage_Unit}. |
| |
| For an object that is a variable or a constant allocated in a register, |
| the value is zero. (The use of this attribute does not force the |
| allocation of a variable to memory). |
| |
| For an object that is a formal parameter, this attribute applies |
| to either the matching actual parameter or to a copy of the |
| matching actual parameter. |
| |
| For an access object the value is zero. Note that |
| @code{@var{obj}.all'Bit} is subject to an @code{Access_Check} for the |
| designated object. Similarly for a record component |
| @code{@var{X}.@var{C}'Bit} is subject to a discriminant check and |
| @code{@var{X}(@var{I}).Bit} and @code{@var{X}(@var{I1}..@var{I2})'Bit} |
| are subject to index checks. |
| |
| This attribute is designed to be compatible with the DEC Ada 83 definition |
| and implementation of the @code{Bit} attribute. |
| |
| @node Bit_Position |
| @unnumberedsec Bit_Position |
| @findex Bit_Position |
| @noindent |
| @code{@var{R.C}'Bit}, where @var{R} is a record object and C is one |
| of the fields of the record type, yields the bit |
| offset within the record contains the first bit of |
| storage allocated for the object. The value of this attribute is of the |
| type @code{Universal_Integer}. The value depends only on the field |
| @var{C} and is independent of the alignment of |
| the containing record @var{R}. |
| |
| @node Code_Address |
| @unnumberedsec Code_Address |
| @findex Code_Address |
| @cindex Subprogram address |
| @cindex Address of subprogram code |
| @noindent |
| The @code{'Address} |
| attribute may be applied to subprograms in Ada 95, but the |
| intended effect from the Ada 95 reference manual seems to be to provide |
| an address value which can be used to call the subprogram by means of |
| an address clause as in the following example: |
| |
| @smallexample @c ada |
| procedure K is @dots{} |
| |
| procedure L; |
| for L'Address use K'Address; |
| pragma Import (Ada, L); |
| @end smallexample |
| |
| @noindent |
| A call to @code{L} is then expected to result in a call to @code{K}@. |
| In Ada 83, where there were no access-to-subprogram values, this was |
| a common work around for getting the effect of an indirect call. |
| GNAT implements the above use of @code{Address} and the technique |
| illustrated by the example code works correctly. |
| |
| However, for some purposes, it is useful to have the address of the start |
| of the generated code for the subprogram. On some architectures, this is |
| not necessarily the same as the @code{Address} value described above. |
| For example, the @code{Address} value may reference a subprogram |
| descriptor rather than the subprogram itself. |
| |
| The @code{'Code_Address} attribute, which can only be applied to |
| subprogram entities, always returns the address of the start of the |
| generated code of the specified subprogram, which may or may not be |
| the same value as is returned by the corresponding @code{'Address} |
| attribute. |
| |
| @node Default_Bit_Order |
| @unnumberedsec Default_Bit_Order |
| @cindex Big endian |
| @cindex Little endian |
| @findex Default_Bit_Order |
| @noindent |
| @code{Standard'Default_Bit_Order} (@code{Standard} is the only |
| permissible prefix), provides the value @code{System.Default_Bit_Order} |
| as a @code{Pos} value (0 for @code{High_Order_First}, 1 for |
| @code{Low_Order_First}). This is used to construct the definition of |
| @code{Default_Bit_Order} in package @code{System}. |
| |
| @node Elaborated |
| @unnumberedsec Elaborated |
| @findex Elaborated |
| @noindent |
| The prefix of the @code{'Elaborated} attribute must be a unit name. The |
| value is a Boolean which indicates whether or not the given unit has been |
| elaborated. This attribute is primarily intended for internal use by the |
| generated code for dynamic elaboration checking, but it can also be used |
| in user programs. The value will always be True once elaboration of all |
| units has been completed. |
| |
| @node Elab_Body |
| @unnumberedsec Elab_Body |
| @findex Elab_Body |
| @noindent |
| This attribute can only be applied to a program unit name. It returns |
| the entity for the corresponding elaboration procedure for elaborating |
| the body of the referenced unit. This is used in the main generated |
| elaboration procedure by the binder and is not normally used in any |
| other context. However, there may be specialized situations in which it |
| is useful to be able to call this elaboration procedure from Ada code, |
| e.g.@: if it is necessary to do selective re-elaboration to fix some |
| error. |
| |
| @node Elab_Spec |
| @unnumberedsec Elab_Spec |
| @findex Elab_Spec |
| @noindent |
| This attribute can only be applied to a program unit name. It returns |
| the entity for the corresponding elaboration procedure for elaborating |
| the specification of the referenced unit. This is used in the main |
| generated elaboration procedure by the binder and is not normally used |
| in any other context. However, there may be specialized situations in |
| which it is useful to be able to call this elaboration procedure from |
| Ada code, e.g.@: if it is necessary to do selective re-elaboration to fix |
| some error. |
| |
| @node Emax |
| @unnumberedsec Emax |
| @cindex Ada 83 attributes |
| @findex Emax |
| @noindent |
| The @code{Emax} attribute is provided for compatibility with Ada 83. See |
| the Ada 83 reference manual for an exact description of the semantics of |
| this attribute. |
| |
| @node Enum_Rep |
| @unnumberedsec Enum_Rep |
| @cindex Representation of enums |
| @findex Enum_Rep |
| @noindent |
| For every enumeration subtype @var{S}, @code{@var{S}'Enum_Rep} denotes a |
| function with the following spec: |
| |
| @smallexample @c ada |
| function @var{S}'Enum_Rep (Arg : @var{S}'Base) |
| return @i{Universal_Integer}; |
| @end smallexample |
| |
| @noindent |
| It is also allowable to apply @code{Enum_Rep} directly to an object of an |
| enumeration type or to a non-overloaded enumeration |
| literal. In this case @code{@var{S}'Enum_Rep} is equivalent to |
| @code{@var{typ}'Enum_Rep(@var{S})} where @var{typ} is the type of the |
| enumeration literal or object. |
| |
| The function returns the representation value for the given enumeration |
| value. This will be equal to value of the @code{Pos} attribute in the |
| absence of an enumeration representation clause. This is a static |
| attribute (i.e.@: the result is static if the argument is static). |
| |
| @code{@var{S}'Enum_Rep} can also be used with integer types and objects, |
| in which case it simply returns the integer value. The reason for this |
| is to allow it to be used for @code{(<>)} discrete formal arguments in |
| a generic unit that can be instantiated with either enumeration types |
| or integer types. Note that if @code{Enum_Rep} is used on a modular |
| type whose upper bound exceeds the upper bound of the largest signed |
| integer type, and the argument is a variable, so that the universal |
| integer calculation is done at run-time, then the call to @code{Enum_Rep} |
| may raise @code{Constraint_Error}. |
| |
| @node Epsilon |
| @unnumberedsec Epsilon |
| @cindex Ada 83 attributes |
| @findex Epsilon |
| @noindent |
| The @code{Epsilon} attribute is provided for compatibility with Ada 83. See |
| the Ada 83 reference manual for an exact description of the semantics of |
| this attribute. |
| |
| @node Fixed_Value |
| @unnumberedsec Fixed_Value |
| @findex Fixed_Value |
| @noindent |
| For every fixed-point type @var{S}, @code{@var{S}'Fixed_Value} denotes a |
| function with the following specification: |
| |
| @smallexample @c ada |
| function @var{S}'Fixed_Value (Arg : @i{Universal_Integer}) |
| return @var{S}; |
| @end smallexample |
| |
| @noindent |
| The value returned is the fixed-point value @var{V} such that |
| |
| @smallexample @c ada |
| @var{V} = Arg * @var{S}'Small |
| @end smallexample |
| |
| @noindent |
| The effect is thus similar to first converting the argument to the |
| integer type used to represent @var{S}, and then doing an unchecked |
| conversion to the fixed-point type. The difference is |
| that there are full range checks, to ensure that the result is in range. |
| This attribute is primarily intended for use in implementation of the |
| input-output functions for fixed-point values. |
| |
| @node Has_Discriminants |
| @unnumberedsec Has_Discriminants |
| @cindex Discriminants, testing for |
| @findex Has_Discriminants |
| @noindent |
| The prefix of the @code{Has_Discriminants} attribute is a type. The result |
| is a Boolean value which is True if the type has discriminants, and False |
| otherwise. The intended use of this attribute is in conjunction with generic |
| definitions. If the attribute is applied to a generic private type, it |
| indicates whether or not the corresponding actual type has discriminants. |
| |
| @node Img |
| @unnumberedsec Img |
| @findex Img |
| @noindent |
| The @code{Img} attribute differs from @code{Image} in that it may be |
| applied to objects as well as types, in which case it gives the |
| @code{Image} for the subtype of the object. This is convenient for |
| debugging: |
| |
| @smallexample @c ada |
| Put_Line ("X = " & X'Img); |
| @end smallexample |
| |
| @noindent |
| has the same meaning as the more verbose: |
| |
| @smallexample @c ada |
| Put_Line ("X = " & @var{T}'Image (X)); |
| @end smallexample |
| |
| @noindent |
| where @var{T} is the (sub)type of the object @code{X}. |
| |
| @node Integer_Value |
| @unnumberedsec Integer_Value |
| @findex Integer_Value |
| @noindent |
| For every integer type @var{S}, @code{@var{S}'Integer_Value} denotes a |
| function with the following spec: |
| |
| @smallexample @c ada |
| function @var{S}'Integer_Value (Arg : @i{Universal_Fixed}) |
| return @var{S}; |
| @end smallexample |
| |
| @noindent |
| The value returned is the integer value @var{V}, such that |
| |
| @smallexample @c ada |
| Arg = @var{V} * @var{T}'Small |
| @end smallexample |
| |
| @noindent |
| where @var{T} is the type of @code{Arg}. |
| The effect is thus similar to first doing an unchecked conversion from |
| the fixed-point type to its corresponding implementation type, and then |
| converting the result to the target integer type. The difference is |
| that there are full range checks, to ensure that the result is in range. |
| This attribute is primarily intended for use in implementation of the |
| standard input-output functions for fixed-point values. |
| |
| @node Large |
| @unnumberedsec Large |
| @cindex Ada 83 attributes |
|
|