diff options
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 6 | ||||
-rw-r--r-- | clang/test/OpenMP/task_firstprivate_messages.cpp | 11 |
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 { |