Stand-alone objects (GNAT Reference Manual) (original) (raw)


17.3.4.1 Stand-alone objects

Var : access T := ... Var_To_Cst : access constant T := ... Cst : constant access T := ... Cst_To_Cst : constant access constant T := ...

In this section, we will refer to a stand-alone object of an anonymous access type as an SO.

When the restriction is in effect, the “statically deeper” relationship (see RM 3.10.2(4)) does apply to the type of a SO (contrary to RM 3.10.2(19.2)) and, for the purposes of compile-time checks, the accessibility level of the type of a SO is the accessibility level of that SO. This supports many common use-cases without the employment of Unchecked_Accesswhile still removing the need for dynamic checks.

This statically disallows cases that would otherwise require a dynamic accessibility check, such as

type Ref is access all Integer; Ptr : Ref; Good : aliased Integer;

procedure Proc is Bad : aliased Integer; Stand_Alone : access Integer; begin if then Stand_Alone := Good'Access; else Stand_Alone := Bad'Access; end if; Ptr := Ref (Stand_Alone); end Proc;

If a No_Dynamic_Accessibility_Checks restriction is in effect, then the otherwise-legal type conversion (the right-hand side of the assignment to Ptr) becomes a violation of the RM 4.6 rule “The accessibility level of the operand type shall not be statically deeper than that of the target type …”.