WITH REPORT; USE REPORT;
WITH SYSTEM; USE SYSTEM;
PROCEDURE CC1222A IS
TYPE NEWFLT IS NEW FLOAT;
BEGIN
TEST ( "CC1222A", "FOR A FORMAL FLOATING POINT TYPE, CHECK " &
"THAT THE BASIC OPERATIONS ARE " &
"IMPLICITLY DECLARED AND ARE THEREFORE " &
"AVAILABLE WITHIN THE GENERIC UNIT" );
DECLARE
GENERIC
TYPE T IS DIGITS <>;
TYPE T1 IS DIGITS <>;
F : T;
F1 : T1;
PROCEDURE P (F2 : T; STR : STRING);
PROCEDURE P (F2 : T; STR : STRING) IS
SUBTYPE ST IS T RANGE -1.0 .. 1.0;
F3, F4 : T;
FUNCTION FUN (X : T) RETURN BOOLEAN IS
BEGIN
RETURN IDENT_BOOL (TRUE);
END FUN;
FUNCTION FUN (X : T1) RETURN BOOLEAN IS
BEGIN
RETURN IDENT_BOOL (FALSE);
END FUN;
BEGIN
F3 := F;
F4 := F2;
F3 := F4;
IF F3 /= F2 THEN
FAILED ( "INCORRECT RESULTS FOR ASSIGNMENT " &
"WITH TYPE - " & STR);
END IF;
IF F IN ST THEN
NULL;
ELSE
FAILED ( "INCORRECT RESULTS FOR ""IN"" WITH " &
"TYPE - " & STR);
END IF;
IF F2 NOT IN ST THEN
NULL;
ELSE
FAILED ( "INCORRECT RESULTS FOR ""NOT IN"" WITH " &
"TYPE - " & STR);
END IF;
IF T'(F) /= F THEN
FAILED ( "INCORRECT RESULTS FOR QUALIFICATION " &
"WITH TYPE - " & STR & " - 1" );
END IF;
IF FUN (T'(1.0)) THEN
NULL;
ELSE
FAILED ( "INCORRECT RESULTS FOR QUALIFICATION " &
"WITH TYPE - " & STR & " - 2" );
END IF;
END P;
PROCEDURE P1 IS NEW P (FLOAT, FLOAT, 0.0, 0.0);
PROCEDURE P2 IS NEW P (NEWFLT, NEWFLT, 0.0, 0.0);
BEGIN
P1 (2.0, "FLOAT");
P2 (2.0, "NEWFLT");
END;
DECLARE
GENERIC
TYPE T IS DIGITS <>;
PROCEDURE P (STR : STRING);
PROCEDURE P (STR : STRING) IS
TYPE FIXED IS DELTA 0.1 RANGE -100.0 .. 100.0;
FI0 : FIXED := 0.0;
FI2 : FIXED := 2.0;
FIN2 : FIXED := -2.0;
I0 : INTEGER := 0;
I2 : INTEGER := 2;
IN2 : INTEGER := -2;
T0 : T := 0.0;
T2 : T := 2.0;
TN2 : T := -2.0;
FUNCTION IDENT (X : T) RETURN T IS
BEGIN
IF EQUAL (3, 3) THEN
RETURN X;
ELSE
RETURN T'FIRST;
END IF;
END IDENT;
BEGIN
IF T0 + 1.0 /= 1.0 THEN
FAILED ( "INCORRECT RESULTS FOR IMPLICIT " &
"CONVERSION WITH TYPE " & STR & " - 1" );
END IF;
IF T2 + 1.0 /= 3.0 THEN
FAILED ( "INCORRECT RESULTS FOR IMPLICIT " &
"CONVERSION WITH TYPE " & STR & " - 2" );
END IF;
IF TN2 + 1.0 /= -1.0 THEN
FAILED ( "INCORRECT RESULTS FOR IMPLICIT " &
"CONVERSION WITH TYPE " & STR & " - 3" );
END IF;
IF T (FI0) /= T0 THEN
FAILED ( "INCORRECT CONVERSION FROM " &
"FIXED VALUE 0.0 WITH TYPE " & STR);
END IF;
IF T (FI2) /= IDENT (T2) THEN
FAILED ( "INCORRECT CONVERSION FROM " &
"FIXED VALUE 2.0 WITH TYPE " & STR);
END IF;
IF T (FIN2) /= TN2 THEN
FAILED ( "INCORRECT CONVERSION FROM " &
"FIXED VALUE -2.0 WITH TYPE " & STR);
END IF;
IF T (I0) /= IDENT (T0) THEN
FAILED ( "INCORRECT CONVERSION FROM " &
"INTEGER VALUE 0 WITH TYPE " & STR);
END IF;
IF T (I2) /= T2 THEN
FAILED ( "INCORRECT CONVERSION FROM " &
"INTEGER VALUE 2 WITH TYPE " & STR);
END IF;
IF T (IN2) /= IDENT (TN2) THEN
FAILED ( "INCORRECT CONVERSION FROM " &
"INTEGER VALUE -2 WITH TYPE " & STR);
END IF;
IF FIXED (T0) /= FI0 THEN
FAILED ( "INCORRECT CONVERSION TO " &
"FIXED VALUE 0.0 WITH TYPE " & STR);
END IF;
IF FIXED (IDENT (T2)) /= FI2 THEN
FAILED ( "INCORRECT CONVERSION TO " &
"FIXED VALUE 2.0 WITH TYPE " & STR);
END IF;
IF FIXED (TN2) /= FIN2 THEN
FAILED ( "INCORRECT CONVERSION TO " &
"FIXED VALUE -2.0 WITH TYPE " & STR);
END IF;
IF INTEGER (IDENT (T0)) /= I0 THEN
FAILED ( "INCORRECT CONVERSION TO " &
"INTEGER VALUE 0 WITH TYPE " & STR);
END IF;
IF INTEGER (T2) /= I2 THEN
FAILED ( "INCORRECT CONVERSION TO " &
"INTEGER VALUE 2 WITH TYPE " & STR);
END IF;
IF INTEGER (IDENT (TN2)) /= IN2 THEN
FAILED ( "INCORRECT CONVERSION TO " &
"INTEGER VALUE -2 WITH TYPE " & STR);
END IF;
END P;
PROCEDURE P1 IS NEW P (FLOAT);
PROCEDURE P2 IS NEW P (NEWFLT);
BEGIN
P1 ( "FLOAT" );
P2 ( "NEWFLT" );
END;
DECLARE
GENERIC
TYPE T IS DIGITS <>;
F, L : T;
D : INTEGER;
PROCEDURE P (STR : STRING);
PROCEDURE P (STR : STRING) IS
F1 : T;
A : ADDRESS := F'ADDRESS;
S : INTEGER := F'SIZE;
I : INTEGER;
I1 : INTEGER := T'MACHINE_RADIX;
I2 : INTEGER := T'MACHINE_MANTISSA;
I3 : INTEGER := T'MACHINE_EMAX;
I4 : INTEGER := T'MACHINE_EMIN;
B1 : BOOLEAN := T'MACHINE_ROUNDS;
B2 : BOOLEAN := T'MACHINE_OVERFLOWS;
BEGIN
IF T'DIGITS /= D THEN
FAILED ( "INCORRECT VALUE FOR " &
STR & "'DIGITS" );
END IF;
IF T'FIRST /= F THEN
FAILED ( "INCORRECT VALUE FOR " &
STR & "'FIRST" );
END IF;
IF T'LAST /= L THEN
FAILED ( "INCORRECT VALUE FOR " &
STR & "'LAST" );
END IF;
END P;
PROCEDURE P1 IS
NEW P (FLOAT, FLOAT'FIRST, FLOAT'LAST, FLOAT'DIGITS);
PROCEDURE P2 IS
NEW P (NEWFLT, NEWFLT'FIRST, NEWFLT'LAST,
NEWFLT'DIGITS);
BEGIN
P1 ( "FLOAT" );
P2 ( "NEWFLT" );
END;
RESULT;
END CC1222A;