diff options
Diffstat (limited to 'clang/test/OpenMP')
-rw-r--r-- | clang/test/OpenMP/atomic_ast_print.cpp | 37 | ||||
-rw-r--r-- | clang/test/OpenMP/atomic_messages.cpp | 63 |
2 files changed, 89 insertions, 11 deletions
diff --git a/clang/test/OpenMP/atomic_ast_print.cpp b/clang/test/OpenMP/atomic_ast_print.cpp index ce8ebd52347..31c08920136 100644 --- a/clang/test/OpenMP/atomic_ast_print.cpp +++ b/clang/test/OpenMP/atomic_ast_print.cpp @@ -8,6 +8,7 @@ template <class T> T foo(T argc) { + T b = T(); T a = T(); #pragma omp atomic a++; @@ -17,6 +18,13 @@ T foo(T argc) { a = argc + argc; #pragma omp atomic update a = a + argc; +#pragma omp atomic capture + a = b++; +#pragma omp atomic capture + { + a = b; + b++; + } return T(); } @@ -29,6 +37,13 @@ T foo(T argc) { // CHECK-NEXT: a = argc + argc; // CHECK-NEXT: #pragma omp atomic update // CHECK-NEXT: a = a + argc; +// CHECK-NEXT: #pragma omp atomic capture +// CHECK-NEXT: a = b++; +// CHECK-NEXT: #pragma omp atomic capture +// CHECK-NEXT: { +// CHECK-NEXT: a = b; +// CHECK-NEXT: b++; +// CHECK-NEXT: } // CHECK: T a = T(); // CHECK-NEXT: #pragma omp atomic // CHECK-NEXT: a++; @@ -38,8 +53,16 @@ T foo(T argc) { // CHECK-NEXT: a = argc + argc; // CHECK-NEXT: #pragma omp atomic update // CHECK-NEXT: a = a + argc; +// CHECK-NEXT: #pragma omp atomic capture +// CHECK-NEXT: a = b++; +// CHECK-NEXT: #pragma omp atomic capture +// CHECK-NEXT: { +// CHECK-NEXT: a = b; +// CHECK-NEXT: b++; +// CHECK-NEXT: } int main(int argc, char **argv) { + int b = 0; int a = 0; // CHECK: int a = 0; #pragma omp atomic @@ -50,6 +73,13 @@ int main(int argc, char **argv) { a = argc + argc; #pragma omp atomic update a = a + argc; +#pragma omp atomic capture + a = b++; +#pragma omp atomic capture + { + a = b; + b++; + } // CHECK-NEXT: #pragma omp atomic // CHECK-NEXT: a++; // CHECK-NEXT: #pragma omp atomic read @@ -58,6 +88,13 @@ int main(int argc, char **argv) { // CHECK-NEXT: a = argc + argc; // CHECK-NEXT: #pragma omp atomic update // CHECK-NEXT: a = a + argc; + // CHECK-NEXT: #pragma omp atomic capture + // CHECK-NEXT: a = b++; + // CHECK-NEXT: #pragma omp atomic capture + // CHECK-NEXT: { + // CHECK-NEXT: a = b; + // CHECK-NEXT: b++; + // CHECK-NEXT: } return foo(a); } diff --git a/clang/test/OpenMP/atomic_messages.cpp b/clang/test/OpenMP/atomic_messages.cpp index d7856cc229a..66f7c9db64b 100644 --- a/clang/test/OpenMP/atomic_messages.cpp +++ b/clang/test/OpenMP/atomic_messages.cpp @@ -4,14 +4,14 @@ int foo() { L1: foo(); #pragma omp atomic -// 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}} + // 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}} { foo(); goto L1; // expected-error {{use of undeclared label 'L1'}} } goto L2; // expected-error {{use of undeclared label 'L2'}} #pragma omp atomic -// 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}} + // 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}} { foo(); L2: @@ -26,7 +26,7 @@ T read() { T a, b = 0; // Test for atomic read #pragma omp atomic read -// expected-error@+1 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both l-value expressions with scalar type}} + // expected-error@+1 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both l-value expressions with scalar type}} ; // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}} #pragma omp atomic read read @@ -39,7 +39,7 @@ int read() { int a, b = 0; // Test for atomic read #pragma omp atomic read -// expected-error@+1 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both l-value expressions with scalar type}} + // expected-error@+1 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both l-value expressions with scalar type}} ; // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}} #pragma omp atomic read read @@ -53,7 +53,7 @@ T write() { T a, b = 0; // Test for atomic write #pragma omp atomic write -// expected-error@+1 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is an l-value expression with scalar type}} + // expected-error@+1 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is an l-value expression with scalar type}} ; // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} #pragma omp atomic write write @@ -66,7 +66,7 @@ int write() { int a, b = 0; // Test for atomic write #pragma omp atomic write -// expected-error@+1 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is an l-value expression with scalar type}} + // expected-error@+1 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is an l-value expression with scalar type}} ; // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} #pragma omp atomic write write @@ -80,14 +80,14 @@ T update() { T a, b = 0; // Test for atomic update #pragma omp atomic update -// expected-error@+1 {{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}} + // expected-error@+1 {{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}} ; // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}} #pragma omp atomic update update a += b; #pragma omp atomic -// 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}} + // 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}} ; return T(); @@ -97,20 +97,53 @@ int update() { int a, b = 0; // Test for atomic update #pragma omp atomic update -// expected-error@+1 {{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}} + // expected-error@+1 {{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}} ; // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}} #pragma omp atomic update update a += b; #pragma omp atomic -// 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}} + // 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}} ; return update<int>(); } template <class T> +T capture() { + T a, b = 0; +// Test for atomic capture +#pragma omp atomic capture + // expected-error@+1 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} + ++a; +#pragma omp atomic capture + // expected-error@+1 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} + ; +// expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}} +#pragma omp atomic capture capture + a = ++b; + + return T(); +} + +int capture() { + int a, b = 0; +// Test for atomic capture +#pragma omp atomic capture + // expected-error@+1 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} + ++a; +#pragma omp atomic capture + // expected-error@+1 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} + ; +// expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}} +#pragma omp atomic capture capture + a = ++b; + + return capture<int>(); +} + +template <class T> T mixed() { T a, b = T(); // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} @@ -125,6 +158,10 @@ T mixed() { // expected-note@+1 2 {{'update' clause used here}} #pragma omp atomic update read a += b; +// expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} +// expected-note@+1 2 {{'capture' clause used here}} +#pragma omp atomic capture read + a = ++b; return T(); } @@ -142,7 +179,11 @@ int mixed() { // expected-note@+1 {{'write' clause used here}} #pragma omp atomic write update a = b; -// expected-note@+1 {{in instantiation of function template specialization 'mixed<int>' requested here}} +// expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} +// expected-note@+1 {{'write' clause used here}} +#pragma omp atomic write capture + a = b; + // expected-note@+1 {{in instantiation of function template specialization 'mixed<int>' requested here}} return mixed<int>(); } |