diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2014-11-28 07:21:40 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2014-11-28 07:21:40 +0000 |
commit | f33eba65730daec50efd6edcbb6e1bfcd921e6da (patch) | |
tree | 0ba1a604a8ba2efe4f6e0bb6466da80c6922979a /clang/test | |
parent | ce2748929332857065444e2a7a3cc19729e6eccb (diff) | |
download | bcm5719-llvm-f33eba65730daec50efd6edcbb6e1bfcd921e6da.tar.gz bcm5719-llvm-f33eba65730daec50efd6edcbb6e1bfcd921e6da.zip |
[OPENMP] Additional processing of 'omp atomic write' directive.
According to OpenMP standard, Section 2.12.6, atomic Construct, '#pragma omp atomic write' is allowed to be used only for expression statements of form 'x = expr;', where x is a lvalue expression and expr is an expression with scalar type. Patch adds checks for it.
llvm-svn: 222913
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/OpenMP/atomic_messages.c | 37 | ||||
-rw-r--r-- | clang/test/OpenMP/atomic_messages.cpp | 30 |
2 files changed, 65 insertions, 2 deletions
diff --git a/clang/test/OpenMP/atomic_messages.c b/clang/test/OpenMP/atomic_messages.c index d2d33085096..ae490ee0841 100644 --- a/clang/test/OpenMP/atomic_messages.c +++ b/clang/test/OpenMP/atomic_messages.c @@ -63,3 +63,40 @@ int readS() { return a.a; } + +int writeint() { + int a = 0, b = 0; +// Test for atomic write +#pragma omp atomic write + // 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}} + // expected-note@+1 {{expected an expression statement}} + ; +#pragma omp atomic write + // 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}} + // expected-note@+1 {{expected built-in assignment operator}} + foo(); +#pragma omp atomic write + // 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}} + // expected-note@+1 {{expected built-in assignment operator}} + a += b; +#pragma omp atomic write + a = 0; +#pragma omp atomic write + a = b; + // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} +#pragma omp atomic write write + a = b; + + return 0; +} + +int writeS() { + struct S a, b; + // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} +#pragma omp atomic write write + // 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}} + // expected-note@+1 {{expected expression of scalar type}} + a = b; + + return a.a; +} diff --git a/clang/test/OpenMP/atomic_messages.cpp b/clang/test/OpenMP/atomic_messages.cpp index 3965a77c955..a6c07ad9e28 100644 --- a/clang/test/OpenMP/atomic_messages.cpp +++ b/clang/test/OpenMP/atomic_messages.cpp @@ -100,11 +100,24 @@ 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@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}} + // expected-note@+1 {{expected an expression statement}} ; // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} #pragma omp atomic write write a = b; +#pragma omp atomic write + // 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}} + // expected-note@+1 {{expected built-in assignment operator}} + foo(); +#pragma omp atomic write + // 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}} + // expected-note@+1 {{expected built-in assignment operator}} + a += b; +#pragma omp atomic write + a = 0; +#pragma omp atomic write + a = b; return T(); } @@ -113,11 +126,24 @@ 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@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}} + // expected-note@+1 {{expected an expression statement}} ; // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} #pragma omp atomic write write a = b; +#pragma omp atomic write + // 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}} + // expected-note@+1 {{expected built-in assignment operator}} + foo(); +#pragma omp atomic write + // 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}} + // expected-note@+1 {{expected built-in assignment operator}} + a += b; +#pragma omp atomic write + a = 0; +#pragma omp atomic write + a = foo(); return write<int>(); } |