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