Annotated Ada Reference Manual (Ada 202y Draft 1)Legal Information
Contents   Index   References   Search   Previous   Next 

8.5.1 Object Renaming Declarations

1/5
{AI12-0383-1} [An object_renaming_declaration is used to rename an object or value.] 

Syntax

2/5
{AI95-00230-01} {AI95-00423-01} {AI05-0183-1} {AI12-0275-1} object_renaming_declaration ::= 
    defining_identifier [: [null_exclusionsubtype_markrenames object_name
        [aspect_specification];
  | defining_identifier : access_definition renames object_name
        [aspect_specification];

Name Resolution Rules

3/5
{AI95-00230-01} {AI95-00254-01} {AI95-00409-01} {AI12-0275-1} The type of the object_name shall resolve to the type determined by the subtype_mark, if present. If no subtype_mark or access_definition is present, the expected type of the object_name is any type.
3.1/5
 {AI12-0275-1} In the case where the type is defined by an access_definition, the type of the object_name shall resolve to an anonymous access type. If the anonymous access type is an access-to-object type, the type of the object_name shall have the same designated type as that of the access_definition. If the anonymous access type is an access-to-subprogram type, the type of the object_name shall have a designated profile that is type conformant with that of the access_definition.
3.a
Reason: A previous version of Ada 9X used the usual “expected type” wording:
“The expected type for the object_name is that determined by the subtype_mark.”
We changed it so that this would be illegal: 
3.b
X: T;
Y: T'Class renames X; -- Illegal!
3.c
When the above was legal, it was unclear whether Y was of type T or T'Class. Note that we still allow this: 
3.d
Z: T'Class := ...;
W: T renames F(Z);
3.e
where F is a function with a controlling parameter and result. This is admittedly a bit odd.
3.f
Note that the matching rule for generic formal parameters of mode in out was changed to keep it consistent with the rule for renaming. That makes the rule different for in vs. in out.

Legality Rules

4/5
{AI12-0383-1} The renamed entity shall be an object or value.
4.1/5
 {AI95-00231-01} {AI95-00409-01} {AI12-0383-1} In the case where the type is defined by an access_definition, the type of the renamed entity and the type defined by the access_definition:
4.2/2
{AI95-00231-01} {AI95-00409-01} shall both be access-to-object types with statically matching designated subtypes and with both or neither being access-to-constant types; or
4.3/2
{AI95-00409-01} shall both be access-to-subprogram types with subtype conformant designated profiles.
4.4/5
 {AI95-00423-01} {AI12-0287-1} For an object_renaming_declaration with a null_exclusion or an access_definition that has a null_exclusion, the subtype of the object_name shall exclude null. In addition, if the object_renaming_declaration occurs within the body of a generic unit G or within the body of a generic unit declared within the declarative region of generic unit G, then:
4.5/5
{AI12-0287-1} if the object_name statically denotes a generic formal object of mode in out of G, then the declaration of that object shall have a null_exclusion;
4.6/5
{AI12-0287-1} if the object_name statically denotes a call of a generic formal function of G, then the declaration of the result of that function shall have a null_exclusion.
4.a/5
Reason: {AI12-0287-1} {AI12-0005-1} These rules prevent “lying”. Null must never be the value of an object with an explicit null_exclusion. The bullets are assume-the-worst rules that prevent trouble in two obscure cases: 
4.b/2
type Acc_I is access Integer;
subtype Acc_NN_I is not null Acc_I;
Obj : Acc_I := null;
4.c/2
generic
   B : in out Acc_NN_I;
package Gen is
   ...
end Gen;
4.d/2
package body Gen is
   D : not null Acc_I renames B;
end Gen;
4.e/2
package Inst is new Gen (B => Obj);
4.f/5
{AI12-0287-1} Without the first bullet rule, D would be legal, and contain the value null, because the rule about lying is satisfied for generic matching (Obj matches B; B does not explicitly state not null), Legality Rules are not rechecked in the body of any instance, and the template passes the lying rule as well. The second bullet handles a similar case involving formal functions. The rules are so complex because they have to apply to formals used in bodies of child generics as well as in the bodies of generics. 
4.7/5
 {AI12-0401-1} In the case where the object_name is a qualified_expression with a nominal subtype S and whose expression is a name that denotes an object Q
4.8/5
if S is an elementary subtype, then: 
4.9/5
Q shall be a constant other than a dereference of an access type; or
4.10/5
the nominal subtype of Q shall be statically compatible with S; or
4.11/5
S shall statically match the base subtype of its type if scalar, or the first subtype of its type if an access type. 
4.12/5
if S is a composite subtype, then Q shall be known to be constrained or S shall statically match the first subtype of its type. 
4.f.1/5
Ramification: There's no restriction if the expression is a value. 
4.f.2/5
Reason: This check prevents the renamed object from violating its nominal subtype. As the subtype is only checked when the object is renamed, we make it illegal if the actual object is a variable whose value could be changed afterwards to violate the subtype. This is messy as “known to be constrained” is only defined for composite objects, so we have to handle elementary objects and all values separately. 
5/5
{8652/0017} {AI95-00184-01} {AI95-00363-01} {AI05-0008-1} {AI12-0401-1} The renamed entity shall not be a subcomponent that depends on discriminants of an object whose nominal subtype is unconstrained unless the object is known to be constrained. A slice of an array shall not be renamed if this restriction disallows renaming of the array. 
5.1/5
 {AI12-0401-1} In addition to the places where Legality Rules normally apply (see 12.3), these rules also apply in the private part of an instance of a generic unit.
5.a.1/5
Discussion: This applies to all of the Legality Rules in this subclause. Rechecks are needed for most of the rules (but not the first two). 
5.a
Reason: This prevents renaming of subcomponents that might disappear, which might leave dangling references. Similar restrictions exist for the Access attribute.
5.a.1/3
{8652/0017} {AI95-00184-01} {AI05-0008-1} The “recheck on instantiation” requirement on generics is necessary to avoid renaming of components which could disappear even when the nominal subtype would prevent the problem:
5.a.2/1
type T1 (D1 : Boolean) is
   record
      case D1 is
         when False =>
            C1 : Integer;
         when True =>
            null;
         end case;
      end record;
5.a.3/1
generic
   type F is new T1;
   X : in out F;
package G is
   C1_Ren : Integer renames X.C1;
end G;
5.a.4/1
type T2 (D2 : Boolean := False) is new T1 (D1 => D2);

Y : T2;

package I is new G (T2, Y);

Y := (D1 => True); -- Oops!  What happened to I.C1_Ren?
5.a.5/3
{AI05-0008-1} In addition, the “known to be constrained” rules include assume-the-worst rules for generic bodies partially to prevent such problems.
5.b
Implementation Note: Note that if an implementation chooses to deallocate-then-reallocate on assignment_statements assigning to unconstrained definite objects, then it cannot represent renamings and access values as simple addresses, because the above rule does not apply to all components of such an object. 
5.c
Ramification: If it is a generic formal object, then the assume-the-best or assume-the-worst rules are applied as appropriate. 

Static Semantics

6/5
{AI95-00230-01} {AI95-00409-01} {AI12-0383-1} An object_renaming_declaration declares a new view [of the renamed entity] whose properties are identical to those of the renamed view. [Thus, the properties of the renamed entity are not affected by the renaming_declaration. In particular, its nominal subtype, whether it is a value or an object, its value if it is an object, and whether or not it is a constant, are unaffected; similarly, the constraints and other properties of its nominal subtype are not affected by renaming (any constraint implied by the subtype_mark or access_definition of the object_renaming_declaration is ignored).] 
6.a
Discussion: Because the constraints are ignored, it is a good idea to use the nominal subtype of the renamed object when writing an object_renaming_declaration.
6.b/2
{AI95-00409-01} If no null_exclusion is given in the renaming, the object may or may not exclude null. This is similar to the way that constraints need not match, and constant is not specified. The renaming defines a view of the renamed entity, inheriting the original properties. 

Examples

7
Example of renaming an object: 
8
declare
   L : Person renames Leftmost_Person; -- see 3.10.1
begin
   L.Age := L.Age + 1;
end;
9/5
{AI12-0383-1} Example of renaming a value:
10/5
{AI12-0383-1} Uno renames One;  -- see 3.3.2

Wording Changes from Ada 83

10.a
The phrase “subtype ... as defined in a corresponding object declaration, component declaration, or component subtype indication”, from RM83-8.5(5), is incorrect in Ada 95; therefore we removed it. It is incorrect in the case of an object with an indefinite unconstrained nominal subtype. 

Incompatibilities With Ada 95

10.b/2
{AI95-00363-01} Aliased variables are not necessarily constrained in Ada 2005 (see 3.6). Therefore, a subcomponent of an aliased variable may disappear or change shape, and renaming such a subcomponent thus is illegal, while the same operation would have been legal in Ada 95. Note that most allocated objects are still constrained by their initial value (see 4.8), and thus have no change in the legality of renaming for them. For example, using the type T2 of the previous example: 
10.c/2
   AT2 : aliased T2;
   C1_Ren : Integer renames AT2.C1; -- Illegal in Ada 2005, legal in Ada 95
   AT2 := (D1 => True);             -- Raised Constraint_Error in Ada 95,
                                    -- but does not in Ada 2005, so C1_Ren becomes
                                    -- invalid when this is assigned.

Extensions to Ada 95

10.d/2
{AI95-00230-01} {AI95-00231-01} {AI95-00254-01} {AI95-00409-01} A renaming can have an anonymous access type. In that case, the accessibility of the renaming is that of the original object (accessibility is not lost as it is for assignment to a component or stand-alone object).
10.e/2
{AI95-00231-01} {AI95-00423-01} A renaming can have a null_exclusion; if so, the renamed object must also exclude null, so that the null_exclusion does not lie. On the other hand, if the renaming does not have a null_exclusion. it excludes null if the renamed object does. 

Wording Changes from Ada 95

10.f/2
{8652/0017} {AI95-00184-01} Corrigendum: Fixed to forbid renamings of depends-on-discriminant components if the type might be definite. 

Incompatibilities With Ada 2005

10.g/3
{AI05-0008-1} Correction: Simplified the description of when a discriminant-dependent component is allowed to be renamed — it's now simply when the object is known to be constrained. This fixes a confusion as to whether a subcomponent of an object that is not certain to be constrained can be renamed. The fix introduces an incompatibility, as the rule did not apply in Ada 95 if the prefix was a constant; but it now applies no matter what kind of object is involved. The incompatibility is not too bad, since most kinds of constants are known to be constrained.

Extensions to Ada 2005

10.h/3
{AI05-0183-1} An optional aspect_specification can be used in an object_renaming_declaration. This is described in 13.1.1

Incompatibilities With Ada 2012

10.i/5
{AI12-0287-1} Correction: The Legality Rules for renames with null exclusions no longer applies to generic formal objects of mode in, but does apply to renames of generic formal functions. This means a few unlikely programs are now illegal that were previously allowed by original Ada 2012, while more programs that were previously llegal will be allowed.
10.j/5
{AI12-0401-1} Correction: Added a rule to ensure that a renaming of a qualified_expression of a variable is allowed only if the variable will always remain within the nominal subtype of the qualified_expression. This was not required in Ada 2012. Renamings that are now illegal are at risk of causing erroneous execution if the variable value is changed to a bad value; this is consistent with other rules preventing renamings from changing to violate their known properties. 

Extensions to Ada 2012

10.k/5
{AI12-0275-1} The subtype_mark in an object renaming is now optional, as the subtype information it provides is not trustworthy anyway (that comes from the renamed object and there is no requirement that it is the same as that of the object).
10.l/5
{AI12-0383-1} An object renaming can now rename values, such as named numbers. The renamed entity still has to be a name, but an arbitrary expression can be renamed by qualifying it. 

Contents   Index   References   Search   Previous   Next 
Ada-Europe Ada 2005 and 2012 Editions sponsored in part by Ada-Europe