ABataev added inline comments.

================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:2053
+          D, [](OpenMPClauseKind K) -> bool { return K != OMPC_unknown; },
+          Level, /*NotLastprivate=*/true) &&
+      !DSAStack->isLoopControlVariable(D, Level).first) {
----------------
`/*NotLastprivate=*/true` is not needed here. Also, could you move it under 
control of the if statement above?


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:2185-2186
     if (DVarPrivate.CKind != OMPC_unknown ||
-        (VD && DSAStack->getDefaultDSA() == DSA_none))
+        (VD && (DSAStack->getDefaultDSA() == DSA_none ||
+                DSAStack->getDefaultDSA() == DSA_firstprivate)))
       return VD ? VD : cast<VarDecl>(DVarPrivate.PrivateCopy->getDecl());
----------------
Why do you need this check here? `getTopDSA` will return `OMPC_firstprivate` 
and one of the previous checks should be fired.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:3337
+      if (Stack->getDefaultDSA() == DSA_firstprivate &&
+          VD->getStorageClass() == SC_Static &&
+          (CanonicalVD->getDeclContext()->isNamespace() ||
----------------
1. You need to check that the variable is not a loop control variable here.
2. Seems to me you misinterpret the standard. According to the standard `An 
object whose identifier is declared without the storage-class specifier 
_Thread_local, and either with external or internal linkage or with the 
storage-class specifier static, has static storage duration.`. It means that 
non-static globals also must be affected since they have external linkage. So, 
you need to use `getStorageDuration()` function here and check that it returns 
`SD_Static`.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:3338-3339
+          VD->getStorageClass() == SC_Static &&
+          (CanonicalVD->getDeclContext()->isNamespace() ||
+           !VD->isLocalVarDeclOrParm())) {
+        VarsWithInheritedDSA[VD] = E;
----------------
I think just `CanonicalVD->getDeclContext()->isFileContext()` must be enough 
here.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:3344-3349
+      // Create implicit firstprivate variables as necessary under
+      // default(firstprivate).
+      if (Stack->getDefaultDSA() == DSA_firstprivate) {
+        ImplicitFirstprivate.push_back(E);
+        return;
+      }
----------------
This code must be somewhere later, otherwise, you're skipping a lot of checks 
for the target-based directives. This must be checked and processed when we 
request implicit data sharing attributes with `Stack->getImplicitDSA(VD, 
/*FromParent=*/false);`


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:12745
   }
+
   return Res;
----------------
Remove this empty line.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:12783-12787
+  if (getLangOpts().OpenMP < 51 && Kind == OMP_DEFAULT_firstprivate) {
+    Diag(StartLoc, diag::err_omp_invalid_dsa)
+        << getOpenMPClauseName(OMPC_firstprivate)
+        << getOpenMPClauseName(OMPC_default) << "5.1";
+  }
----------------
Usually, such checks are implemented in ParseOpenMP.cpp rather than in Sema.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D75591



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to