WITH REPORT; USE REPORT;
PROCEDURE C45322A IS
TYPE FLOAT5 IS DIGITS 5;
F5 : FLOAT5;
FUNCTION IDENT (F : FLOAT5) RETURN FLOAT5 IS
BEGIN
RETURN F * FLOAT5(IDENT_INT(1));
END IDENT;
FUNCTION EQUAL (F,G : FLOAT5) RETURN BOOLEAN IS
BEGIN
RETURN F = G + FLOAT5(IDENT_INT(0));
END EQUAL;
BEGIN
TEST ("C45322A", "CHECK THAT CONSTRAINT_ERROR " &
"IS RAISED IF MACHINE_OVERFLOWS IS TRUE AND " &
"THE RESULT OF THE ADDITION OR SUBTRACTION " &
"LIES OUTSIDE OF THE RANGE OF THE BASE TYPE");
IF NOT FLOAT5'MACHINE_OVERFLOWS THEN
NOT_APPLICABLE("MACHINE_OVERFLOWS IS FALSE");
ELSE
BEGIN
F5 := IDENT(FLOAT5'BASE'LAST) + FLOAT5'BASE'LAST;
FAILED("NO EXCEPTION RAISED BY LARGE '+'");
IF NOT EQUAL(F5, F5) THEN
COMMENT("DON'T OPTIMIZE F5");
END IF;
EXCEPTION
WHEN CONSTRAINT_ERROR =>
NULL;
WHEN OTHERS =>
FAILED("UNEXPECTED EXCEPTION RAISED BY LARGE '+'");
END;
BEGIN
F5 := IDENT(FLOAT5'BASE'LAST) - FLOAT5'BASE'LAST;
IF NOT EQUAL(F5, F5) THEN
COMMENT("DON'T OPTIMIZE F5");
END IF;
EXCEPTION
WHEN CONSTRAINT_ERROR =>
FAILED("CONSTRAINT_ERROR " &
"RAISED BY INTERCHANGING LARGE '+'");
WHEN OTHERS =>
FAILED("UNEXPECTED EXCEPTION RAISED BY " &
"INTERCHANGING LARGE '+'");
END;
BEGIN
F5 := IDENT(FLOAT5'BASE'FIRST) + FLOAT5'BASE'FIRST;
FAILED("NO EXCEPTION RAISED BY SMALL '+'");
IF NOT EQUAL(F5, F5) THEN
COMMENT("DON'T OPTIMIZE F5");
END IF;
EXCEPTION
WHEN CONSTRAINT_ERROR =>
NULL;
WHEN OTHERS =>
FAILED("UNEXPECTED EXCEPTION RAISED BY SMALL '+'");
END;
BEGIN
F5 := IDENT(FLOAT5'BASE'FIRST) - FLOAT5'BASE'FIRST;
IF NOT EQUAL(F5, F5) THEN
COMMENT("DON'T OPTIMIZE F5");
END IF;
EXCEPTION
WHEN CONSTRAINT_ERROR =>
FAILED("CONSTRAINT_ERROR " &
"RAISED BY INTERCHANGING SMALL '+'");
WHEN OTHERS =>
FAILED("UNEXPECTED EXCEPTION RAISED BY " &
"INTERCHANGING SMALL '+'");
END;
BEGIN
F5 := IDENT(FLOAT5'BASE'LAST) - FLOAT5'BASE'FIRST;
FAILED("NO EXCEPTION RAISED BY LARGE '-'");
IF NOT EQUAL(F5, F5) THEN
COMMENT("DON'T OPTIMIZE F5");
END IF;
EXCEPTION
WHEN CONSTRAINT_ERROR =>
NULL;
WHEN OTHERS =>
FAILED("UNEXPECTED EXCEPTION RAISED BY LARGE '-'");
END;
BEGIN
F5 := IDENT(FLOAT5'BASE'LAST) + FLOAT5'BASE'FIRST;
IF NOT EQUAL(F5, F5) THEN
COMMENT("DON'T OPTIMIZE F5");
END IF;
EXCEPTION
WHEN CONSTRAINT_ERROR =>
FAILED("CONSTRAINT_ERROR " &
"RAISED BY INTERCHANGING LARGE '-'");
WHEN OTHERS =>
FAILED("UNEXPECTED EXCEPTION RAISED BY " &
"INTERCHANGING LARGE '-'");
END;
BEGIN
F5 := IDENT(FLOAT5'BASE'FIRST) - FLOAT5'BASE'LAST;
FAILED("NO EXCEPTION RAISED BY SMALL '-'");
IF NOT EQUAL(F5, F5) THEN
COMMENT("DON'T OPTIMIZE F5");
END IF;
EXCEPTION
WHEN CONSTRAINT_ERROR =>
NULL;
WHEN OTHERS =>
FAILED("UNEXPECTED EXCEPTION RAISED BY SMALL '-'");
END;
BEGIN
F5 := IDENT(FLOAT5'BASE'FIRST) + FLOAT5'BASE'LAST;
IF NOT EQUAL(F5, F5) THEN
COMMENT("DON'T OPTIMIZE F5");
END IF;
EXCEPTION
WHEN CONSTRAINT_ERROR =>
FAILED("CONSTRAINT_ERROR " &
"RAISED BY INTERCHANGING SMALL '-'");
WHEN OTHERS =>
FAILED("UNEXPECTED EXCEPTION RAISED BY " &
"INTERCHANGING SMALL '-'");
END;
END IF;
RESULT;
END C45322A;