Эх сурвалжийг харах

[OPENMP]Fix crash in LoopCounterRefChecker when MemberExpr is not Var or Field

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
Mike Rice 6 жил өмнө
parent
commit
fdb5d4d9fc

+ 2 - 1
lib/Sema/SemaOpenMP.cpp

@@ -4992,7 +4992,8 @@ public:
   bool VisitMemberExpr(const MemberExpr *E) {
   bool VisitMemberExpr(const MemberExpr *E) {
     if (isa<CXXThisExpr>(E->getBase()->IgnoreParens())) {
     if (isa<CXXThisExpr>(E->getBase()->IgnoreParens())) {
       const ValueDecl *VD = E->getMemberDecl();
       const ValueDecl *VD = E->getMemberDecl();
-      return checkDecl(E, VD);
+      if (isa<VarDecl>(VD) || isa<FieldDecl>(VD))
+        return checkDecl(E, VD);
     }
     }
     return false;
     return false;
   }
   }

+ 8 - 0
test/OpenMP/for_loop_messages.cpp

@@ -626,6 +626,8 @@ template <typename IT, int ST>
 class TC {
 class TC {
   int ii, iii, kk;
   int ii, iii, kk;
 public:
 public:
+  enum { myconstant = 42 };
+  int ub();
   int dotest_lt(IT begin, IT end) {
   int dotest_lt(IT begin, IT end) {
 #pragma omp parallel
 #pragma omp parallel
 // expected-error@+3 3 {{the loop initializer expression depends on the current loop control variable}}
 // 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)
   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
 #pragma omp parallel
 // expected-error@+4 2 {{expected loop invariant expression or '<invariant1> * ii + <invariant2>' kind of expression}}
 // 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}}
 // expected-error@+3 {{expected loop invariant expression or '<invariant1> * TC::ii + <invariant2>' kind of expression}}