Author: cbertol Date: Tue Jan 19 10:53:55 2016 New Revision: 258140 URL: http://llvm.org/viewvc/llvm-project?rev=258140&view=rev Log: Activate OpenMP private clause for target construct and a regression test.
Added: cfe/trunk/test/OpenMP/target_private_messages.cpp Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.def cfe/trunk/lib/Sema/SemaOpenMP.cpp Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.def?rev=258140&r1=258139&r2=258140&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/OpenMPKinds.def (original) +++ cfe/trunk/include/clang/Basic/OpenMPKinds.def Tue Jan 19 10:53:55 2016 @@ -346,6 +346,7 @@ OPENMP_ATOMIC_CLAUSE(seq_cst) OPENMP_TARGET_CLAUSE(if) OPENMP_TARGET_CLAUSE(device) OPENMP_TARGET_CLAUSE(map) +OPENMP_TARGET_CLAUSE(private) // Clauses allowed for OpenMP directive 'target data'. // TODO More clauses for 'target data' directive. Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=258140&r1=258139&r2=258140&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Tue Jan 19 10:53:55 2016 @@ -6475,7 +6475,7 @@ OMPClause *Sema::ActOnOpenMPPrivateClaus } SourceLocation ELoc = RefExpr->getExprLoc(); - // OpenMP [2.1, C/C++] + // OpenMP [3.1, C/C++] // A list item is a variable name. // OpenMP [2.9.3.3, Restrictions, p.1] // A variable that is part of another variable (as an array or Added: cfe/trunk/test/OpenMP/target_private_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_private_messages.cpp?rev=258140&view=auto ============================================================================== --- cfe/trunk/test/OpenMP/target_private_messages.cpp (added) +++ cfe/trunk/test/OpenMP/target_private_messages.cpp Tue Jan 19 10:53:55 2016 @@ -0,0 +1,121 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} +extern S1 a; +class S2 { + mutable int a; + +public: + S2() : a(0) {} +}; +const S2 b; +const S2 ba[5]; +class S3 { + int a; + +public: + S3() : a(0) {} +}; +const S3 ca[5]; +class S4 { + int a; + S4(); // expected-note {{implicitly declared private here}} + +public: + S4(int v) : a(v) {} +}; +class S5 { + int a; + S5() : a(0) {} // expected-note {{implicitly declared private here}} + +public: + S5(int v) : a(v) {} +}; + +S3 h; +#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} + +template <class I, class C> +int foomain(I argc, C **argv) { + I e(4); + I g(5); + int i; + int &j = i; +#pragma omp target private // expected-error {{expected '(' after 'private'}} +#pragma omp target private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +#pragma omp target private() // expected-error {{expected expression}} +#pragma omp target private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} +#pragma omp target private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +#pragma omp target private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} +#pragma omp target private(argc) +#pragma omp target private(S1) // expected-error {{'S1' does not refer to a value}} +#pragma omp target private(a, b) // expected-error {{private variable with incomplete type 'S1'}} +#pragma omp target private(argv[1]) // expected-error {{expected variable name}} +#pragma omp target private(e, g) +#pragma omp target private(h) // expected-error {{threadprivate or thread local variable cannot be private}} +#pragma omp target shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp target'}} +#pragma omp parallel + { + int v = 0; + int i; +#pragma omp target private(i) + {} + } +#pragma omp parallel shared(i) +#pragma omp parallel private(i) +#pragma omp target private(j) +#pragma omp target private(i) + {} + return 0; +} + +void bar(S4 a[2]) { +#pragma omp parallel +#pragma omp target private(a) + {} +} + +namespace A { +double x; +#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} +} +namespace B { +using A::x; +} + +int main(int argc, char **argv) { + S4 e(4); + S5 g(5); + int i; + int &j = i; +#pragma omp target private // expected-error {{expected '(' after 'private'}} +#pragma omp target private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +#pragma omp target private() // expected-error {{expected expression}} +#pragma omp target private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} +#pragma omp target private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +#pragma omp target private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} +#pragma omp target private(argc) +#pragma omp target private(S1) // expected-error {{'S1' does not refer to a value}} +#pragma omp target private(a, b) // expected-error {{private variable with incomplete type 'S1'}} +#pragma omp target private(argv[1]) // expected-error {{expected variable name}} +#pragma omp target private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} +#pragma omp target private(h) // expected-error {{threadprivate or thread local variable cannot be private}} +#pragma omp target private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}} +#pragma omp target shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp target'}} +#pragma omp parallel + { + int i; +#pragma omp target private(i) + {} + } +#pragma omp parallel shared(i) +#pragma omp parallel private(i) +#pragma omp target private(j) +#pragma omp target private(i) + {} + static int si; +#pragma omp target private(si) // OK + {} + return 0; +} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits