summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2016-04-29 09:56:11 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2016-04-29 09:56:11 +0000
commit07b79c24c77ffbe73de920c592df9bcf7bc5104a (patch)
tree93178f10aea0dfbb3e875f6ef8c0bbaf20ae00c2
parente5966e7309515adf7859ff9c4aa9c10199fb1089 (diff)
downloadbcm5719-llvm-07b79c24c77ffbe73de920c592df9bcf7bc5104a.tar.gz
bcm5719-llvm-07b79c24c77ffbe73de920c592df9bcf7bc5104a.zip
[OPENMP] Fix detection of explicit data-sharing attributes in templates.
Fixes a bug with analysis of data-sharing attributes in templates. llvm-svn: 268020
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp6
-rw-r--r--clang/test/OpenMP/task_firstprivate_messages.cpp11
2 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 7ab511bd8f5..cbcf70b41fc 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -1416,6 +1416,9 @@ class DSAAttrChecker : public StmtVisitor<DSAAttrChecker, void> {
public:
void VisitDeclRefExpr(DeclRefExpr *E) {
+ if (E->isTypeDependent() || E->isValueDependent() ||
+ E->containsUnexpandedParameterPack() || E->isInstantiationDependent())
+ return;
if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) {
// Skip internally declared variables.
if (VD->isLocalVarDecl() && !CS->capturesVariable(VD))
@@ -1464,6 +1467,9 @@ public:
}
}
void VisitMemberExpr(MemberExpr *E) {
+ if (E->isTypeDependent() || E->isValueDependent() ||
+ E->containsUnexpandedParameterPack() || E->isInstantiationDependent())
+ return;
if (isa<CXXThisExpr>(E->getBase()->IgnoreParens())) {
if (auto *FD = dyn_cast<FieldDecl>(E->getMemberDecl())) {
auto DVar = Stack->getTopDSA(FD, false);
diff --git a/clang/test/OpenMP/task_firstprivate_messages.cpp b/clang/test/OpenMP/task_firstprivate_messages.cpp
index ef5f3856430..11d8c578987 100644
--- a/clang/test/OpenMP/task_firstprivate_messages.cpp
+++ b/clang/test/OpenMP/task_firstprivate_messages.cpp
@@ -7,6 +7,17 @@ bool foobool(int argc) {
return argc;
}
+template <typename T>
+struct S {
+ T b;
+ S(T a, T c) {
+#pragma omp task default(none) firstprivate(a, b)
+ a = b = c; // expected-error {{variable 'c' must have explicitly specified data sharing attributes}}
+ }
+};
+
+S<int> s(3, 4); // expected-note {{in instantiation of member function 'S<int>::S' requested here}}
+
struct S1; // expected-note {{declared here}} expected-note{{forward declaration of 'S1'}}
extern S1 a;
class S2 {
OpenPOWER on IntegriCloud