-- CC51A01.A -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and -- F08630-91-C-0015, the U.S. Government obtained unlimited rights in the -- software and documentation contained herein. Unlimited rights are -- defined in DFAR 252.227-7013(a)(19). By making this public release, -- the Government intends to confer upon all recipients unlimited rights -- equal to those held by the Government. These rights include rights to -- use, duplicate, release or disclose the released technical data and -- computer software in whole or in part, in any manner and for any purpose -- whatsoever, and to have or permit others to do so. -- -- DISCLAIMER -- -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A -- PARTICULAR PURPOSE OF SAID MATERIAL. --* -- -- OBJECTIVE: -- Check that, in an instance, each implicit declaration of a user-defined -- subprogram of a formal derived record type declares a view of the -- corresponding primitive subprogram of the ancestor, even if the -- primitive subprogram has been overridden for the actual type. -- -- TEST DESCRIPTION: -- Declare a "fraction" type abstraction in a package (foundation code). -- Declare a "fraction" I/O routine in a generic package with a formal -- derived type whose ancestor type is the fraction type declared in -- the first package. Within the I/O routine, call other operations of -- ancestor type. Derive from the root fraction type in another package -- and override one of the operations called in the generic I/O routine. -- Derive from the derivative of the root fraction type. Instantiate -- the generic package for each of the three types and call the I/O -- routine. -- -- TEST FILES: -- The following files comprise this test: -- -- FC51A00.A -- CC51A01.A -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- --! with FC51A00; -- Fraction type abstraction. generic -- Fraction I/O support. type Fraction is new FC51A00.Fraction_Type; -- Formal derived type of a package CC51A01_0 is -- (private) record type. -- Simulate writing a fraction to standard output. In a real application, -- this subprogram might be a procedure which uses Text_IO routines. For -- the purposes of the test, the "output" is returned to the caller as a -- string. function Put (Item : in Fraction) return String; -- ... Other I/O operations for fractions. end CC51A01_0; --==================================================================-- package body CC51A01_0 is function Put (Item : in Fraction) return String is Num : constant String := -- Fraction's primitive subprograms Integer'Image (Numerator (Item)); -- are inherited from its parent Den : constant String := -- (FC51A00.Fraction_Type) and NOT Integer'Image (Denominator (Item)); -- from the actual type. begin return (Num & '/' & Den); end Put; end CC51A01_0; --==================================================================-- with FC51A00; -- Fraction type abstraction. package CC51A01_1 is -- Derive directly from the root type of the class and override one of the -- primitive subprograms. type Pos_Fraction is new FC51A00.Fraction_Type; -- Derived directly from -- root type of class. -- Inherits "/" from root type. -- Inherits "-" from root type. -- Inherits Numerator from root type. -- Inherits Denominator from root type. -- Return absolute value of numerator as integer. function Numerator (Frac : Pos_Fraction) -- Overrides parent's return Integer; -- operation. end CC51A01_1; --==================================================================-- package body CC51A01_1 is -- This body should never be called. -- -- The test sends the function Numerator a fraction with a negative -- numerator, and expects this negative numerator to be returned. This -- version of the function returns the absolute value of the numerator. -- Thus, a call to this version is detectable by examining the sign -- of the return value. function Numerator (Frac : Pos_Fraction) return Integer is Converted_Frac : FC51A00.Fraction_Type := FC51A00.Fraction_Type (Frac); Orig_Numerator : Integer := FC51A00.Numerator (Converted_Frac); begin return abs (Orig_Numerator); end Numerator; end CC51A01_1; --==================================================================-- with FC51A00; -- Fraction type abstraction. with CC51A01_0; -- Fraction I/O support. with CC51A01_1; -- Positive fraction type abstraction. with Report; procedure CC51A01 is type Distance is new CC51A01_1.Pos_Fraction; -- Derived indirectly from -- root type of class. -- Inherits "/" indirectly from root type. -- Inherits "-" indirectly from root type. -- Inherits Numerator directly from parent type. -- Inherits Denominator indirectly from root type. use FC51A00, CC51A01_1; -- All primitive subprograms -- directly visible. package Fraction_IO is new CC51A01_0 (Fraction_Type); package Pos_Fraction_IO is new CC51A01_0 (Pos_Fraction); package Distance_IO is new CC51A01_0 (Distance); -- For each of the instances above, the subprogram "Put" should produce -- the same result. That is, the primitive subprograms called by Put -- should in all cases be those of the type Fraction_Type, which is the -- ancestor type for the formal derived type in the generic unit. In -- particular, for Pos_Fraction_IO and Distance_IO, the versions of -- Numerator called should NOT be those of the actual types, which override -- Fraction_Type's version. TC_Expected_Result : constant String := "-3/ 16"; TC_Root_Type_Of_Class : Fraction_Type := -3/16; TC_Direct_Derivative : Pos_Fraction := -3/16; TC_Indirect_Derivative : Distance := -3/16; begin Report.Test ("CC51A01", "Check that, in an instance, each implicit " & "declaration of a user-defined subprogram of a formal " & "derived record type declares a view of the corresponding " & "primitive subprogram of the ancestor, even if the " & "primitive subprogram has been overridden for the actual " & "type"); if (Fraction_IO.Put (TC_Root_Type_Of_Class) /= TC_Expected_Result) then Report.Failed ("Wrong result for root type"); end if; if (Pos_Fraction_IO.Put (TC_Direct_Derivative) /= TC_Expected_Result) then Report.Failed ("Wrong result for direct derivative"); end if; if (Distance_IO.Put (TC_Indirect_Derivative) /= TC_Expected_Result) then Report.Failed ("Wrong result for INdirect derivative"); end if; Report.Result; end CC51A01;