Attribute Object_Size (GNAT Reference Manual)

### 4.45 Attribute Object_Size ¶

The size of an object is not necessarily the same as the size of the type of an object. This is because by default object sizes are increased to be a multiple of the alignment of the object. For example, `Natural'Size` is 31, but by default objects of type `Natural` will have a size of 32 bits. Similarly, a record containing an integer and a character:

    type Rec is record
       I : Integer;
       C : Character;
    end record;

will have a size of 40 (that is `Rec'Size` will be 40). The alignment will be 4, because of the integer field, and so the default size of record objects for this type will be 64 (8 bytes).

If the alignment of the above record is specified to be 1, then the object size will be 40 (5 bytes). This is true by default, and also an object size of 40 can be explicitly specified in this case.

A consequence of this capability is that different object sizes can be given to subtypes that would otherwise be considered in Ada to be statically matching. But it makes no sense to consider such subtypes as statically matching. Consequently, GNAT adds a rule to the static matching rules that requires object sizes to match. Consider this example:

     1. procedure BadAVConvert is
     2.    type R is new Integer;
     3.    subtype R1 is R range 1 .. 10;
     4.    subtype R2 is R range 1 .. 10;
     5.    for R1'Object_Size use 8;
     6.    for R2'Object_Size use 16;
     7.    type R1P is access all R1;
     8.    type R2P is access all R2;
     9.    R1PV : R1P := new R1'(4);
    10.    R2PV : R2P;
    11. begin
    12.    R2PV := R2P (R1PV);
                   |
           >>> target designated subtype not compatible with
               type "R1" defined at line 3

    13. end;

In the absence of lines 5 and 6, types `R1` and `R2` statically match and hence the conversion on line 12 is legal. But since lines 5 and 6 cause the object sizes to differ, GNAT considers that types `R1` and `R2` are not statically matching, and line 12 generates the diagnostic shown above.

Similar additional checks are performed in other contexts requiring statically matching subtypes.