annotate gcc/testsuite/gcc.dg/c11-atomic-1.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Test for _Atomic in C11. Test of valid code. See c11-atomic-2.c
kono
parents:
diff changeset
2 for more exhaustive tests of assignment cases. */
kono
parents:
diff changeset
3 /* { dg-do compile } */
kono
parents:
diff changeset
4 /* { dg-options "-std=c11 -pedantic-errors" } */
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 /* The use of _Atomic as a qualifier, and of _Atomic (type-name), give
kono
parents:
diff changeset
7 the same type. */
kono
parents:
diff changeset
8 extern _Atomic int a;
kono
parents:
diff changeset
9 extern _Atomic (int) a;
kono
parents:
diff changeset
10 extern int *_Atomic b;
kono
parents:
diff changeset
11 extern _Atomic (int *) b;
kono
parents:
diff changeset
12 extern void f (int [_Atomic]);
kono
parents:
diff changeset
13 extern void f (int *_Atomic);
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 /* _Atomic may be applied to arbitrary types, with or without other
kono
parents:
diff changeset
16 qualifiers, and assignments may be made as with non-atomic
kono
parents:
diff changeset
17 types. Structure and union elements may be atomic. */
kono
parents:
diff changeset
18 _Atomic int ai1, ai2;
kono
parents:
diff changeset
19 int i1;
kono
parents:
diff changeset
20 volatile _Atomic long double ald1;
kono
parents:
diff changeset
21 const _Atomic long double ald2;
kono
parents:
diff changeset
22 long double ld1;
kono
parents:
diff changeset
23 _Atomic _Complex double acd1, acd2;
kono
parents:
diff changeset
24 _Complex double d1;
kono
parents:
diff changeset
25 _Atomic volatile _Bool ab1;
kono
parents:
diff changeset
26 int *p;
kono
parents:
diff changeset
27 int *_Atomic restrict ap;
kono
parents:
diff changeset
28 struct s { char c[1000]; };
kono
parents:
diff changeset
29 _Atomic struct s as1;
kono
parents:
diff changeset
30 struct s s1;
kono
parents:
diff changeset
31 struct t { _Atomic int i; };
kono
parents:
diff changeset
32 _Atomic struct t at1;
kono
parents:
diff changeset
33 _Atomic struct t *atp1;
kono
parents:
diff changeset
34 struct t t1;
kono
parents:
diff changeset
35 union u { char c[1000]; };
kono
parents:
diff changeset
36 _Atomic union u au1;
kono
parents:
diff changeset
37 union u u1;
kono
parents:
diff changeset
38 union v { _Atomic int i; };
kono
parents:
diff changeset
39 _Atomic union v av1;
kono
parents:
diff changeset
40 union v v1;
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 void
kono
parents:
diff changeset
43 func (_Atomic volatile long al1)
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 ai1 = ai2;
kono
parents:
diff changeset
46 ai1 = i1;
kono
parents:
diff changeset
47 i1 = ai2;
kono
parents:
diff changeset
48 ai1 = ald2;
kono
parents:
diff changeset
49 ald1 = d1;
kono
parents:
diff changeset
50 ld1 = acd2;
kono
parents:
diff changeset
51 acd1 += ab1;
kono
parents:
diff changeset
52 acd2 /= ai1;
kono
parents:
diff changeset
53 p = ap;
kono
parents:
diff changeset
54 ap = p;
kono
parents:
diff changeset
55 ab1 = p;
kono
parents:
diff changeset
56 as1 = s1;
kono
parents:
diff changeset
57 s1 = as1;
kono
parents:
diff changeset
58 at1 = t1;
kono
parents:
diff changeset
59 t1 = at1;
kono
parents:
diff changeset
60 /* It's unclear whether the undefined behavior (6.5.2.3#5) for
kono
parents:
diff changeset
61 accessing elements of atomic structures and unions is at
kono
parents:
diff changeset
62 translation or execution time; presume here that it's at
kono
parents:
diff changeset
63 execution time. */
kono
parents:
diff changeset
64 t1.i = at1.i; /* { dg-warning "accessing a member .i. of an atomic structure" } */
kono
parents:
diff changeset
65 at1.i = t1.i; /* { dg-warning "accessing a member .i. of an atomic structure" } */
kono
parents:
diff changeset
66 atp1->i = t1.i; /* { dg-warning "accessing a member .i. of an atomic structure" } */
kono
parents:
diff changeset
67 au1 = u1;
kono
parents:
diff changeset
68 u1 = au1;
kono
parents:
diff changeset
69 av1 = v1;
kono
parents:
diff changeset
70 v1 = av1;
kono
parents:
diff changeset
71 v1.i = av1.i; /* { dg-warning "accessing a member .i. of an atomic union" } */
kono
parents:
diff changeset
72 av1.i = v1.i; /* { dg-warning "accessing a member .i. of an atomic union" } */
kono
parents:
diff changeset
73 /* _Atomic is valid on register variables, even if not particularly
kono
parents:
diff changeset
74 useful. */
kono
parents:
diff changeset
75 register _Atomic volatile int ra1 = 1, ra2 = 2;
kono
parents:
diff changeset
76 ra1 = ra2;
kono
parents:
diff changeset
77 ra2 = ra1;
kono
parents:
diff changeset
78 /* And on parameters. */
kono
parents:
diff changeset
79 al1 = ra1;
kono
parents:
diff changeset
80 ra2 = al1;
kono
parents:
diff changeset
81 }
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 /* A function may return an atomic type. */
kono
parents:
diff changeset
84 _Atomic int
kono
parents:
diff changeset
85 func2 (int i)
kono
parents:
diff changeset
86 {
kono
parents:
diff changeset
87 return i;
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 /* Casts may specify atomic type. */
kono
parents:
diff changeset
91 int
kono
parents:
diff changeset
92 func3 (int i)
kono
parents:
diff changeset
93 {
kono
parents:
diff changeset
94 return func2 ((_Atomic long) i);
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 /* The _Atomic void type is valid. */
kono
parents:
diff changeset
98 _Atomic void *avp;
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 /* An array of atomic elements is valid (the elements being atomic,
kono
parents:
diff changeset
101 not the array). */
kono
parents:
diff changeset
102 _Atomic int aa[10];
kono
parents:
diff changeset
103 int
kono
parents:
diff changeset
104 func4 (void)
kono
parents:
diff changeset
105 {
kono
parents:
diff changeset
106 return aa[2];
kono
parents:
diff changeset
107 }
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 /* Increment and decrement are valid for atomic types when they are
kono
parents:
diff changeset
110 valid for non-atomic types. */
kono
parents:
diff changeset
111 void
kono
parents:
diff changeset
112 func5 (void)
kono
parents:
diff changeset
113 {
kono
parents:
diff changeset
114 ald1++;
kono
parents:
diff changeset
115 ald1--;
kono
parents:
diff changeset
116 ++ald1;
kono
parents:
diff changeset
117 --ald1;
kono
parents:
diff changeset
118 ai1++;
kono
parents:
diff changeset
119 ai1--;
kono
parents:
diff changeset
120 ++ai1;
kono
parents:
diff changeset
121 --ai1;
kono
parents:
diff changeset
122 ab1++;
kono
parents:
diff changeset
123 ab1--;
kono
parents:
diff changeset
124 ++ab1;
kono
parents:
diff changeset
125 --ab1;
kono
parents:
diff changeset
126 ap++;
kono
parents:
diff changeset
127 ap--;
kono
parents:
diff changeset
128 ++ap;
kono
parents:
diff changeset
129 --ap;
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 /* Compound literals may have atomic type. */
kono
parents:
diff changeset
133 _Atomic int *aiclp = &(_Atomic int) { 1 };
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 /* Test unary & and *. */
kono
parents:
diff changeset
136 void
kono
parents:
diff changeset
137 func6 (void)
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 int i = *aiclp;
kono
parents:
diff changeset
140 _Atomic int *p = &ai2;
kono
parents:
diff changeset
141 }
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 /* Casts to atomic type are valid (although the _Atomic has little
kono
parents:
diff changeset
144 effect because the result is an rvalue). */
kono
parents:
diff changeset
145 int i2 = (_Atomic int) 1.0;
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 /* For pointer subtraction and comparisons, _Atomic does not count as
kono
parents:
diff changeset
148 a qualifier. Likewise for conditional expressions. */
kono
parents:
diff changeset
149 _Atomic int *xaip1;
kono
parents:
diff changeset
150 volatile _Atomic int *xaip2;
kono
parents:
diff changeset
151 void *xvp1;
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 void
kono
parents:
diff changeset
154 func7 (void)
kono
parents:
diff changeset
155 {
kono
parents:
diff changeset
156 int r;
kono
parents:
diff changeset
157 r = xaip1 - xaip2;
kono
parents:
diff changeset
158 r = xaip1 < xaip2;
kono
parents:
diff changeset
159 r = xaip1 > xaip2;
kono
parents:
diff changeset
160 r = xaip1 <= xaip2;
kono
parents:
diff changeset
161 r = xaip1 >= xaip2;
kono
parents:
diff changeset
162 r = xaip1 == xaip2;
kono
parents:
diff changeset
163 r = xaip1 != xaip2;
kono
parents:
diff changeset
164 r = xaip1 == xvp1;
kono
parents:
diff changeset
165 r = xaip1 != xvp1;
kono
parents:
diff changeset
166 r = xvp1 == xaip1;
kono
parents:
diff changeset
167 r = xvp1 != xaip1;
kono
parents:
diff changeset
168 r = xaip1 == 0;
kono
parents:
diff changeset
169 r = ((void *) 0) == xaip2;
kono
parents:
diff changeset
170 (void) (r ? xaip1 : xaip2);
kono
parents:
diff changeset
171 (void) (r ? xvp1 : xaip2);
kono
parents:
diff changeset
172 (void) (r ? xaip2 : xvp1);
kono
parents:
diff changeset
173 (void) (r ? xaip1 : 0);
kono
parents:
diff changeset
174 (void) (r ? 0 : xaip1);
kono
parents:
diff changeset
175 /* The result of a conditional expression between a pointer to
kono
parents:
diff changeset
176 qualified or unqualified (but not atomic) void, and a pointer to
kono
parents:
diff changeset
177 an atomic type, is a pointer to appropriately qualified, not
kono
parents:
diff changeset
178 atomic, void. As such, it is valid to use further in conditional
kono
parents:
diff changeset
179 expressions with other pointer types. */
kono
parents:
diff changeset
180 (void) (r ? xaip1 : (r ? xaip1 : xvp1));
kono
parents:
diff changeset
181 }
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 /* Pointer += and -= integer is valid. */
kono
parents:
diff changeset
184 void
kono
parents:
diff changeset
185 func8 (void)
kono
parents:
diff changeset
186 {
kono
parents:
diff changeset
187 b += 1;
kono
parents:
diff changeset
188 b -= 2ULL;
kono
parents:
diff changeset
189 ap += 3;
kono
parents:
diff changeset
190 }
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 /* Various other cases of simple assignment are valid (some already
kono
parents:
diff changeset
193 tested above). */
kono
parents:
diff changeset
194 void
kono
parents:
diff changeset
195 func9 (void)
kono
parents:
diff changeset
196 {
kono
parents:
diff changeset
197 ap = 0;
kono
parents:
diff changeset
198 ap = (void *) 0;
kono
parents:
diff changeset
199 xvp1 = atp1;
kono
parents:
diff changeset
200 atp1 = xvp1;
kono
parents:
diff changeset
201 }
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 /* Test compatibility of function types in cases where _Atomic matches
kono
parents:
diff changeset
204 (see c11-atomic-3.c for corresponding cases where it doesn't
kono
parents:
diff changeset
205 match). */
kono
parents:
diff changeset
206 void fc0a (int const);
kono
parents:
diff changeset
207 void fc0a (int);
kono
parents:
diff changeset
208 void fc0b (int _Atomic);
kono
parents:
diff changeset
209 void fc0b (int _Atomic);
kono
parents:
diff changeset
210 void fc1a (int);
kono
parents:
diff changeset
211 void
kono
parents:
diff changeset
212 fc1a (x)
kono
parents:
diff changeset
213 volatile int x;
kono
parents:
diff changeset
214 {
kono
parents:
diff changeset
215 }
kono
parents:
diff changeset
216 void fc1b (_Atomic int);
kono
parents:
diff changeset
217 void
kono
parents:
diff changeset
218 fc1b (x)
kono
parents:
diff changeset
219 volatile _Atomic int x;
kono
parents:
diff changeset
220 {
kono
parents:
diff changeset
221 }
kono
parents:
diff changeset
222 void
kono
parents:
diff changeset
223 fc2a (x)
kono
parents:
diff changeset
224 const int x;
kono
parents:
diff changeset
225 {
kono
parents:
diff changeset
226 }
kono
parents:
diff changeset
227 void fc2a (int); /* { dg-warning "follows non-prototype" } */
kono
parents:
diff changeset
228 void
kono
parents:
diff changeset
229 fc2b (x)
kono
parents:
diff changeset
230 _Atomic int x;
kono
parents:
diff changeset
231 {
kono
parents:
diff changeset
232 }
kono
parents:
diff changeset
233 void fc2b (_Atomic int); /* { dg-warning "follows non-prototype" } */
kono
parents:
diff changeset
234 void fc3a (int);
kono
parents:
diff changeset
235 void
kono
parents:
diff changeset
236 fc3a (x)
kono
parents:
diff changeset
237 volatile short x;
kono
parents:
diff changeset
238 {
kono
parents:
diff changeset
239 }
kono
parents:
diff changeset
240 void fc3b (_Atomic int);
kono
parents:
diff changeset
241 void
kono
parents:
diff changeset
242 fc3b (x)
kono
parents:
diff changeset
243 _Atomic short x;
kono
parents:
diff changeset
244 {
kono
parents:
diff changeset
245 }
kono
parents:
diff changeset
246 void
kono
parents:
diff changeset
247 fc4a (x)
kono
parents:
diff changeset
248 const short x;
kono
parents:
diff changeset
249 {
kono
parents:
diff changeset
250 }
kono
parents:
diff changeset
251 void fc4a (int); /* { dg-warning "follows non-prototype" } */
kono
parents:
diff changeset
252 void
kono
parents:
diff changeset
253 fc4b (x)
kono
parents:
diff changeset
254 _Atomic short x;
kono
parents:
diff changeset
255 {
kono
parents:
diff changeset
256 }
kono
parents:
diff changeset
257 void fc4b (_Atomic int); /* { dg-warning "follows non-prototype" } */
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 /* Test cases involving C_MAYBE_CONST_EXPR work. */
kono
parents:
diff changeset
260 void
kono
parents:
diff changeset
261 func10 (_Atomic int *p)
kono
parents:
diff changeset
262 {
kono
parents:
diff changeset
263 p[0 / 0] = 1; /* { dg-warning "division by zero" } */
kono
parents:
diff changeset
264 p[0 / 0] += 1; /* { dg-warning "division by zero" } */
kono
parents:
diff changeset
265 *p = 0 / 0; /* { dg-warning "division by zero" } */
kono
parents:
diff changeset
266 *p += 0 / 0; /* { dg-warning "division by zero" } */
kono
parents:
diff changeset
267 }