summaryrefslogtreecommitdiff
path: root/gcc/testsuite/ada/acats/tests/c3/c37208a.ada
blob: a83b7ef19fb14ef666b47c8e9daa2b11d8742bb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
-- C37208A.ADA     (RA #534/1)

--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, 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.
--*
-- FOR A TYPE WITH DEFAULT DISCRIMINANT VALUES, CHECK THAT A
-- DISCRIMINANT CONSTRAINT CAN BE OMITTED IN:
 
     -- AN OBJECT DECLARATION, AND HENCE ASSIGNMENTS TO THE OBJECT CAN 
     -- CHANGE ITS DISCRIMINANTS;
 
     -- A COMPONENT_DECLARATION IN A RECORD TYPE DEFINITION, AND HENCE
     -- ASSIGNMENTS TO THE COMPONENT CAN CHANGE THE VALUE OF ITS
     -- DISCRIMINANTS;
 
     -- A SUBTYPE INDICATION IN AN ARRAY TYPE DEFINITION, AND HENCE
     -- ASSIGNMENTS TO ONE OF THE COMPONENTS CAN CHANGE ITS 
     -- DISCRIMINANT VALUES;
 
     -- A FORMAL PARAMETER OF A SUBPROGRAM; EXCEPT FOR PARAMETERS OF
     -- MODE IN, THE 'CONSTRAINED ATTRIBUTE OF THE ACTUAL PARAMETER
     -- BECOMES THE 'CONSTRAINED ATTRIBUTE OF THE FORMAL PARAMETER;
     -- FOR IN OUT AND OUT PARAMETERS, IF THE 'CONSTRAINED ATTRIBUTE IS 
     -- FALSE, ASSIGNMENTS TO THE FORMAL PARAMETER CAN CHANGE THE 
     -- DISCRIMINANTS OF THE ACTUAL PARAMETER; IF THE 'CONSTRAINED 
     -- ATTRIBUTE IS TRUE, ASSIGNNMENTS THAT ATTEMPT TO CHANGE THE 
     -- DISCRIMINANTS OF THE ACTUAL PARAMETER RAISE CONSTRAINT_ERROR.
 
-- ASL 7/23/81
-- EDS 7/16/98    AVOID OPTIMIZATION
 
WITH REPORT;
PROCEDURE C37208A IS
 
     USE REPORT;
 
BEGIN
     TEST ("C37208A","DISCRIMINANT CONSTRAINT CAN BE OMITTED " &
           "FROM OBJECT DECLARATION, COMPONENT DECLARATION, SUBTYPE " &
           "INDICATION OR FORMAL SUBPROGRAM PARAMETER, IF THE TYPE " &
           "HAS DEFAULT DISCRIMINANTS");
 
     DECLARE
          TYPE REC1(DISC : INTEGER := 7) IS
               RECORD
                    NULL;
               END RECORD;
 
          TYPE REC2 IS
               RECORD
                    COMP : REC1;
               END RECORD;
 
          R : REC2;
          U1,U2,U3 : REC1 := (DISC => 3);
          C1,C2,C3 : REC1(3) := (DISC => 3);
          ARR : ARRAY(INTEGER RANGE 1..10) OF REC1;
          ARR2 : ARRAY (1..10) OF REC1(4);
 
          PROCEDURE PROC(P_IN : IN REC1;
                         P_OUT : OUT REC1;
                         P_IN_OUT : IN OUT REC1;
                         CONSTR : IN BOOLEAN) IS
          BEGIN
               IF P_OUT'CONSTRAINED /= CONSTR
                    OR P_IN_OUT'CONSTRAINED /= CONSTR THEN
                    FAILED ("CONSTRAINED ATTRIBUTES DO NOT MATCH " &
                              "FOR ACTUAL AND FORMAL PARAMETERS");
               END IF;

               IF P_IN'CONSTRAINED /= IDENT_BOOL(TRUE) THEN
                    FAILED ("'CONSTRAINED IS FALSE FOR IN " &
                            "PARAMETER");
               END IF;
 
               IF NOT CONSTR THEN     -- UNCONSTRAINED ACTUAL PARAM
                    P_OUT := (DISC => IDENT_INT(0));
                    P_IN_OUT := (DISC => IDENT_INT(0));
               ELSE
                    BEGIN
                         P_OUT := (DISC => IDENT_INT(0));
                         FAILED ("DISCRIMINANT OF CONSTRAINED ACTUAL " &
                                 "PARAMETER ILLEGALLY CHANGED - 1");
                    EXCEPTION
                         WHEN CONSTRAINT_ERROR =>
                              NULL;
                         WHEN OTHERS =>
                              FAILED ("WRONG EXCEPTION - 1");
                    END;

                    BEGIN
                         P_IN_OUT := (DISC => IDENT_INT(0));
                         FAILED ("DISCRIMINANT OF CONSTRAINED ACTUAL " &
                                 "PARAMETER ILLEGALLY CHANGED - 2");
                    EXCEPTION
                         WHEN CONSTRAINT_ERROR => NULL;
                         WHEN OTHERS =>
                              FAILED ("WRONG EXCEPTION - 2");
                    END;
               END IF;
          END PROC;
     BEGIN
          IF U1.DISC /= IDENT_INT(3) THEN
               FAILED ("INITIAL DISCRIMINANT VALUE WRONG - U1");
          END IF;

          U1 := (DISC => IDENT_INT(5));
          IF U1.DISC /= 5 THEN
               FAILED ("ASSIGNMENT FAILED FOR OBJECT");
          END IF;
 
          IF R.COMP.DISC /= IDENT_INT(7) THEN
               FAILED ("DEFAULT DISCRIMINANT VALUE WRONG - R");
          END IF;

          R.COMP := (DISC => IDENT_INT(5));
          IF R.COMP.DISC /= 5 THEN
               FAILED ("ASSIGNMENT FAILED FOR RECORD COMPONENT");
          END IF;
 
          FOR I IN 1..10 LOOP
               IF ARR(I).DISC /= IDENT_INT(7) THEN
                    FAILED ("DEFAULT DISCRIMINANT VALUE WRONG - ARR");
               END IF;
          END LOOP;

          ARR(3) := (DISC => IDENT_INT(5));
          IF ARR(3).DISC /= 5 THEN
               FAILED ("ASSIGNMENT FAILED FOR ARRAY COMPONENT");
          END IF;
 
          IF ARR /= (1..2|4..10 => (DISC => 7), 3 => (DISC => 5)) THEN
               FAILED ("MODIFIED WRONG COMPONENTS");
          END IF;

          PROC(C1,C2,C3,IDENT_BOOL(TRUE));
          PROC(U1,U2,U3,IDENT_BOOL(FALSE));
          IF U2.DISC /= 0 OR U3.DISC /= 0 THEN
               FAILED ("ASSIGNMENT TO UNCONSTRAINED ACTUAL PARAMETER " &
                       "FAILED TO CHANGE DISCRIMINANT");
          END IF;

          PROC(ARR(1), ARR(3), ARR(4), FALSE);
          IF ARR(3).DISC /= 0 OR ARR(4).DISC /= 0 THEN
               FAILED ("ARRAY COMPONENT ASSIGNMENTS DIDN'T CHANGE " &
                       "DISCRIMINANT OF COMPONENT");
          END IF;

          PROC (ARR2(2), ARR2(5), ARR2(10), TRUE);
     END;
 
     RESULT;
END C37208A;