[flang-commits] [flang] [FLANG][OpenMP] Handling pure directives in DO CONCURRENT (PR #216642)
via flang-commits
flang-commits at lists.llvm.org
Wed Aug 19 11:35:06 PDT 2026
================
@@ -972,13 +968,47 @@ void OmpStructureChecker::CheckDirectiveInPureProcedure(
}
if (pureSince != 0x7FFFFFFF) {
context_.Say(source,
- "The OpenMP directive '%s' is not allowed in a PURE procedure in %s, %s"_err_en_US,
- parser::omp::GetUpperName(id, version), ThisVersion(version),
+ "The OpenMP directive '%s' is not allowed in %s in %s, %s"_err_en_US,
+ parser::omp::GetUpperName(id, version), where, ThisVersion(version),
TryVersion(pureSince));
} else {
context_.Say(source,
- "The OpenMP directive '%s' is not allowed in a PURE procedure"_err_en_US,
- parser::omp::GetUpperName(id, version));
+ "The OpenMP directive '%s' is not allowed in %s"_err_en_US,
+ parser::omp::GetUpperName(id, version), where);
+ }
+}
+
+void OmpStructureChecker::CheckDirectiveInPureProcedure(
+ parser::CharBlock source, llvm::omp::Directive id) {
+ const Scope &scope{context_.FindScope(source)};
+ if (!FindPureProcedureContaining(scope)) {
+ return;
+ }
+ CheckDirectivePureSince(source, id, "a PURE procedure");
+}
+
+void OmpStructureChecker::CheckDirectiveInDoConcurrent(
+ parser::CharBlock source, llvm::omp::Directive id) {
+ // Look for any enclosing DO CONCURRENT, not just the nearest DO, since a
+ // plain DO nested inside DO CONCURRENT is still part of its body.
+ for (const LoopOrConstruct &c : llvm::reverse(constructStack_)) {
+ auto *doConstruct{std::get_if<const parser::DoConstruct *>(&c)};
+ if (!doConstruct || !(*doConstruct)->IsDoConcurrent()) {
+ continue;
+ }
+ unsigned version{context_.langOptions().OpenMPVersion};
+ if (!IsDoConcurrentLegal(version)) {
+ // Prior to OpenMP 6.0, no OpenMP directive, regardless of its "pure"
+ // property, was allowed inside a DO CONCURRENT construct.
+ context_.Say(source,
+ "The OpenMP directive '%s' is not allowed inside a DO CONCURRENT construct"_err_en_US,
----------------
kwyatt-ext wrote:
You use "inside a XXXXX" here. The other error goes to CheckDirectivePureSince which uses "in a XXXXX". Recommend changing this here to "in" for consistency.
https://github.com/llvm/llvm-project/pull/216642
More information about the flang-commits
mailing list