From 2c84541a21f487aa25767993e72ae4309e81c521 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Mon, 15 May 2017 16:26:15 +0000 Subject: [PATCH] [OPENMP] Check DSA for variables captured by value. 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. llvm-svn: 303077 --- clang/lib/AST/Stmt.cpp | 2 +- clang/test/OpenMP/report_default_DSA.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 clang/test/OpenMP/report_default_DSA.cpp diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp index 69e65f5..2367cad 100644 --- a/clang/lib/AST/Stmt.cpp +++ b/clang/lib/AST/Stmt.cpp @@ -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/clang/test/OpenMP/report_default_DSA.cpp b/clang/test/OpenMP/report_default_DSA.cpp new file mode 100644 index 0000000..d14cd5c --- /dev/null +++ b/clang/test/OpenMP/report_default_DSA.cpp @@ -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; + } + } +} + -- 2.7.4