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

Mike Rice via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 17 08:18:45 PDT 2019


Author: mikerice
Date: Wed Jul 17 08:18:45 2019
New Revision: 366336

URL: http://llvm.org/viewvc/llvm-project?rev=366336&view=rev
Log:
[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


Modified:
    cfe/trunk/lib/Sema/SemaOpenMP.cpp
    cfe/trunk/test/OpenMP/for_loop_messages.cpp

Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=366336&r1=366335&r2=366336&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Wed Jul 17 08:18:45 2019
@@ -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;
   }

Modified: cfe/trunk/test/OpenMP/for_loop_messages.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_loop_messages.cpp?rev=366336&r1=366335&r2=366336&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/for_loop_messages.cpp (original)
+++ cfe/trunk/test/OpenMP/for_loop_messages.cpp Wed Jul 17 08:18:45 2019
@@ -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 at +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 at +4 2 {{expected loop invariant expression or '<invariant1> * ii + <invariant2>' kind of expression}}
 // expected-error at +3 {{expected loop invariant expression or '<invariant1> * TC::ii + <invariant2>' kind of expression}}




More information about the cfe-commits mailing list