r258140 - Activate OpenMP private clause for target construct and a regression test.
Carlo Bertolli via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 19 08:53:55 PST 2016
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;
+}
+
More information about the cfe-commits
mailing list