diff options
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 3 | ||||
-rw-r--r-- | clang/test/OpenMP/for_loop_messages.cpp | 8 |
2 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 222d042b6da..bd68011c18b 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -4992,7 +4992,8 @@ public: bool VisitMemberExpr(const MemberExpr *E) { if (isa<CXXThisExpr>(E->getBase()->IgnoreParens())) { const ValueDecl *VD = E->getMemberDecl(); - return checkDecl(E, VD); + if (isa<VarDecl>(VD) || isa<FieldDecl>(VD)) + return checkDecl(E, VD); } return false; } diff --git a/clang/test/OpenMP/for_loop_messages.cpp b/clang/test/OpenMP/for_loop_messages.cpp index 7c2663f6181..f5f6d0b7031 100644 --- a/clang/test/OpenMP/for_loop_messages.cpp +++ b/clang/test/OpenMP/for_loop_messages.cpp @@ -626,6 +626,8 @@ template <typename IT, int ST> class TC { int ii, iii, kk; public: + enum { myconstant = 42 }; + int ub(); int dotest_lt(IT begin, IT end) { #pragma omp parallel // expected-error@+3 3 {{the loop initializer expression depends on the current loop control variable}} @@ -634,6 +636,12 @@ public: for (ii = ii * 10 + 25; ii < ii / ii - 23; ii += 1) ; +// Check that member function calls and enum constants in the condition is +// handled. +#pragma omp for + for (ii = 0; ii < ub() + this->myconstant; ii += 1) // expected-no-error + ; + #pragma omp parallel // expected-error@+4 2 {{expected loop invariant expression or '<invariant1> * ii + <invariant2>' kind of expression}} // expected-error@+3 {{expected loop invariant expression or '<invariant1> * TC::ii + <invariant2>' kind of expression}} |