blob: ae490ee0841aab5c8a0d688b01cfc0fc259569a2 [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
7 // expected-error@+1 {{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 {
9 foo();
10 goto L1; // expected-error {{use of undeclared label 'L1'}}
11 }
12 goto L2; // expected-error {{use of undeclared label 'L2'}}
13#pragma omp atomic
14 // expected-error@+1 {{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}}
15 {
16 foo();
17 L2:
18 foo();
19 }
20
21 return 0;
22}
23
24struct S {
25 int a;
26};
27
28int readint() {
29 int a = 0, b = 0;
30// Test for atomic read
31#pragma omp atomic read
32 // 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}}
33 // expected-note@+1 {{expected an expression statement}}
34 ;
35#pragma omp atomic read
36 // 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}}
37 // expected-note@+1 {{expected built-in assignment operator}}
38 foo();
39#pragma omp atomic read
40 // 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}}
41 // expected-note@+1 {{expected built-in assignment operator}}
42 a += b;
43#pragma omp atomic read
44 // 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}}
45 // expected-note@+1 {{expected lvalue expression}}
46 a = 0;
47#pragma omp atomic read
48 a = b;
49 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}}
50#pragma omp atomic read read
51 a = b;
52
53 return 0;
54}
55
56int readS() {
57 struct S a, b;
58 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}}
59#pragma omp atomic read read
60 // 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}}
61 // expected-note@+1 {{expected expression of scalar type}}
62 a = b;
63
64 return a.a;
65}
Alexey Bataevf33eba62014-11-28 07:21:40 +000066
67int writeint() {
68 int a = 0, b = 0;
69// Test for atomic write
70#pragma omp atomic write
71 // 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}}
72 // expected-note@+1 {{expected an expression statement}}
73 ;
74#pragma omp atomic write
75 // 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}}
76 // expected-note@+1 {{expected built-in assignment operator}}
77 foo();
78#pragma omp atomic write
79 // 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}}
80 // expected-note@+1 {{expected built-in assignment operator}}
81 a += b;
82#pragma omp atomic write
83 a = 0;
84#pragma omp atomic write
85 a = b;
86 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}}
87#pragma omp atomic write write
88 a = b;
89
90 return 0;
91}
92
93int writeS() {
94 struct S a, b;
95 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}}
96#pragma omp atomic write write
97 // 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}}
98 // expected-note@+1 {{expected expression of scalar type}}
99 a = b;
100
101 return a.a;
102}