checkDecl is only valid for VarDecls or FieldDecls, since getCanonicalDecl
expects only these. Prevent other Decl kinds (such as CXXMethodDecls and
EnumConstantDecls) from entering and asserting.
Differential Revision: https://reviews.llvm.org/D64842
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@366336
91177308-0d34-0410-b5e6-
96231b3b80d8
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;
}
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}}
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}}