!standard 03.09.02 (01) 00-01-25 AI95-00183/04 !class confirmation 97-03-19 !status Response 2000 00-01-25 !status WG9 Approved 97-11-14 !status ARG Approved 7-0-0 97-04-11 !status work item 97-03-19 !status received 97-03-19 !priority High !difficulty Medium !qualifier Clarification !subject Primitive operations declared before it is known if the type is tagged !summary Consider a type whose partial view is untagged, but whose full view is tagged. A primitive subprogram declared for the partial view is a dispatching subprogram of the full view. Therefore, if there are two types, T1 and T2, and there is a primitive subprogram of both: procedure Primitive(X: T1; Y: T2); then it is illegal for both T1 and T2 to be tagged, even if the full type declarations occur after Primitive. !question Is a primitive operation of a type which is declared before it is known that the type is tagged a dispatching operation? (Yes.) This question matters because 3.9.2(12) states that "A given subprogram shall not be a dispatching operation of two or more distinct tagged types." Consider the following examples: package P1 is type T1 is private; type T2 is private; procedure P (X1 : T1; X2 : T2); -- violates 3.9.2(12) ? (Yes.) private type T1 is tagged null record; type T2 is tagged null record; end; package P2 is private type T1; type T2; procedure P (X1 : access T1; X2 : access T2); -- violates 3.9.2(12) ? (Yes.) end; package body P2 is type T1 is tagged null record; type T2 is tagged null record; end; !response (See Summary.) !ACATS test B-Test B392010 tests the examples given in the question. !appendix !section 3.9.2(01) !subject Primitive operations declared before it is known if the type is tagged !reference RM95 3.9.2(1) !reference RM95 3.9.2(12) !from Pascal Leroy 97-03-10 !reference 97-15727.d Pascal Leroy 97-3-10>> !discussion Is a primitive operation of a type which is declared before it is known that the type is tagged a dispatching operation? This question matters because RM95 3.9.2(12) states that "A given subprogram shall not be a dispatching operation of two or more distinct tagged types." Consider the following examples: package P1 is type T1 is private; type T2 is private; procedure P (X1 : T1; X2 : T2); -- violates 3.9.2(12) ? private type T1 is tagged null record; type T2 is tagged null record; end; package P2 is private type T1; type T2; procedure P (X1 : access T1; X2 : access T2); -- violates 3.9.2(12) ? end; package body P2 is type T1 is tagged null record; type T2 is tagged null record; end; It seems that the declarations of P1.P and P2.P should be illegal, but that cannot be inferred from the manual. ****************************************************************