diff options
-rw-r--r-- | clang/include/clang/Basic/OpenMPKinds.def | 3 | ||||
-rw-r--r-- | clang/test/OpenMP/simd_ast_print.cpp | 25 | ||||
-rw-r--r-- | clang/test/OpenMP/simd_misc_messages.c | 50 |
3 files changed, 67 insertions, 11 deletions
diff --git a/clang/include/clang/Basic/OpenMPKinds.def b/clang/include/clang/Basic/OpenMPKinds.def index 956a886e8a7..41b77ef843c 100644 --- a/clang/include/clang/Basic/OpenMPKinds.def +++ b/clang/include/clang/Basic/OpenMPKinds.def @@ -48,7 +48,8 @@ OPENMP_PARALLEL_CLAUSE(private) OPENMP_PARALLEL_CLAUSE(firstprivate) OPENMP_PARALLEL_CLAUSE(shared) -// FIXME: clauses allowed for directive 'omp simd'. +// FIXME: more clauses allowed for directive 'omp simd'. +OPENMP_SIMD_CLAUSE(private) // Static attributes for 'default' clause. OPENMP_DEFAULT_KIND(none) diff --git a/clang/test/OpenMP/simd_ast_print.cpp b/clang/test/OpenMP/simd_ast_print.cpp index e51d5165e8d..7cdf131b084 100644 --- a/clang/test/OpenMP/simd_ast_print.cpp +++ b/clang/test/OpenMP/simd_ast_print.cpp @@ -7,17 +7,19 @@ #define HEADER void foo() {} - +int g_ind = 1; template<class T, class N> T reduct(T* arr, N num) { N i; N ind; + N myind; T sum = (T)0; // CHECK: T sum = (T)0; -#pragma omp simd -// CHECK-NEXT: #pragma omp simd +#pragma omp simd private(myind, g_ind) +// CHECK-NEXT: #pragma omp simd private(myind,g_ind) for (i = 0; i < num; ++i) { - T cur = arr[ind]; - ++ind; + myind = ind; + T cur = arr[myind]; + ind += g_ind; sum += cur; } } @@ -28,11 +30,14 @@ template<class T> struct S { {} T result(T *v) const { T res; + T val; // CHECK: T res; -#pragma omp simd -// CHECK-NEXT: #pragma omp simd +// CHECK: T val; +#pragma omp simd private(val) +// CHECK-NEXT: #pragma omp simd private(val) for (T i = 7; i < m_a; ++i) { - res = v[i-7] + m_a; + val = v[i-7] + m_a; + res = val; } return res; } @@ -51,10 +56,10 @@ int main (int argc, char **argv) { for (int i=0; i < 2; ++i)*a=2; // CHECK-NEXT: for (int i = 0; i < 2; ++i) // CHECK-NEXT: *a = 2; -#pragma omp simd +#pragma omp simd private(argc, b) for (int i = 0; i < 10; ++i) for (int j = 0; j < 10; ++j) {foo(); k1 += 8; k2 += 8;} -// CHECK-NEXT: #pragma omp simd +// CHECK-NEXT: #pragma omp simd private(argc,b) // CHECK-NEXT: for (int i = 0; i < 10; ++i) // CHECK-NEXT: for (int j = 0; j < 10; ++j) { // CHECK-NEXT: foo(); diff --git a/clang/test/OpenMP/simd_misc_messages.c b/clang/test/OpenMP/simd_misc_messages.c index aabcb02aefd..90a7bb441e3 100644 --- a/clang/test/OpenMP/simd_misc_messages.c +++ b/clang/test/OpenMP/simd_misc_messages.c @@ -59,6 +59,7 @@ void test_invalid_clause() void test_non_identifiers() { int i, x; + // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}} #pragma omp simd; for (i = 0; i < 16; ++i) ; @@ -66,8 +67,57 @@ void test_non_identifiers() // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}} #pragma omp simd firstprivate(x); for (i = 0; i < 16; ++i) ; + + // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}} + #pragma omp simd private(x); + for (i = 0; i < 16; ++i) ; + // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}} #pragma omp simd , private(x); for (i = 0; i < 16; ++i) ; } +void test_private() +{ + int i; + // expected-error@+2 {{expected expression}} + // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} + #pragma omp simd private( + for (i = 0; i < 16; ++i) ; + // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} + // expected-error@+1 2 {{expected expression}} + #pragma omp simd private(, + for (i = 0; i < 16; ++i) ; + // expected-error@+1 2 {{expected expression}} + #pragma omp simd private(,) + for (i = 0; i < 16; ++i) ; + // expected-error@+1 {{expected expression}} + #pragma omp simd private() + for (i = 0; i < 16; ++i) ; + // expected-error@+1 {{expected expression}} + #pragma omp simd private(int) + for (i = 0; i < 16; ++i) ; + // expected-error@+1 {{expected variable name}} + #pragma omp simd private(0) + for (i = 0; i < 16; ++i) ; + + int x, y, z; + #pragma omp simd private(x) + for (i = 0; i < 16; ++i) ; + #pragma omp simd private(x, y) + for (i = 0; i < 16; ++i) ; + #pragma omp simd private(x, y, z) + for (i = 0; i < 16; ++i) { + x = y * i + z; + } +} + +void test_firstprivate() +{ + int i; + // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}} + // expected-error@+2 {{unexpected OpenMP clause 'firstprivate' in directive '#pragma omp simd'}} + // expected-error@+1 {{expected expression}} + #pragma omp simd firstprivate( + for (i = 0; i < 16; ++i) ; +} |