annotate gcc/testsuite/gcc.dg/c11-atomic-3.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
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 invalid code. */
kono
parents:
diff changeset
2 /* { dg-do compile } */
kono
parents:
diff changeset
3 /* { dg-options "-std=c11 -pedantic-errors" } */
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 /* Increment and decrement are invalid for atomic complex types and
kono
parents:
diff changeset
6 atomic pointers to incomplete types, just as for the corresponding
kono
parents:
diff changeset
7 non-atomic types. Likewise for types on which arithmetic is
kono
parents:
diff changeset
8 invalid. */
kono
parents:
diff changeset
9 _Atomic _Complex float acf;
kono
parents:
diff changeset
10 void *_Atomic apv;
kono
parents:
diff changeset
11 struct s *_Atomic aps;
kono
parents:
diff changeset
12 _Atomic struct t { char c; } as;
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 void
kono
parents:
diff changeset
15 func (void)
kono
parents:
diff changeset
16 {
kono
parents:
diff changeset
17 acf++; /* { dg-error "complex types" } */
kono
parents:
diff changeset
18 acf--; /* { dg-error "complex types" } */
kono
parents:
diff changeset
19 ++acf; /* { dg-error "complex types" } */
kono
parents:
diff changeset
20 --acf; /* { dg-error "complex types" } */
kono
parents:
diff changeset
21 apv++; /* { dg-error "wrong type|pointer of type" } */
kono
parents:
diff changeset
22 apv--; /* { dg-error "wrong type|pointer of type" } */
kono
parents:
diff changeset
23 ++apv; /* { dg-error "wrong type|pointer of type" } */
kono
parents:
diff changeset
24 --apv; /* { dg-error "wrong type|pointer of type" } */
kono
parents:
diff changeset
25 aps++; /* { dg-error "pointer to|invalid use of undefined type" } */
kono
parents:
diff changeset
26 aps--; /* { dg-error "pointer to|invalid use of undefined type" } */
kono
parents:
diff changeset
27 ++aps; /* { dg-error "pointer to|invalid use of undefined type" } */
kono
parents:
diff changeset
28 --aps; /* { dg-error "pointer to|invalid use of undefined type" } */
kono
parents:
diff changeset
29 as++; /* { dg-error "wrong type" } */
kono
parents:
diff changeset
30 as--; /* { dg-error "wrong type" } */
kono
parents:
diff changeset
31 ++as; /* { dg-error "wrong type" } */
kono
parents:
diff changeset
32 --as; /* { dg-error "wrong type" } */
kono
parents:
diff changeset
33 }
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 /* Pointer subtraction and comparisons differing in _Atomic are
kono
parents:
diff changeset
36 invalid where such subtraction and comparisons differing in
kono
parents:
diff changeset
37 qualifiers are valid. There is no special allowance for equality
kono
parents:
diff changeset
38 comparisons of pointers to atomic void to pointers to object
kono
parents:
diff changeset
39 types. Likewise for conditional expressions. */
kono
parents:
diff changeset
40 int *pi;
kono
parents:
diff changeset
41 _Atomic int *pai;
kono
parents:
diff changeset
42 _Atomic void *pav;
kono
parents:
diff changeset
43 int r;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 void
kono
parents:
diff changeset
46 func2 (void)
kono
parents:
diff changeset
47 {
kono
parents:
diff changeset
48 r = pai - pi; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
49 r = pi - pai; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
50 r = pi < pai; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
51 r = pi > pai; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
52 r = pi <= pai; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
53 r = pi >= pai; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
54 r = pai < pi; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
55 r = pai > pi; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
56 r = pai <= pi; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
57 r = pai >= pi; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
58 r = pav == pi; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
59 r = pav != pi; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
60 r = pi == pav; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
61 r = pi != pav; /* { dg-error "distinct pointer types" } */
kono
parents:
diff changeset
62 (void) (r ? pai : pi); /* { dg-error "pointer type mismatch" } */
kono
parents:
diff changeset
63 (void) (r ? pi : pai); /* { dg-error "pointer type mismatch" } */
kono
parents:
diff changeset
64 (void) (r ? pai : pav); /* { dg-error "pointer type mismatch" } */
kono
parents:
diff changeset
65 (void) (r ? pav : pai); /* { dg-error "pointer type mismatch" } */
kono
parents:
diff changeset
66 }
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 /* Likewise for pointer assignment. */
kono
parents:
diff changeset
69 void
kono
parents:
diff changeset
70 func3 (void)
kono
parents:
diff changeset
71 {
kono
parents:
diff changeset
72 pai = pi; /* { dg-error "incompatible pointer type" } */
kono
parents:
diff changeset
73 pi = pai; /* { dg-error "incompatible pointer type" } */
kono
parents:
diff changeset
74 pav = pai; /* { dg-error "incompatible pointer type" } */
kono
parents:
diff changeset
75 pai = pav; /* { dg-error "incompatible pointer type" } */
kono
parents:
diff changeset
76 }
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 /* Cases that are invalid for normal assignments are just as invalid
kono
parents:
diff changeset
79 (and should not ICE) when the LHS is atomic. */
kono
parents:
diff changeset
80 void
kono
parents:
diff changeset
81 func4 (void)
kono
parents:
diff changeset
82 {
kono
parents:
diff changeset
83 as = acf; /* { dg-error "incompatible types" } */
kono
parents:
diff changeset
84 apv = as; /* { dg-error "incompatible types" } */
kono
parents:
diff changeset
85 as += 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
86 apv -= 1; /* { dg-error "pointer of type" } */
kono
parents:
diff changeset
87 apv *= 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
88 apv /= 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
89 apv %= 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
90 apv <<= 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
91 apv >>= 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
92 apv &= 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
93 apv ^= 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
94 apv |= 1; /* { dg-error "invalid operands" } */
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 /* We don't allow atomic bit-fields in GCC (implementation-defined
kono
parents:
diff changeset
98 whether they are permitted). */
kono
parents:
diff changeset
99 struct abf
kono
parents:
diff changeset
100 {
kono
parents:
diff changeset
101 _Atomic int i : 1; /* { dg-error "atomic type" } */
kono
parents:
diff changeset
102 _Atomic int : 0; /* { dg-error "atomic type" } */
kono
parents:
diff changeset
103 };
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 /* _Atomic (type-name) may not use a name for an array, function,
kono
parents:
diff changeset
106 qualified or atomic type. */
kono
parents:
diff changeset
107 _Atomic (int [2]) v0; /* { dg-error "array type" } */
kono
parents:
diff changeset
108 _Atomic (void (void)) v1; /* { dg-error "function type" } */
kono
parents:
diff changeset
109 _Atomic (_Atomic int) v2; /* { dg-error "applied to a qualified type" } */
kono
parents:
diff changeset
110 _Atomic (const int) v3; /* { dg-error "applied to a qualified type" } */
kono
parents:
diff changeset
111 _Atomic (volatile int) v4; /* { dg-error "applied to a qualified type" } */
kono
parents:
diff changeset
112 _Atomic (int *restrict) v5; /* { dg-error "applied to a qualified type" } */
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 /* _Atomic, used as a qualifier, may not be applied to a function or
kono
parents:
diff changeset
115 array type. */
kono
parents:
diff changeset
116 typedef int arraytype[2];
kono
parents:
diff changeset
117 typedef void functiontype (void);
kono
parents:
diff changeset
118 _Atomic arraytype v6; /* { dg-error "array type" } */
kono
parents:
diff changeset
119 _Atomic arraytype *v7; /* { dg-error "array type" } */
kono
parents:
diff changeset
120 typedef _Atomic arraytype v8; /* { dg-error "array type" } */
kono
parents:
diff changeset
121 int v9 = sizeof (_Atomic arraytype); /* { dg-error "array type" } */
kono
parents:
diff changeset
122 void v10 (_Atomic arraytype parm); /* { dg-error "array type" } */
kono
parents:
diff changeset
123 struct v11 { _Atomic arraytype f; }; /* { dg-error "array type" } */
kono
parents:
diff changeset
124 _Atomic functiontype v12; /* { dg-error "function type" } */
kono
parents:
diff changeset
125 _Atomic functiontype *v13; /* { dg-error "function type" } */
kono
parents:
diff changeset
126 typedef _Atomic functiontype *v14; /* { dg-error "function type" } */
kono
parents:
diff changeset
127 void v15 (_Atomic functiontype parm); /* { dg-error "function type" } */
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 /* Function parameters, when function types are required to be
kono
parents:
diff changeset
130 compatible, may not differ in the presence of _Atomic. See
kono
parents:
diff changeset
131 c11-atomic-1.c for corresponding tests where _Atomic matches. */
kono
parents:
diff changeset
132 void fc0 (int _Atomic); /* { dg-message "previous declaration" } */
kono
parents:
diff changeset
133 void fc0 (int); /* { dg-error "conflicting types" } */
kono
parents:
diff changeset
134 void fc1 (int); /* { dg-message "prototype declaration" } */
kono
parents:
diff changeset
135 void
kono
parents:
diff changeset
136 fc1 (x)
kono
parents:
diff changeset
137 _Atomic int x; /* { dg-error "match prototype" } */
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140 void
kono
parents:
diff changeset
141 fc2 (x) /* { dg-message "previous definition" } */
kono
parents:
diff changeset
142 _Atomic int x;
kono
parents:
diff changeset
143 {
kono
parents:
diff changeset
144 }
kono
parents:
diff changeset
145 void fc2 (int); /* { dg-error "incompatible type" } */
kono
parents:
diff changeset
146 void fc3 (int); /* { dg-message "prototype declaration" } */
kono
parents:
diff changeset
147 void
kono
parents:
diff changeset
148 fc3 (x)
kono
parents:
diff changeset
149 _Atomic short x; /* { dg-error "match prototype" } */
kono
parents:
diff changeset
150 {
kono
parents:
diff changeset
151 }
kono
parents:
diff changeset
152 void
kono
parents:
diff changeset
153 fc4 (x) /* { dg-message "previous definition" } */
kono
parents:
diff changeset
154 _Atomic short x;
kono
parents:
diff changeset
155 {
kono
parents:
diff changeset
156 }
kono
parents:
diff changeset
157 void fc4 (int); /* { dg-error "incompatible type" } */
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 /* Arrays of atomic elements cannot be initialized with string
kono
parents:
diff changeset
160 literals. */
kono
parents:
diff changeset
161 _Atomic char si0[] = ""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
162 _Atomic char si1[] = u8""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
163 _Atomic signed char si2[] = ""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
164 _Atomic signed char si3[] = u8""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
165 _Atomic unsigned char si4[] = ""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
166 _Atomic unsigned char si5[] = u8""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
167 _Atomic __WCHAR_TYPE__ si6[] = L""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
168 _Atomic __CHAR16_TYPE__ si7[] = u""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
169 _Atomic __CHAR32_TYPE__ si8[] = U""; /* { dg-error "inappropriate type" } */
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 /* Anything that is syntactically a qualifier applied to the (void)
kono
parents:
diff changeset
172 parameter list results in undefined behavior, which we
kono
parents:
diff changeset
173 diagnose. */
kono
parents:
diff changeset
174 void fv (_Atomic void); /* { dg-error "may not be qualified" } */