Version 1.2 of ai05s/ai05-0063-1.txt
!standard 3.7(10/2) 08-02-01 AI05-0063-1/02
!class binding interpretation 07-09-06
!status work item 07-09-06
!status received 07-09-06
!priority Low
!difficulty Easy
!qualifier Error
!subject Access discriminants on derived formal types
!summary
Formal non-tagged limited types are not inherently limited.
A type derived from such a formal type in a generic unit cannot have access
discriminants with defaults.
!question
ACATS 3.0 test B370001 has the following example (note that this test is a
revision of an Ada 95 ACATS test):
generic
type FP (DD: access Disc) is limited private;
package GenLP is
type DFP (D: access Disc := A_Disc) is new FP(D); --
end GenLP;
package Instance_Tsk is new GenLP (Tsk); --
package Instance_PT is new GenLP (PT); --
package Instance_LimRec is new GenLP (LimRec); --
package Instance_NonLimRec is new GenLP (NonLimRec); --
The test writer thought that this derived type would be legal here and
rechecked in the instance.
However, the actual wording of the rule 3.7(10/2) allows default expressions only
on descendants of task, protected, or explicitly limited record types. FP is
none of these things (an explicitly limited record type needs to be declared
by a record_type_definition).
What is the intent here?
!recommendation
The declaration of a type derived from an untagged limited formal type
cannot have defaulted discriminants.
!wording
[No wording is needed here; AI05-0059-1 includes the needed wording change to
make 3.7(10/2) depend on the definition of "inherently limited".]
AARM note after definition of "inherently limited" after 7.5 (6):
A limited formal type is not inherently limited if it is not explicitly tagged.
!discussion
The current rule works well for generic bodies, where it easily provides
an assume-the-worst rule. But this case seems to need an assume-the-best rule
for generic specifications. Otherwise, it would not be possible to give a
default for an access discriminant given in a generic specification.
[Editor's note: One has to wonder whether this is important enough to bother
with fixing. A default is mainly useful to allow changing of the discriminant (in
a mutable type), and that is of course not possible for limited types anyway.
Surely the easiest fix is to confirm the wording -- thus I didn't propose a
wording fix here.
OTOH, it seems like a bit of wart. It is unusual that we assume-the-worst everywhere
in a generic and provide no way to do this rather than allowing movement to the
specification.]
*****************************
If default discriminants are needed, it is always possible to make the formal
explicitly tagged, or to use a derived type whose ancestor is inherently limited
so this is a very mild restriction that is simpler to describe that the
"legal in spec/assume the worst in body" formulation..
[Editor's note: If the formal is explicitly tagged, then defaults are not allowed
by 3.7(9.1/2) -- tagged types can never have discriminant defaults. This is only
talking about untagged types.]
*****************************
--!corrigendum 7.4(6/2)
!ACATS Test
Replace this case in the ACATS B-Test B370001.
!appendix
****************************************************************
Questions? Ask the ACAA Technical Agent