Version 1.6 of ais/ai-00025.txt
!standard 12.05.04 (04) 00-07-12 AI95-00025/05
!class confirmation 95-06-25
!status Response 2000 00-01-25
!status WG9 approved 96-12-07
!status ARG Approved 9-0-1 96-10-07
!status work item 95-06-25
!status received 95-06-25
!priority Low
!difficulty Medium
!qualifier Clarification
!subject Matching rules for generic formal access-to-constant types
!summary
An access-to-variable type cannot be passed as an actual to a generic
formal access-to-constant type.
!question
12.5.4(4) states that "If and only if the general_access_modifier
constant applies to the formal, the actual shall be an access-to-constant
type". Is it really intended to forbid an access-to-variable
type from being passed as an actual to a generic formal
access-to-constant type? (Yes.)
!response
Consider the following example:
type Actual is access all Integer;
X: aliased constant Integer;
generic
type Formal is access constant Integer;
package Gp is
function F return Formal;
end Gp;
package body Gp is
function F return Formal is
begin
return X'access;
end F;
end Gp;
package Ip is new Gp (Formal => Actual); --
If the above were legal, then Ip.F would produce an access-to-variable
value designating a constant, thus allowing a constant to be modified.
This would be very bad. Hence, the "if and only if" wording of
12.5.4(4).
!ACATS test
ACATS test BC54001 tests the rules of 12.5.4(40, including this case.
!appendix
!section 12.5.4(4)
!subject Matching rules for generic formal access-to-constant types
!reference RM95-12.5.4(4);5.95
!from Pascal Leroy
!reference as: 95-5085.a Pascal Leroy 95-1-25>>
!discussion
RM95-12.5.4(4) states that "If and only if the general_access_modifier
constant applies to the formal, the actual shall be an access-to constant
type".
This wording (actually, the "if" part) seems to forbid the following text. Is
this the intent? I do not understand why this would cause contract model
problems, or violate the properties of the type. If there is a hidden reason,
it should be stated in the AARM.
type Actual is access all Integer;
generic
type Formal is access constant Integer;
package Gp is
end Gp;
package Ip is new Gp (Formal => Actual);
_____________________________________________________________________
Pascal Leroy +33.1.30.12.09.68
pleroy@rational.com +33.1.30.12.09.66 FAX
****************************************************************
Questions? Ask the ACAA Technical Agent