Parameterübergabe bei generischen Ausprägungen

Gegeben waren folgende Deklarationen:

Ein Compiler weist die Deklaration des Pakets Illegal zurück mit Hinweis auf RM_95 12.5.4(3), ein anderer akzeptiert sie.

RM_95 12.5.4(3) verlangt, dass die bezeichneten Subtypen des aktuellen und des formalen Zugriffstyps statisch zueinander passen müssen.

Tucker Taft <stt@averstar.com; http://www.averstar.com/~stt/> schrieb zu diesem Problem am 23. März 1999 in der Team-Ada-Mailing-Liste <TEAM-ADA@ACM.ORG>:

Die Ausprägung muss zurückgewiesen werden. Der bezeichnete Subtyp wird bei der Deklaration eines Zugriffstyps bestimmt; er ist derselbe für alle Untertypen des Zugriffstyps, auch wenn die Zugriffsuntertypen dem bezeichneten Subtyp Einschränkungen auferlegen. Daher passen sie nicht statisch, weil der bezeichnete Subtyp des aktuellen Parameters unbeschränkt ist, der des formalen jedoch beschränkt.
RM 3.10(10) definiert den bezeichneten Subtyp, und der ist vollständig definiert durch die Subtyp_Angabe in der Zugriffstypdefinition. Einschränkungen auf den Zugriffstyp ändern diese Definition nicht.

Es ist zwar etwas verwirrend, aber tatsächlich ist Invariant beschränkt, während Invariant_Zeiger unbeschränkt ist. Die Lösung sieht somit folgendermaßen aus:

Der Grund für diese scheinbar absonderliche Regelung liegt darin, wie beschränkte und unbeschränkte Objekte und Zugriffswerte darauf abgespeichert werden. Für unbeschränkte Objekte muss Platz für die Diskriminante oder das Etikett (engl. Tag) reserviert werden, für beschränkte dagegen nicht. Somit zeigt ein Zugriffswert "daneben" in der illegalen Ausprägung.


Ada Magica
Inhaltsverzeichnis