1 /* Test qualification of components of qualified structures or unions:
2 should have qualifiers from both the component and the structure or
3 union. Bug 27697 from Frank Victor Fischer. */
4 /* Origin: Joseph Myers <joseph@codesourcery.com> */
5 /* { dg-do compile } */
6 /* { dg-options "" } */
7
8 struct s {
9 int a;
10 int b[1];
11 int c[2][3];
12 const int d;
13 const int e[1];
14 const int f[2][3];
15 };
16
17 union u {
18 int a;
19 int b[1];
20 int c[2][3];
21 const int d;
22 const int e[1];
23 const int f[2][3];
24 };
25
26 struct cs {
27 const struct s x;
28 };
29
30 struct s v1;
31 union u *v2;
32 const struct s *v3;
33 const union u v4;
34 struct cs v5;
35
36 void
f(void)37 f (void)
38 {
39 v1.a = 0;
40 v1.b[0] = 0;
41 *v1.b = 0;
42 v1.c[0][0] = 0;
43 *v1.c[0] = 0;
44 **v1.c = 0;
45 v1.d = 0; /* { dg-error "assignment of read-only" } */
46 v1.e[0] = 0; /* { dg-error "assignment of read-only" } */
47 *v1.e = 0; /* { dg-error "assignment of read-only" } */
48 v1.f[0][0] = 0; /* { dg-error "assignment of read-only" } */
49 *v1.f[0] = 0; /* { dg-error "assignment of read-only" } */
50 **v1.f = 0; /* { dg-error "assignment of read-only" } */
51
52 v2->a = 0;
53 v2->b[0] = 0;
54 *v2->b = 0;
55 v2->c[0][0] = 0;
56 *v2->c[0] = 0;
57 **v2->c = 0;
58 v2->d = 0; /* { dg-error "assignment of read-only" } */
59 v2->e[0] = 0; /* { dg-error "assignment of read-only" } */
60 *v2->e = 0; /* { dg-error "assignment of read-only" } */
61 v2->f[0][0] = 0; /* { dg-error "assignment of read-only" } */
62 *v2->f[0] = 0; /* { dg-error "assignment of read-only" } */
63 **v2->f = 0; /* { dg-error "assignment of read-only" } */
64
65 v3->a = 0; /* { dg-error "assignment of member" } */
66 v3->b[0] = 0; /* { dg-error "assignment of read-only" } */
67 *v3->b = 0; /* { dg-error "assignment of read-only" } */
68 v3->c[0][0] = 0; /* { dg-error "assignment of read-only" } */
69 *v3->c[0] = 0; /* { dg-error "assignment of read-only" } */
70 **v3->c = 0; /* { dg-error "assignment of read-only" } */
71 v3->d = 0; /* { dg-error "assignment of member" } */
72 v3->e[0] = 0; /* { dg-error "assignment of read-only" } */
73 *v3->e = 0; /* { dg-error "assignment of read-only" } */
74 v3->f[0][0] = 0; /* { dg-error "assignment of read-only" } */
75 *v3->f[0] = 0; /* { dg-error "assignment of read-only" } */
76 **v3->f = 0; /* { dg-error "assignment of read-only" } */
77
78 v4.a = 0; /* { dg-error "assignment of member" } */
79 v4.b[0] = 0; /* { dg-error "assignment of read-only" } */
80 *v4.b = 0; /* { dg-error "assignment of read-only" } */
81 v4.c[0][0] = 0; /* { dg-error "assignment of read-only" } */
82 *v4.c[0] = 0; /* { dg-error "assignment of read-only" } */
83 **v4.c = 0; /* { dg-error "assignment of read-only" } */
84 v4.d = 0; /* { dg-error "assignment of member" } */
85 v4.e[0] = 0; /* { dg-error "assignment of read-only" } */
86 *v4.e = 0; /* { dg-error "assignment of read-only" } */
87 v4.f[0][0] = 0; /* { dg-error "assignment of read-only" } */
88 *v4.f[0] = 0; /* { dg-error "assignment of read-only" } */
89 **v4.f = 0; /* { dg-error "assignment of read-only" } */
90
91 v5.x.a = 0; /* { dg-error "assignment of member" } */
92 v5.x.b[0] = 0; /* { dg-error "assignment of read-only" } */
93 *v5.x.b = 0; /* { dg-error "assignment of read-only" } */
94 v5.x.c[0][0] = 0; /* { dg-error "assignment of read-only" } */
95 *v5.x.c[0] = 0; /* { dg-error "assignment of read-only" } */
96 **v5.x.c = 0; /* { dg-error "assignment of read-only" } */
97 v5.x.d = 0; /* { dg-error "assignment of member" } */
98 v5.x.e[0] = 0; /* { dg-error "assignment of read-only" } */
99 *v5.x.e = 0; /* { dg-error "assignment of read-only" } */
100 v5.x.f[0][0] = 0; /* { dg-error "assignment of read-only" } */
101 *v5.x.f[0] = 0; /* { dg-error "assignment of read-only" } */
102 **v5.x.f = 0; /* { dg-error "assignment of read-only" } */
103 }
104
105 void
g(void)106 g (void)
107 {
108 {
109 int *a = &v1.a;
110 int (*b)[1] = &v1.b;
111 int (*c)[2][3] = &v1.c;
112 int (*cc)[3] = v1.c;
113 const int (*ff)[3] = v1.c; /* { dg-warning "initialization from incompatible pointer type" } */
114 a = &v1.a;
115 b = &v1.b;
116 c = &v1.c;
117 cc = v1.c;
118 ff = v1.c; /* { dg-warning "assignment from incompatible pointer type" } */
119 }
120 {
121 const int *d = &v1.d;
122 const int (*e)[1] = &v1.e;
123 const int (*f)[2][3] = &v1.f;
124 const int (*ff)[3] = v1.f;
125 int (*cc)[3] = v1.f; /* { dg-warning "initialization from incompatible pointer type" } */
126 d = &v1.d;
127 e = &v1.e;
128 f = &v1.f;
129 ff = v1.f;
130 cc = v1.f; /* { dg-warning "assignment from incompatible pointer type" } */
131 }
132
133 {
134 int *a = &v2->a;
135 int (*b)[1] = &v2->b;
136 int (*c)[2][3] = &v2->c;
137 int (*cc)[3] = v2->c;
138 const int (*ff)[3] = v2->c; /* { dg-warning "initialization from incompatible pointer type" } */
139 a = &v2->a;
140 b = &v2->b;
141 c = &v2->c;
142 cc = v2->c;
143 ff = v2->c; /* { dg-warning "assignment from incompatible pointer type" } */
144 }
145 {
146 const int *d = &v2->d;
147 const int (*e)[1] = &v2->e;
148 const int (*f)[2][3] = &v2->f;
149 const int (*ff)[3] = v2->f;
150 int (*cc)[3] = v2->f; /* { dg-warning "initialization from incompatible pointer type" } */
151 d = &v2->d;
152 e = &v2->e;
153 f = &v2->f;
154 ff = v2->f;
155 cc = v2->f; /* { dg-warning "assignment from incompatible pointer type" } */
156 }
157
158 {
159 const int *d = &v3->a;
160 const int (*e)[1] = &v3->b;
161 const int (*f)[2][3] = &v3->c;
162 const int (*ff)[3] = v3->c;
163 int (*cc)[3] = v3->c; /* { dg-warning "initialization from incompatible pointer type" } */
164 d = &v3->a;
165 e = &v3->b;
166 f = &v3->c;
167 ff = v3->c;
168 cc = v3->c; /* { dg-warning "assignment from incompatible pointer type" } */
169 }
170 {
171 const int *d = &v3->d;
172 const int (*e)[1] = &v3->e;
173 const int (*f)[2][3] = &v3->f;
174 const int (*ff)[3] = v3->f;
175 int (*cc)[3] = v3->f; /* { dg-warning "initialization from incompatible pointer type" } */
176 d = &v3->d;
177 e = &v3->e;
178 f = &v3->f;
179 ff = v3->f;
180 cc = v3->f; /* { dg-warning "assignment from incompatible pointer type" } */
181 }
182
183 {
184 const int *d = &v4.a;
185 const int (*e)[1] = &v4.b;
186 const int (*f)[2][3] = &v4.c;
187 const int (*ff)[3] = v4.c;
188 int (*cc)[3] = v4.c; /* { dg-warning "initialization from incompatible pointer type" } */
189 d = &v4.a;
190 e = &v4.b;
191 f = &v4.c;
192 ff = v4.c;
193 cc = v4.c; /* { dg-warning "assignment from incompatible pointer type" } */
194 }
195 {
196 const int *d = &v4.d;
197 const int (*e)[1] = &v4.e;
198 const int (*f)[2][3] = &v4.f;
199 const int (*ff)[3] = v4.f;
200 int (*cc)[3] = v4.f; /* { dg-warning "initialization from incompatible pointer type" } */
201 d = &v4.d;
202 e = &v4.e;
203 f = &v4.f;
204 ff = v4.f;
205 cc = v4.f; /* { dg-warning "assignment from incompatible pointer type" } */
206 }
207
208 {
209 const int *d = &v5.x.a;
210 const int (*e)[1] = &v5.x.b;
211 const int (*f)[2][3] = &v5.x.c;
212 const int (*ff)[3] = v5.x.c;
213 int (*cc)[3] = v5.x.c; /* { dg-warning "initialization from incompatible pointer type" } */
214 d = &v5.x.a;
215 e = &v5.x.b;
216 f = &v5.x.c;
217 ff = v5.x.c;
218 cc = v5.x.c; /* { dg-warning "assignment from incompatible pointer type" } */
219 }
220 {
221 const int *d = &v5.x.d;
222 const int (*e)[1] = &v5.x.e;
223 const int (*f)[2][3] = &v5.x.f;
224 const int (*ff)[3] = v5.x.f;
225 int (*cc)[3] = v5.x.f; /* { dg-warning "initialization from incompatible pointer type" } */
226 d = &v5.x.d;
227 e = &v5.x.e;
228 f = &v5.x.f;
229 ff = v5.x.f;
230 cc = v5.x.f; /* { dg-warning "assignment from incompatible pointer type" } */
231 }
232 }
233