blob: 8d4ade6fe0c3e4b5a981633ea5addd63cff85d52 [file] [log] [blame]
Alexey Bataev62cec442014-11-18 10:14:22 +00001// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 %s
2
3int foo() {
4L1:
5 foo();
6#pragma omp atomic
Alexey Bataev1d160b12015-03-13 12:27:31 +00007 // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
8 // expected-note@+1 {{expected an expression statement}}
Alexey Bataev62cec442014-11-18 10:14:22 +00009 {
10 foo();
11 goto L1; // expected-error {{use of undeclared label 'L1'}}
12 }
13 goto L2; // expected-error {{use of undeclared label 'L2'}}
14#pragma omp atomic
Alexey Bataev1d160b12015-03-13 12:27:31 +000015 // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
16 // expected-note@+1 {{expected an expression statement}}
Alexey Bataev62cec442014-11-18 10:14:22 +000017 {
18 foo();
19 L2:
20 foo();
21 }
22
23 return 0;
24}
25
26struct S {
27 int a;
28};
29
30int readint() {
31 int a = 0, b = 0;
32// Test for atomic read
33#pragma omp atomic read
34 // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}}
35 // expected-note@+1 {{expected an expression statement}}
36 ;
37#pragma omp atomic read
38 // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}}
39 // expected-note@+1 {{expected built-in assignment operator}}
40 foo();
41#pragma omp atomic read
42 // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}}
43 // expected-note@+1 {{expected built-in assignment operator}}
44 a += b;
45#pragma omp atomic read
46 // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}}
47 // expected-note@+1 {{expected lvalue expression}}
48 a = 0;
49#pragma omp atomic read
50 a = b;
51 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}}
52#pragma omp atomic read read
53 a = b;
54
55 return 0;
56}
57
58int readS() {
59 struct S a, b;
60 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}}
61#pragma omp atomic read read
62 // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}}
63 // expected-note@+1 {{expected expression of scalar type}}
64 a = b;
65
66 return a.a;
67}
Alexey Bataevf33eba62014-11-28 07:21:40 +000068
69int writeint() {
70 int a = 0, b = 0;
71// Test for atomic write
72#pragma omp atomic write
73 // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}}
74 // expected-note@+1 {{expected an expression statement}}
75 ;
76#pragma omp atomic write
77 // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}}
78 // expected-note@+1 {{expected built-in assignment operator}}
79 foo();
80#pragma omp atomic write
81 // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}}
82 // expected-note@+1 {{expected built-in assignment operator}}
83 a += b;
84#pragma omp atomic write
85 a = 0;
86#pragma omp atomic write
87 a = b;
88 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}}
89#pragma omp atomic write write
90 a = b;
91
92 return 0;
93}
94
95int writeS() {
96 struct S a, b;
97 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}}
98#pragma omp atomic write write
99 // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}}
100 // expected-note@+1 {{expected expression of scalar type}}
101 a = b;
102
103 return a.a;
104}
Alexey Bataev1d160b12015-03-13 12:27:31 +0000105
106int updateint() {
107 int a = 0, b = 0;
108// Test for atomic update
109#pragma omp atomic update
110 // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
111 // expected-note@+1 {{expected an expression statement}}
112 ;
113#pragma omp atomic
114 // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
115 // expected-note@+1 {{expected built-in binary or unary operator}}
116 foo();
117#pragma omp atomic
118 // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
119 // expected-note@+1 {{expected built-in binary operator}}
120 a = b;
121#pragma omp atomic update
122 // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
123 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}}
124 a = b || a;
125#pragma omp atomic update
126 // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
127 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}}
128 a = a && b;
129#pragma omp atomic update
130 // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
131 // expected-note@+1 {{expected in right hand side of expression}}
132 a = (float)a + b;
133#pragma omp atomic
134 // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
135 // expected-note@+1 {{expected in right hand side of expression}}
136 a = 2 * b;
137#pragma omp atomic
138 // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
139 // expected-note@+1 {{expected in right hand side of expression}}
140 a = b + *&a;
141#pragma omp atomic update
142 *&a = *&a + 2;
143#pragma omp atomic update
144 a++;
145#pragma omp atomic
146 ++a;
147#pragma omp atomic update
148 a--;
149#pragma omp atomic
150 --a;
151#pragma omp atomic update
152 a += b;
153#pragma omp atomic
154 a %= b;
155#pragma omp atomic update
156 a *= b;
157#pragma omp atomic
158 a -= b;
159#pragma omp atomic update
160 a /= b;
161#pragma omp atomic
162 a &= b;
163#pragma omp atomic update
164 a ^= b;
165#pragma omp atomic
166 a |= b;
167#pragma omp atomic update
168 a <<= b;
169#pragma omp atomic
170 a >>= b;
171#pragma omp atomic update
172 a = b + a;
173#pragma omp atomic
174 a = a * b;
175#pragma omp atomic update
176 a = b - a;
177#pragma omp atomic
178 a = a / b;
179#pragma omp atomic update
180 a = b & a;
181#pragma omp atomic
182 a = a ^ b;
183#pragma omp atomic update
184 a = b | a;
185#pragma omp atomic
186 a = a << b;
187#pragma omp atomic
188 a = b >> a;
189 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}}
190#pragma omp atomic update update
191 a /= b;
192
193 return 0;
194}
195