In addition to the implementation dependent pragmas and attributes, and the implementation advice, there are a number of other Ada features that are potentially implementation dependent and are designated as implementation-defined. These are mentioned throughout the Ada Reference Manual, and are summarized in Annex M.
A requirement for conforming Ada compilers is that they provide documentation describing how the implementation deals with each of these issues. In this chapter you will find each point in Annex M listed, followed by a description of how GNAT handles the implementation dependence.
You can use this chapter as a guide to minimizing implementation dependent features in your programs if portability to other compilers and other operating systems is an important consideration. The numbers in each entry below correspond to the paragraph numbers in the Ada Reference Manual.
The complexity of programs that can be processed is limited only by the total amount of available virtual memory, and disk space for the generated object files.
There are no variations from the standard.
Any `code_statement' can potentially cause external interactions.
See separate section on source representation.
See separate section on source representation.
See separate section on source representation.
The maximum line length is 255 characters and the maximum length of a lexical element is also 255 characters. This is the default setting if not overridden by the use of compiler switch `-gnaty' (which sets the maximum to 79) or `-gnatyMnn' which allows the maximum line length to be specified to be any value up to 32767. The maximum length of a lexical element is the same as the maximum line length.
See Implementation Defined Pragmas.
Optimize
. See 2.8(27)."
Pragma Optimize
, if given with a Time
or Space
parameter, checks that the optimization flag is set, and aborts if it is
not.
S'Image
when some of the graphic characters of
S'Wide_Image
are not defined in Character
. See
3.5(37)."
The sequence of characters is as defined by the wide character encoding method used for the source. See section on source representation for further details.
Standard
. See 3.5.4(25)."
Type | Representation |
---|---|
`Short_Short_Integer' | 8-bit signed |
`Short_Integer' | 16-bit signed |
`Integer' | 32-bit signed |
`Long_Integer' | 64-bit signed (on most 64-bit targets, depending on the C definition of long) 32-bit signed (on all other targets) |
`Long_Long_Integer' | 64-bit signed |
`Long_Long_Long_Integer' | 128-bit signed (on 64-bit targets) 64-bit signed (on 32-bit targets) |
There are no nonstandard integer types.
There are no nonstandard real types.
The precision and range is as defined by the IEEE standard.
Standard
. See 3.5.7(16)."
Type | Representation |
---|---|
`Short_Float' | 32 bit IEEE short |
`Float' | (Short) 32 bit IEEE short |
`Long_Float' | 64 bit IEEE long |
`Long_Long_Float' | 64 bit IEEE long (80 bit IEEE long on x86 processors) |
The small is the largest power of two that does not exceed the delta.
For an ordinary fixed point type, on 32-bit platforms, the small must lie in 2.0**(-80) .. 2.0**80 and the range in -9.0E+36 .. 9.0E+36; any combination is permitted that does not result in a mantissa larger than 63 bits.
On 64-bit platforms, the small must lie in 2.0**(-127) .. 2.0**127 and the range in -1.0E+76 .. 1.0E+76; any combination is permitted that does not result in a mantissa larger than 63 bits, and any combination is permitted that results in a mantissa between 64 and 127 bits if the small is the ratio of two integers that lie in 1 .. 2.0**127.
If the small is the ratio of two integers with 64-bit magnitude on 32-bit
platforms and 128-bit magnitude on 64-bit platforms, which is the case if
no small
clause is provided, then the operations of the fixed point
type are entirely implemented by means of integer instructions. In the
other cases, some operations, in particular input and output, may be
implemented by means of floating-point instructions and may be affected
by accuracy issues on architectures other than x86.
For a decimal fixed point type, on 32-bit platforms, the small must lie in 1.0E-18 .. 1.0E+18 and the digits in 1 .. 18. On 64-bit platforms, the small must lie in 1.0E-38 .. 1.0E+38 and the digits in 1 .. 38.
Tags.Expanded_Name
for types declared
within an unnamed `block_statement'. See 3.9(10)."
Block numbers of the form B`nnn'
, where `nnn' is a
decimal integer are allocated.
See Implementation Defined Attributes.
There are no implementation-defined time types.
See 9.6(20). The time base used is that provided by the C library
function gettimeofday
.
Calendar.Time
. See
9.6(23)."
The time base used is that provided by the C library function
gettimeofday
.
Calendar
operations. See 9.6(24)."
The time zone used by package Calendar
is the current system time zone
setting for local time, as accessed by the C library function
localtime
.
There are no such limits.
Component_Size
is specified for the object. See
9.10(1)."
Separate components are independently addressable if they do not share overlapping storage units.
A compilation is represented by a sequence of files presented to the compiler in a single invocation of the `gcc' command.
No single file can contain more than one compilation unit, but any sequence of files can be presented to the compiler as a single compilation.
See separate section on compilation model.
If a unit contains an Ada main program, then the Ada units for the partition are determined by recursive application of the rules in the Ada Reference Manual section 10.2(2-6). In other words, the Ada units will be those that are needed by the main program, and then this definition of need is applied recursively to those units, and the partition contains the transitive closure determined by this relationship. In short, all the necessary units are included, with no need to explicitly specify the list. If additional units are required, e.g., by foreign language units, then all units must be mentioned in the context clause of one of the needed Ada units.
If the partition contains no main program, or if the main program is in a language other than Ada, then GNAT provides the binder options `-z' and `-n' respectively, and in this case a list of units can be explicitly supplied to the binder for inclusion in the partition (all units needed by these units will also be included automatically). For full details on the use of these options, refer to `GNAT Make Program gnatmake' in the GNAT User’s Guide.
The units needed by a given compilation unit are as defined in the Ada Reference Manual section 10.2(2-6). There are no implementation-defined pragmas or other implementation-defined means for specifying needed units.
The main program is designated by providing the name of the
corresponding ALI
file as the input parameter to the binder.
The first constraint on ordering is that it meets the requirements of Chapter 10 of the Ada Reference Manual. This still leaves some implementation dependent choices, which are resolved by first elaborating bodies as early as possible (i.e., in preference to specs where there is a choice), and second by evaluating the immediate with clauses of a unit to determine the probably best choice, and third by elaborating in alphabetical order of unit names where a choice still remains.
The main program has no parameters. It may be a procedure, or a function
returning an integer type. In the latter case, the returned integer
value is the return code of the program (overriding any value that
may have been set by a call to Ada.Command_Line.Set_Exit_Status
).
GNAT itself supports programs with only a single partition. The GNATDIST tool provided with the GLADE package (which also includes an implementation of the PCS) provides a completely flexible method for building and running programs consisting of multiple partitions. See the separate GLADE manual for details.
See separate section on compilation model.
Passive partitions are supported on targets where shared memory is provided by the operating system. See the GLADE reference manual for further details.
Exception_Message
. See
11.4.1(10)."
Exception message returns the null string unless a specific message has been passed by the program.
Exceptions.Exception_Name
for types
declared within an unnamed `block_statement'. See 11.4.1(12)."
Blocks have implementation defined names of the form B`nnn'
where `nnn' is an integer.
Exception_Information
. See 11.4.1(13)."
Exception_Information
returns a string in the following format:
*Exception_Name:* nnnnn *Message:* mmmmm *PID:* ppp *Load address:* 0xhhhh *Call stack traceback locations:* 0xhhhh 0xhhhh 0xhhhh ... 0xhhh
where
nnnn
is the fully qualified name of the exception in all upper case letters. This line is always present.mmmm
is the message (this line present only if message is non-null)ppp
is the Process Id value as a decimal integer (this line is present only if the Process Id is nonzero). Currently we are not making use of this field.- The Load address line, the Call stack traceback locations line and the following values are present only if at least one traceback location was recorded. The Load address indicates the address at which the main executable was loaded; this line may not be present if operating system hasn’t relocated the main executable. The values are given in C style format, with lower case letters for a-f, and only as many digits present as are necessary. The line terminator sequence at the end of each line, including the last line is a single
LF
character (16#0A#
).
The implementation defined check names include Alignment_Check,
Atomic_Synchronization, Duplicated_Tag_Check, Container_Checks,
Tampering_Check, Predicate_Check, and Validity_Check. In addition, a user
program can add implementation-defined check names by means of the pragma
Check_Name. See the description of pragma Suppress
for full details.
See separate section on data representations.
See separate section on data representations.
Size
for indefinite subtypes. See
13.3(48)."
Size for an indefinite subtype is the maximum possible size, except that for the case of a subprogram parameter, the size of the parameter object is the actual size.
The default external representation for a type tag is the fully expanded name of the type in upper case letters.
A compilation unit is the same in two different partitions if and only if it derives from the same source file.
The only implementation defined component is the tag for a tagged type, which contains a pointer to the dispatching table.
Word_Size
= Storage_Unit
, the default bit
ordering. See 13.5.3(5)."
Word_Size
(32) is not the same as Storage_Unit
(8) for this
implementation, so no non-default bit ordering is supported. The default
bit ordering corresponds to the natural endianness of the target architecture.
System
and its language-defined children. See 13.7(2)."
See the definition of these packages in files system.ads
and
s-stoele.ads
. Note that two declarations are added to package
System.
Max_Priority : constant Positive := Priority'Last; Max_Interrupt_Priority : constant Positive := Interrupt_Priority'Last;
System.Machine_Code
, and the meaning of
`code_statements'. See 13.8(7)."
See the definition and documentation in file s-maccod.ads
.
Unchecked conversion between types of the same size results in an uninterpreted transmission of the bits from one type to the other. If the types are of unequal sizes, then in the case of discrete types, a shorter source is first zero or sign extended as necessary, and a shorter target is simply truncated on the left. For all non-discrete types, the source is first copied if necessary to ensure that the alignment requirements of the target are met, then a pointer is constructed to the source value, and the result is obtained by dereferencing this pointer after converting it to be a pointer to the target type. Unchecked conversions where the target subtype is an unconstrained array are not permitted. If the target alignment is greater than the source alignment, then a copy of the result is made with appropriate alignment
For assignments and other operations where the use of invalid values cannot result in erroneous behavior, the compiler ignores the possibility of invalid values. An exception is raised at the point where an invalid value would result in erroneous behavior. For example executing:
procedure invalidvals is X : Integer := -1; Y : Natural range 1 .. 10; for Y'Address use X'Address; Z : Natural range 1 .. 10; A : array (Natural range 1 .. 10) of Integer; begin Z := Y; -- no exception A (Z) := 3; -- exception raised; end;
As indicated, an exception is raised on the array assignment, but not on the simple assignment of the invalid negative value from Y to Z.
Storage_Pool
is not specified for the type. See 13.11(17)."
There are 3 different standard pools used by the compiler when
Storage_Pool
is not specified depending whether the type is local
to a subprogram or defined at the library level and whether
Storage_Size``is specified or not. See documentation in the runtime
library units ``System.Pool_Global
, System.Pool_Size
and
System.Pool_Local
in files s-poosiz.ads
,
s-pooglo.ads
and s-pooloc.ads
for full details on the
default pools used.
See documentation in the sources of the run time mentioned in the previous paragraph. All these pools are accessible by means of withing these units.
Storage_Size
. See 13.11(18)."
Storage_Size
is measured in storage units, and refers to the
total space available for an access type collection, or to the primary
stack space for a task.
See documentation in the sources of the run time mentioned in the paragraph about standard storage pools above for details on GNAT-defined aspects of storage pools.
Restrictions
. See 13.12(7)."
See Standard and Implementation Defined Restrictions.
Restrictions
pragmas. See 13.12(9)."
Restrictions that can be checked at compile time result in illegalities if violated. Currently there are no other consequences of violating restrictions.
Read
and
Write
attributes of elementary types in terms of stream
elements. See 13.13.2(9)."
The representation is the in-memory representation of the base type of
the type, using the number of bits corresponding to the
type'Size
value, and the natural ordering of the machine.
Standard
. See A.1(3)."
See items describing the integer and floating-point types supported.
Character_Set_Version
.
See A.3.5(3)."
Ada.Wide_Characters.Handling.Character_Set_Version
returns
the string "Unicode 4.0", referring to version 4.0 of the
Unicode specification.
The elementary functions correspond to the functions available in the C library. Only fast math mode is implemented.
Numerics.Generic_Elementary_Functions
, when
Float_Type'Signed_Zeros
is True
. See A.5.1(46)."
The sign of zeroes follows the requirements of the IEEE 754 standard on floating-point.
Numerics.Float_Random.Max_Image_Width
. See A.5.2(27)."
Maximum image width is 6864, see library file s-rannum.ads
.
Numerics.Discrete_Random.Max_Image_Width
. See A.5.2(27)."
Maximum image width is 6864, see library file s-rannum.ads
.
The algorithm is the Mersenne Twister, as documented in the source file
s-rannum.adb
. This version of the algorithm has a period of
2**19937-1.
The value returned by the Image function is the concatenation of the fixed-width decimal representations of the 624 32-bit integers of the state vector.
The minimum period between reset calls to guarantee distinct series of random numbers is one microsecond.
Model_Mantissa
,
Model_Emin
, Model_Epsilon
, Model
,
Safe_First
, and Safe_Last
attributes, if the Numerics
Annex is not supported. See A.5.3(72)."
Run the compiler with `-gnatS' to produce a listing of package
Standard
, has the values of all numeric attributes.
There are no special implementation defined characteristics for these packages.
Buffer_Size
in Storage_IO
. See
A.9(10)."
All type representations are contiguous, and the Buffer_Size
is
the value of type'Size
rounded up to the next storage unit
boundary.
These files are mapped onto the files provided by the C streams
libraries. See source file i-cstrea.ads
for further details.
Put
. See
A.10.9(36)."
If more digits are requested in the output than are represented by the precision of the value, zeroes are output in the corresponding least significant digit positions.
Argument_Count
, Argument
, and
Command_Name
. See A.15(1)."
These are mapped onto the argv
and argc
parameters of the
main program in the natural manner.
Form
parameter in procedure
Create_Directory
. See A.16(56)."
The Form
parameter is not used.
Form
parameter in procedure
Create_Path
. See A.16(60)."
The Form
parameter is not used.
Form
parameter in procedure
Copy_File
. See A.16(68)."
The Form
parameter is case-insensitive.
Two fields are recognized in the Form
parameter:
*preserve=<value>* *mode=<value>*
<value> starts immediately after the character ’=’ and ends with the character immediately preceding the next comma (’,’) or with the last character of the parameter.
The only possible values for preserve= are:
Value | Meaning |
---|---|
`no_attributes' | Do not try to preserve any file attributes. This is the default if no preserve= is found in Form. |
`all_attributes' | Try to preserve all file attributes (timestamps, access rights). |
`timestamps' | Preserve the timestamp of the copied file, but not the other file attributes. |
The only possible values for mode= are:
Value | Meaning |
---|---|
`copy' | Only do the copy if the destination file does not already exist. If it already exists, Copy_File fails. |
`overwrite' | Copy the file in all cases. Overwrite an already existing destination file. |
`append' | Append the original file to the destination file. If the destination file does not exist, the destination file is a copy of the source file. When mode=append, the field preserve=, if it exists, is not taken into account. |
If the Form parameter includes one or both of the fields and the value or values are incorrect, Copy_file fails with Use_Error.
Examples of correct Forms:
Form => "preserve=no_attributes,mode=overwrite" (the default) Form => "mode=append" Form => "mode=copy, preserve=all_attributes"
Examples of incorrect Forms:
Form => "preserve=junk" Form => "mode=internal, preserve=timestamps"
Pattern
parameter, when not the null string,
in the Start_Search
and Search
procedures.
See A.16(104) and A.16(112)."
When the Pattern
parameter is not the null string, it is interpreted
according to the syntax of regular expressions as defined in the
GNAT.Regexp
package.
See GNAT.Regexp (g-regexp.ads).
The following convention names are supported
Convention Name | Interpretation |
---|---|
`Ada' | Ada |
`Ada_Pass_By_Copy' | Allowed for any types except by-reference types such as limited records. Compatible with convention Ada, but causes any parameters with this convention to be passed by copy. |
`Ada_Pass_By_Reference' | Allowed for any types except by-copy types such as scalars. Compatible with convention Ada, but causes any parameters with this convention to be passed by reference. |
`Assembler' | Assembly language |
`Asm' | Synonym for Assembler |
`Assembly' | Synonym for Assembler |
`C' | C |
`C_Pass_By_Copy' | Allowed only for record types, like C, but also notes that record is to be passed by copy rather than reference. |
`COBOL' | COBOL |
`C_Plus_Plus (or CPP)' | C++ |
`Default' | Treated the same as C |
`External' | Treated the same as C |
`Fortran' | Fortran |
`Intrinsic' | For support of pragma Import with convention Intrinsic, see
separate section on Intrinsic Subprograms. |
`Stdcall' | Stdcall (used for Windows implementations only). This convention correspond to the WINAPI (previously called Pascal convention) C/C++ convention under Windows. A routine with this convention cleans the stack before exit. This pragma cannot be applied to a dispatching call. |
`DLL' | Synonym for Stdcall |
`Win32' | Synonym for Stdcall |
`Stubbed' | Stubbed is a special convention used to indicate that the body of the
subprogram will be entirely ignored. Any call to the subprogram
is converted into a raise of the Program_Error exception. If a
pragma Import specifies convention stubbed then no body need
be present at all. This convention is useful during development for the
inclusion of subprograms whose body has not yet been written.
In addition, all otherwise unrecognized convention names are also
treated as being synonymous with convention C. In all implementations,
use of such other names results in a warning. |
Link names are the actual names used by the linker.
The default linker name is that which would be assigned by the relevant external language, interpreting the Ada name as being in all lower case letters.
Linker_Options
. See B.1(37)."
The string passed to Linker_Options
is presented uninterpreted as
an argument to the link command, unless it contains ASCII.NUL characters.
NUL characters if they appear act as argument separators, so for example
pragma Linker_Options ("-labc" & ASCII.NUL & "-ldef");
causes two separate arguments -labc
and -ldef
to be passed to the
linker. The order of linker options is preserved for a given unit. The final
list of options passed to the linker is in reverse order of the elaboration
order. For example, linker options for a body always appear before the options
from the corresponding package spec.
Interfaces
and its language-defined descendants. See B.2(1)."
See files with prefix i-
in the distributed library.
Interfaces
. The contents of the visible part of package
Interfaces
. See B.2(11)."
See files with prefix i-
in the distributed library.
Floating
, Long_Floating
,
Binary
, Long_Binary
, Decimal_ Element
, and
COBOL_Character
; and the initialization of the variables
Ada_To_COBOL
and COBOL_To_Ada
, in
Interfaces.COBOL
. See B.4(50)."
COBOL | Ada |
---|---|
`Floating' | Float |
`Long_Floating' | (Floating) Long_Float |
`Binary' | Integer |
`Long_Binary' | Long_Long_Integer |
`Decimal_Element' | Character |
`COBOL_Character' | Character |
For initialization, see the file i-cobol.ads
in the distributed library.
See documentation in file s-maccod.ads
in the distributed library.
See documentation in file s-maccod.ads
in the distributed library.
Interrupts are mapped to signals or conditions as appropriate. See
definition of unit
Ada.Interrupt_Names
in source file a-intnam.ads
for details
on the interrupts supported on a particular target.
GNAT does not permit a partition to be restarted without reloading, except under control of the debugger.
Discard_Names
. See C.5(7)."
Pragma Discard_Names
causes names of enumeration literals to
be suppressed. In the presence of this pragma, the Image attribute
provides the image of the Pos of the literal, and Value accepts
Pos values.
For tagged types, when pragmas Discard_Names
and No_Tagged_Streams
simultaneously apply, their Expanded_Name and External_Tag are initialized
with empty strings. This is useful to avoid exposing entity names at binary
level.
Task_Identification.Image
attribute. See C.7.1(7)."
The result of this attribute is a string that identifies
the object or component that denotes a given task. If a variable Var
has a task type, the image for this task will have the form Var_`XXXXXXXX'
,
where the suffix `XXXXXXXX'
is the hexadecimal representation of the virtual address of the corresponding
task control block. If the variable is an array of tasks, the image of each
task will have the form of an indexed component indicating the position of a
given task in the array, e.g., Group(5)_`XXXXXXX'
. If the task is a
component of a record, the image of the task will have the form of a selected
component. These rules are fully recursive, so that the image of a task that
is a subcomponent of a composite object corresponds to the expression that
designates this task.
If a task is created by an allocator, its image depends on the context. If the allocator is part of an object declaration, the rules described above are used to construct its image, and this image is not affected by subsequent assignments. If the allocator appears within an expression, the image includes only the name of the task type.
If the configuration pragma Discard_Names is present, or if the restriction No_Implicit_Heap_Allocation is in effect, the image reduces to the numeric suffix, that is to say the hexadecimal representation of the virtual address of the control block of the task.
Current_Task
when in a protected entry
or interrupt handler. See C.7.1(17)."
Protected entries or interrupt handlers can be executed by any
convenient thread, so the value of Current_Task
is undefined.
Current_Task
from an entry
body or interrupt handler. See C.7.1(19)."
When GNAT can determine statically that Current_Task
is called directly in
the body of an entry (or barrier) then a warning is emitted and Program_Error
is raised at run time. Otherwise, the effect of calling Current_Task
from an
entry body or interrupt handler is to return the identification of the task
currently executing the code.
Task_Attributes
. See C.7.2(19)."
There are no implementation-defined aspects of Task_Attributes
.
Metrics
. See D(2)."
The metrics information for GNAT depends on the performance of the underlying operating system. The sources of the run-time for tasking implementation, together with the output from `-gnatG' can be used to determine the exact sequence of operating systems calls made to implement various tasking constructs. Together with appropriate information on the performance of the underlying operating system, on the exact target in use, this information can be used to determine the required metrics.
Any_Priority
and
Priority
. See D.1(11)."
See declarations in file system.ads
.
There are no implementation-defined execution resources.
On a multi-processor, a task that is waiting for access to a protected object does not keep its processor busy.
Tasks map to threads in the threads package used by GNAT. Where possible and appropriate, these threads correspond to native threads of the underlying operating system.
Task_Dispatching_Policy
. See D.2.2(3)."
There are no implementation-defined policy-identifiers allowed in this pragma.
Execution of a task cannot be preempted by the implementation processing of delay expirations for lower priority tasks.
The policy is the same as that of the underlying threads implementation.
Locking_Policy
. See D.3(4)."
The two implementation defined policies permitted in GNAT are
Inheritance_Locking
and Concurrent_Readers_Locking
. On
targets that support the Inheritance_Locking
policy, locking is
implemented by inheritance, i.e., the task owning the lock operates
at a priority equal to the highest priority of any task currently
requesting the lock. On targets that support the
Concurrent_Readers_Locking
policy, locking is implemented with a
read/write lock allowing multiple protected object functions to enter
concurrently.
The ceiling priority of protected objects of the type
System.Interrupt_Priority'Last
as described in the Ada
Reference Manual D.3(10),
The ceiling priority of internal protected objects is
System.Priority'Last
.
There are no implementation-defined queuing policies.
The semantics for abort on a multi-processor is the same as on a single processor, there are no further delays.
The only operation that implicitly requires heap storage allocation is task creation.
No_Task_Termination
. See D.7(15)."
Execution is erroneous in that case.
Restrictions
. See D.7(20)."
There are no such implementation-defined aspects.
Real_Time
. See D.8(17)."
There are no implementation defined aspects of package Real_Time
.
Any difference greater than one microsecond will cause the task to be delayed (see D.9(7)).
The upper bound is determined by the underlying operating system. In no cases is it more than 10 milliseconds.
The GLADE package provides a utility GNATDIST for creating and executing distributed programs. See the GLADE reference manual for further details.
See the GLADE reference manual for full details on such events.
See the GLADE reference manual for full details on these aspects of multi-partition execution.
Editing the source file of a compilation unit, or the source files of any units on which it is dependent in a significant way cause the version to change. No other actions cause the version number to change. All changes are significant except those which affect only layout, capitalization or comments.
See the GLADE reference manual for details on the effect of abort in a distributed application.
See the GLADE reference manual for a full description of all implementation defined aspects of the PCS.
See the GLADE reference manual for a full description of all implementation defined interfaces.
Decimal
. See F.2(7)."
Named Number | Value |
---|---|
`Max_Scale' | +18 |
`Min_Scale' | -18 |
`Min_Delta' | 1.0E-18 |
`Max_Delta' | 1.0E+18 |
`Max_Decimal_Digits' | 18 |
Max_Picture_Length
in the package
Text_IO.Editing
. See F.3.3(16)."
64
Max_Picture_Length
in the package
Wide_Text_IO.Editing
. See F.3.4(5)."
64
Standard library functions are used for the complex arithmetic operations. Only fast math mode is currently supported.
Numerics.Generic_Complex_Types
, when
Real'Signed_Zeros
is True. See G.1.1(53)."
The signs of zero values are as recommended by the relevant implementation advice.
Numerics.Generic_Complex_Elementary_Functions
, when
Real'Signed_Zeros
is True
. See G.1.2(45)."
The signs of zero values are as recommended by the relevant implementation advice.
The strict mode is the default. There is no separate relaxed mode. GNAT provides a highly efficient implementation of strict mode.
For cases where the result interval is implementation dependent, the accuracy is that provided by performing all operations in 64-bit IEEE floating-point format.
Machine_Overflows
attribute of the
result type is False
. See G.2.1(13)."
Infinite and NaN values are produced as dictated by the IEEE floating-point standard. Note that on machines that are not fully compliant with the IEEE floating-point standard, such as Alpha, the `-mieee' compiler flag must be used for achieving IEEE conforming behavior (although at the cost of a significant performance penalty), so infinite and NaN values are properly generated.
Not relevant, division is IEEE exact.
Operations in the close result set are performed using IEEE long format floating-point arithmetic. The input operands are converted to floating-point, the operation is done in floating-point, and the result is converted to the target type.
The result is only defined to be in the perfect result set if the result can be computed by a single scaling operation involving a scale factor representable in 64 bits.
Machine_Overflows
attribute of the
result type is False
. See G.2.3(27)."
Not relevant, Machine_Overflows
is True
for fixed-point
types.
Machine_Overflows
attribute of the
result type is False
. See G.2.4(4)."
IEEE infinite and Nan values are produced as appropriate.
Information on this subject is not yet available.
Information on this subject is not yet available.
Machine_Overflows
attribute of the corresponding real type is
False
. See G.2.6(5)."
IEEE infinite and Nan values are produced as appropriate.
Information on those subjects is not yet available.
Information on this subject is not yet available.
Inspection_Point
. See H.3.2(8)."
Pragma Inspection_Point
ensures that the variable is live and can
be examined by the debugger at the inspection point.
Restrictions
. See H.4(25)."
There are no implementation-defined aspects of pragma Restrictions
. The
use of pragma Restrictions [No_Exceptions]
has no effect on the
generated code. Checks must suppressed by use of pragma Suppress
.
Restrictions
. See
H.4(27)."
There are no restrictions on pragma Restrictions
.