[PATCH] D72811: [WIP][OPENMP5.0] allow lvalue for motion clause

Alexey Bataev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 24 06:50:09 PST 2020


ABataev added inline comments.


================
Comment at: clang/lib/CodeGen/CGOpenMPRuntime.cpp:7711-7713
+                isa<OMPArraySectionExpr>(Next->getAssociatedExpression()) ||
+                isa<UnaryOperator>(Next->getAssociatedExpression()) ||
+                isa<ConditionalOperator>(Next->getAssociatedExpression())) &&
----------------
This must be updated, I assume. Instead need to check that it is an lvalue.


================
Comment at: clang/lib/CodeGen/CGOpenMPRuntime.cpp:7829
         if (EncounteredME) {
-          const auto *FD = dyn_cast<FieldDecl>(EncounteredME->getMemberDecl());
-          unsigned FieldIndex = FD->getFieldIndex();
-
-          // Update info about the lowest and highest elements for this struct
-          if (!PartialStruct.Base.isValid()) {
-            PartialStruct.LowestElem = {FieldIndex, LB};
-            PartialStruct.HighestElem = {FieldIndex, LB};
-            PartialStruct.Base = BP;
-          } else if (FieldIndex < PartialStruct.LowestElem.first) {
-            PartialStruct.LowestElem = {FieldIndex, LB};
-          } else if (FieldIndex > PartialStruct.HighestElem.first) {
-            PartialStruct.HighestElem = {FieldIndex, LB};
+          // MemberExpr can also be FunctionDecl after we allow all lvalue
+          if (const auto *FD =
----------------
Here we should not have any functiondecls. Must be an assert.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15212
+    DRE = E;
+    const auto *VD = dyn_cast<VarDecl>(E->getDecl());
+    const auto *FD = dyn_cast<FieldDecl>(E->getDecl());
----------------
I don't think anything except for VarDecls must be allowed here.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15235
+  bool VisitUnaryOperator(UnaryOperator *UO) {
+    DerefCnt++;
+    CurComponents.emplace_back(UO, nullptr);
----------------
Need a check that this is a dereference op. Also, maybe allow using an addr_of operation?


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15244-15245
+  }
+  // checkMapClauseExpressionBase has already added the CurComponents, and we
+  // didn't clean it up, so don't add it here
+  bool VisitArraySubscriptExpr(ArraySubscriptExpr *AE) {
----------------
Why you have all these comments here?


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15267-15271
+    Expr *LE = BO->getLHS()->IgnoreParenImpCasts();
+    Expr *RE = BO->getRHS()->IgnoreParenImpCasts();
+    if (LE && Visit(LE) && RE && Visit(RE)) {
+      return true;
+    }
----------------
Some extra checks for the allowed operators are required.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15276
+    for (Stmt *Child : S->children()) {
+      if (Child && Visit(Child))
+        return true;
----------------
I would add a check that the child is and expression and not a glvalue, then do not analyze it.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15281
+  }
+  DeclRefExpr *GetDRE() const { return DRE; }
+  explicit LocatorChecker(
----------------
`getFoundBase` or something like this?


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15283
+  explicit LocatorChecker(
+      OMPClauseMappableExprCommon::MappableExprComponentList &CurComponents)
+      : CurComponents(CurComponents), DerefCnt(0) {}
----------------
Why do you need components list here?


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15347
+      if (!(isa<VarDecl>(CurE->getDecl()) ||
+            isa<FunctionDecl>(CurE->getDecl())))
         return nullptr;
----------------
FunctionDecls should not be allowed here


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15369
+      if (!isa<FieldDecl>(CurE->getMemberDecl()) &&
+          !isa<CXXMethodDecl>(CurE->getMemberDecl())) {
         if (!NoDiagnose) {
----------------
Same here, no function decls


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:15535
     } else {
+      if (OrigExpr->IgnoreParenImpCasts()->isLValue()) {
+        LocatorChecker Checker(CurComponents);
----------------
Why are using `IgnoreParenImpCasts()` here? It drops implicit casts to RValue.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:16007
+    if (!RE->IgnoreParenImpCasts()->isLValue() &&
+        (MLValue != clang::Expr::isModifiableLvalueResult::MLV_LValueCast)) {
       SemaRef.Diag(ELoc,
----------------
Why `MLV_LValueCast` must be allowed here?


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:16009
       SemaRef.Diag(ELoc,
                    diag::err_omp_expected_named_var_member_or_array_expression)
           << RE->getSourceRange();
----------------
Message should be updated too.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:16057
     const auto *FD = dyn_cast<FieldDecl>(CurDeclaration);
+    const auto *FuncD = dyn_cast<FunctionDecl>(CurDeclaration);
 
----------------
Again, functiondecls must not be allowed here. I would suggest emitting a warning for them (that user mapped a function) a drop them from the mapping list.


================
Comment at: clang/test/OpenMP/target_teams_map_messages.cpp:437
 #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}}
-#pragma omp target data map(tofrom: argc > 0 ? x : y) // expected-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}}
+#pragma omp target data map(tofrom: argc > 0 ? x : y)
 #pragma omp target data map(argc)
----------------
Not sure that this must be supported. What is the base decl here, `x` or `y`?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D72811





More information about the cfe-commits mailing list