[PATCH] D74970: [OpenMP] Refactor the analysis in checkMapClauseBaseExpression using StmtVisitor clause.

Alexey Bataev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 21 09:28:26 PST 2020


ABataev added inline comments.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15238
+  Sema &SemaRef;
+  OpenMPClauseKind CKind;
+  OMPClauseMappableExprCommon::MappableExprComponentList &Components;
----------------
Default initializer here


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15240
+  OMPClauseMappableExprCommon::MappableExprComponentList &Components;
+  bool NoDiagnose;
+  const Expr *RelevantExpr{nullptr};
----------------
Default initializer


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15241-15243
+  const Expr *RelevantExpr{nullptr};
+  bool AllowUnitySizeArraySection{true};
+  bool AllowWholeSizeArraySection{true};
----------------
Better to use ` = <init>;` here. Just a nit.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15258
+    if (!isa<VarDecl>(DRE->getDecl()))
+      return false;
+    RelevantExpr = DRE;
----------------
`emitErrorMsg()` here?


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15266
+  bool VisitMemberExpr(MemberExpr *ME) {
+    Expr *E = cast<Expr>(ME);
+    Expr *BaseE = ME->getBase()->IgnoreParenImpCasts();
----------------
No need `cast` here.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15267
+    Expr *E = cast<Expr>(ME);
+    Expr *BaseE = ME->getBase()->IgnoreParenImpCasts();
 
----------------
Better to use `IgnoreParenCasts()` to handle explicit casting to the base class.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15283
+        return false;
+      return Visit(E->IgnoreParenImpCasts());;
+    }
----------------
cchen wrote:
> @ABataev, in the previous patch you mentioned that we don't need `IgnoreParenImpCasts()` here, but I think I was just trying to do what line 15232 did.
Just `Visit(E)`


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15299
+        return false;
+      return Visit(E->IgnoreParenImpCasts());;
+    }
----------------
Just `Visit(E)`


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15317
       }
+      return Visit(E->IgnoreParenImpCasts());;
+    }
----------------
Just `Visit(E)`


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15332
+    Components.emplace_back(ME, FD);
+    return RelevantExpr || Visit(E->IgnoreParenImpCasts());
+  }
----------------
Just `Visit(E)`


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15344
       }
+      return Visit(E->IgnoreParenImpCasts());
+    }
----------------
`Visit(E)`


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15354
 
-      // Record the component.
-      CurComponents.emplace_back(CurE, FD);
-    } else if (auto *CurE = dyn_cast<ArraySubscriptExpr>(E)) {
-      E = CurE->getBase()->IgnoreParenImpCasts();
-
-      if (!E->getType()->isAnyPointerType() && !E->getType()->isArrayType()) {
-        if (!NoDiagnose) {
-          SemaRef.Diag(ELoc, diag::err_omp_expected_base_var_name)
-              << 0 << CurE->getSourceRange();
-          return nullptr;
+    if (const auto *TE = dyn_cast<CXXThisExpr>(E)) {
+      Expr::EvalResult Result;
----------------
`E->IgnoreParensCasts()`


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15356
+      Expr::EvalResult Result;
+      if (AE->getIdx()->EvaluateAsInt(Result, SemaRef.getASTContext())) {
+        if (!Result.Val.getInt().isNullValue()) {
----------------
Need to check that `AE->getIdx()` is not value dependent, otherwise it may crash


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15370
 
-      if (const auto *TE = dyn_cast<CXXThisExpr>(E)) {
-        Expr::EvalResult Result;
-        if (CurE->getIdx()->EvaluateAsInt(Result, SemaRef.getASTContext())) {
-          if (!Result.Val.getInt().isNullValue()) {
-            SemaRef.Diag(CurE->getIdx()->getExprLoc(),
-                         diag::err_omp_invalid_map_this_expr);
-            SemaRef.Diag(CurE->getIdx()->getExprLoc(),
-                         diag::note_omp_invalid_subscript_on_this_ptr_map);
-          }
-        }
-        RelevantExpr = TE;
-      }
-
-      // Record the component - we don't have any declaration associated.
-      CurComponents.emplace_back(CurE, nullptr);
-    } else if (auto *CurE = dyn_cast<OMPArraySectionExpr>(E)) {
-      assert(!NoDiagnose && "Array sections cannot be implicitly mapped.");
-      E = CurE->getBase()->IgnoreParenImpCasts();
+    return E && Visit(E->IgnoreParenImpCasts());
+  }
----------------
Just `Visit(E)`


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15419-15428
+      if (OASE->getLength()->EvaluateAsInt(ResultR,
+                                           SemaRef.getASTContext())) {
+        if (!ResultR.Val.getInt().isOneValue()) {
+          SemaRef.Diag(OASE->getLength()->getExprLoc(),
+                       diag::err_omp_invalid_map_this_expr);
+          SemaRef.Diag(OASE->getLength()->getExprLoc(),
+                       diag::note_omp_invalid_length_on_this_ptr_mapping);
----------------
Also, need to be sure that the expressions here are not value-dependent.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15444-15473
+  bool VisitUnaryOperator(UnaryOperator *UO) {
+    emitErrorMsg();
+    return false;
+  }
+  bool VisitCXXThisExpr(CXXThisExpr *CTE) {
+    return true;
+  }
----------------
Just add:
```
boo VisitStmt(Stmt *) {
  emitErrorMsg();
  return false;
}
```
instead of all these functions, returning `false` as a result.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15497-15499
+  } else {
+    return nullptr;
+  }
----------------
No need for `else` here, just unconditional `return nullptr`. 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74970/new/

https://reviews.llvm.org/D74970





More information about the cfe-commits mailing list