]> granicus.if.org Git - clang/commitdiff
[OPENMP] Check DSA for variables captured by value.
authorAlexey Bataev <a.bataev@hotmail.com>
Mon, 15 May 2017 16:26:15 +0000 (16:26 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Mon, 15 May 2017 16:26:15 +0000 (16:26 +0000)
Currently clang checks for default data sharing attributes only for
variables captured in OpenMP regions by reference. Patch adds checks for
variables captured by value.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@303077 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Stmt.cpp
test/OpenMP/report_default_DSA.cpp [new file with mode: 0644]

index 69e65f558f89972a710a00173c7c143b4bbeef55..2367cadf645c69170ed3268557b953c3b9187598 100644 (file)
@@ -1112,7 +1112,7 @@ void CapturedStmt::setCapturedRegionKind(CapturedRegionKind Kind) {
 
 bool CapturedStmt::capturesVariable(const VarDecl *Var) const {
   for (const auto &I : captures()) {
-    if (!I.capturesVariable())
+    if (!I.capturesVariable() && !I.capturesVariableByCopy())
       continue;
 
     // This does not handle variable redeclarations. This should be
diff --git a/test/OpenMP/report_default_DSA.cpp b/test/OpenMP/report_default_DSA.cpp
new file mode 100644 (file)
index 0000000..d14cd5c
--- /dev/null
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 %s
+
+void foo(int x, int n) {
+  double vec[n];
+  for (int iter = 0; iter < x; iter++) {
+#pragma omp target teams distribute parallel for map( \
+    from                                              \
+    : vec [0:n]) default(none)
+    // expected-error@+1 {{variable 'n' must have explicitly specified data sharing attributes}}
+    for (int ii = 0; ii < n; ii++) {
+      // expected-error@+3 {{variable 'iter' must have explicitly specified data sharing attributes}}
+      // expected-error@+2 {{variable 'vec' must have explicitly specified data sharing attributes}}
+      // expected-error@+1 {{variable 'x' must have explicitly specified data sharing attributes}}
+      vec[ii] = iter + ii + x;
+    }
+  }
+}
+