Next: Additions to Ada, Previous: Ada Mode Intro, Up: Ada   [Contents][Index]


15.4.10.2 Omissions from Ada

Here are the notable omissions from the subset:

  • Only a subset of the attributes are supported:
    • - 'First, 'Last, and 'Length on array objects (not on types and subtypes).
    • - 'Min and 'Max.
    • - 'Pos and 'Val.
    • - 'Tag.
    • - 'Range on array objects (not subtypes), but only as the right operand of the membership (in) operator.
    • - 'Access, 'Unchecked_Access, and 'Unrestricted_Access (a GNAT extension).
    • - 'Address.
  • The names in Characters.Latin_1 are not available and concatenation is not implemented. Thus, escape characters in strings are not currently available.
  • Equality tests (‘=’ and ‘/=’) on arrays test for bitwise equality of representations. They will generally work correctly for strings and arrays whose elements have integer or enumeration types. They may not work correctly for arrays whose element types have user-defined equality, for arrays of real values (in particular, IEEE-conformant floating point, because of negative zeroes and NaNs), and for arrays whose elements contain unused bits with indeterminate values.
  • The other component-by-component array operations (and, or, xor, not, and relational tests other than equality) are not implemented.
  • There is limited support for array and record aggregates. They are permitted only on the right sides of assignments, as in these examples:

    (gdb) set An_Array := (1, 2, 3, 4, 5, 6)
    (gdb) set An_Array := (1, others => 0)
    (gdb) set An_Array := (0|4 => 1, 1..3 => 2, 5 => 6)
    (gdb) set A_2D_Array := ((1, 2, 3), (4, 5, 6), (7, 8, 9))
    (gdb) set A_Record := (1, "Peter", True);
    (gdb) set A_Record := (Name => "Peter", Id => 1, Alive => True)

    Changing a discriminant’s value by assigning an aggregate has an undefined effect if that discriminant is used within the record. However, you can first modify discriminants by directly assigning to them (which normally would not be allowed in Ada), and then performing an aggregate assignment. For example, given a variable A_Rec declared to have a type such as:

    type Rec (Len : Small_Integer := 0) is record
        Id : Integer;
        Vals : IntArray (1 .. Len);
    end record;

    you can assign a value with a different size of Vals with two assignments:

    (gdb) set A_Rec.Len := 4
    (gdb) set A_Rec := (Id => 42, Vals => (1, 2, 3, 4))

    As this example also illustrates, GDB is very loose about the usual rules concerning aggregates. You may leave out some of the components of an array or record aggregate (such as the Len component in the assignment to A_Rec above); they will retain their original values upon assignment. You may freely use dynamic values as indices in component associations. You may even use overlapping or redundant component associations, although which component values are assigned in such cases is not defined.

  • Calls to dispatching subprograms are not implemented.
  • The overloading algorithm is much more limited (i.e., less selective) than that of real Ada. It makes only limited use of the context in which a subexpression appears to resolve its meaning, and it is much looser in its rules for allowing type matches. As a result, some function calls will be ambiguous, and the user will be asked to choose the proper resolution.
  • The new operator is not implemented.
  • Entry calls are not implemented.
  • Aside from printing, arithmetic operations on the native VAX floating-point formats are not supported.
  • It is not possible to slice a packed array.
  • The names True and False, when not part of a qualified name, are interpreted as if implicitly prefixed by Standard, regardless of context. Should your program redefine these names in a package or procedure (at best a dubious practice), you will have to use fully qualified names to access their new definitions.

Next: Additions to Ada, Previous: Ada Mode Intro, Up: Ada   [Contents][Index]