WITH REPORT;
PROCEDURE C36304A IS
USE REPORT;
I3 : INTEGER := IDENT_INT (3);
S3 : CONSTANT STRING := "ABC";
S0 : CONSTANT STRING := "";
S1 : CONSTANT STRING := "A";
S2 : CONSTANT STRING := "AB";
S5 : CONSTANT STRING := "ABCDE";
S3A : CONSTANT STRING (I3 .. I3 + 2) := S3(I3 - 2 .. I3);
S3C : CONSTANT STRING := S3A;
S3D : CONSTANT STRING := S3C & "";
S3E : CONSTANT STRING := S3D;
X3 : CONSTANT STRING := (I3 .. 5 => 'X');
Y3 : CONSTANT STRING := X3;
Z0 : CONSTANT STRING := (-3..-5 => 'A');
PROCEDURE C (S : STRING;
FIRST, LAST, LENGTH : INTEGER;
ID : STRING) IS
BEGIN
IF S'FIRST /= FIRST THEN
FAILED ("'FIRST IS " & INTEGER'IMAGE(S'FIRST) &
" INSTEAD OF " & INTEGER'IMAGE(FIRST) &
" FOR " & ID);
END IF;
IF S'LAST /= LAST THEN
FAILED ("'LAST IS " & INTEGER'IMAGE(S'LAST) &
" INSTEAD OF " & INTEGER'IMAGE(LAST) &
" FOR " & ID);
END IF;
IF S'LENGTH /= LENGTH THEN
FAILED ("'LENGTH IS " & INTEGER'IMAGE(S'LENGTH) &
" INSTEAD OF " & INTEGER'IMAGE(LENGTH) &
" FOR " & ID);
END IF;
END C;
BEGIN
TEST ("C36304A", "CHECK UNUSUAL CONSTANT STRING BOUNDS");
C(S0, 1, 0, 0, "S0");
C(S1, 1, 1, 1, "S1");
C(S2, 1, 2, 2, "S2");
C(S5, 1, 5, 5, "S5");
C(S3, 1, 3, 3, "S3");
C(S3C, 3, 5, 3, "S3C");
C(S3D, 3, 5, 3, "S3D");
C(S3E, 3, 5, 3, "S3E");
C(X3, 3, 5, 3, "X3");
C(Y3, 3, 5, 3, "Y3");
C(Z0, IDENT_INT(-3), IDENT_INT(-5), IDENT_INT(0), "Z0");
RESULT;
END C36304A;