Fix assert during the call to getCanonicalDecl.
authorJennifer Yu <jennifer.yu@intel.com>
Tue, 2 Aug 2022 19:23:12 +0000 (12:23 -0700)
committerJennifer Yu <jennifer.yu@intel.com>
Wed, 3 Aug 2022 16:14:28 +0000 (09:14 -0700)
https://github.com/llvm/llvm-project/issues/56884

The root problem is in isOpenMPRebuildMemberExpr, it is only need to rebuild
for field expression.  No need for member function call.

The fix is to check field for member expression and skip rebuild for member
function call.

Differential Revision: https://reviews.llvm.org/D131024

clang/lib/Sema/SemaOpenMP.cpp
clang/test/OpenMP/parallel_default_messages.cpp

index dc1470b..a92fec6 100644 (file)
@@ -2270,6 +2270,9 @@ bool Sema::isInOpenMPTargetExecutionDirective() const {
 }
 
 bool Sema::isOpenMPRebuildMemberExpr(ValueDecl *D) {
+  // Only rebuild for Field.
+  if (!dyn_cast<FieldDecl>(D))
+    return false;
   DSAStackTy::DSAVarData DVarPrivate = DSAStack->hasDSA(
       D,
       [](OpenMPClauseKind C, bool AppliedToPointee,
index 7db15d7..65e0d92 100644 (file)
@@ -49,3 +49,10 @@ int main(int argc, char **argv) {
 
   return 0;
 }
+
+class A{
+  void a() {
+    #pragma omp parallel
+    a(b); // expected-error {{use of undeclared identifier 'b'}}
+ }
+};