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

Mike Rice via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 16 17:20:08 PDT 2019


mikerice created this revision.
mikerice added reviewers: ABataev, cfe-commits.
Herald added a subscriber: guansong.

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.


https://reviews.llvm.org/D64842

Files:
  clang/lib/Sema/SemaOpenMP.cpp
  clang/test/OpenMP/for_loop_messages.cpp


Index: clang/test/OpenMP/for_loop_messages.cpp
===================================================================
--- clang/test/OpenMP/for_loop_messages.cpp
+++ clang/test/OpenMP/for_loop_messages.cpp
@@ -626,6 +626,8 @@
 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 @@
   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}}
Index: clang/lib/Sema/SemaOpenMP.cpp
===================================================================
--- clang/lib/Sema/SemaOpenMP.cpp
+++ clang/lib/Sema/SemaOpenMP.cpp
@@ -4992,7 +4992,8 @@
   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;
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D64842.210226.patch
Type: text/x-patch
Size: 1508 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190717/955c1098/attachment.bin>


More information about the cfe-commits mailing list