blob: 83b0ad96d9ff3ab5a5be64a7c4e6c5a21eee8ee8 [file] [view] [edit]
<!--===- docs/OpenMPSupport.md
Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
See https://llvm.org/LICENSE.txt for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-->
# Flang OpenMP Support
```{raw} html
<style type="text/css">
.none { background-color: #FFCCCC }
.part { background-color: #FFFF99 }
.progress { background-color: #CCE5FF }
.good { background-color: #CCFF99 }
.none,
.part,
.progress,
.good {
border-radius: 0.25rem;
color: inherit;
display: inline-block;
font-weight: 600;
padding: 0.1rem 0.4rem;
white-space: nowrap;
}
table.docutils td p,
table.docutils th p,
table.docutils td,
table.docutils th {
text-align: left;
text-justify: auto;
word-spacing: normal;
}
</style>
```
This document outlines the OpenMP API features supported by Flang. It is
intended as a general reference. For the most accurate information on
unimplemented features, rely on the compiler’s TODO or “Not Yet Implemented”
messages, which are considered authoritative. Flang provides complete
implementation of the OpenMP 3.1 specification and partial implementation of
OpenMP 4.0. The sections below summarize support status for OpenMP 4.0, 5.0,
5.1, 5.2, 6.0, and future 6.1. The table entries are derived from the
information provided in the Version Differences subsection of the Features
History section in the OpenMP standard.
The Status column uses the following values:
- <span class="none">unclaimed</span> : No implementation is known to be underway.
- <span class="part">partial</span> : Some support exists, but important cases are still missing.
- <span class="progress">in progress</span> : Work is actively underway, or the implementation is available only experimentally.
- <span class="good">done</span> : The feature is considered implemented.
The OpenMP 4.0 section uses the historical `Feature/Status/Comments` format with
an added `Claimed By` column. OpenMP 5.0 and newer sections use
`Feature/Status/Claimed By/Notes/Reviews` to capture implementation state,
ownership, and upstream references. Use GitHub usernames in `Claimed By` (for
example `@alice`). Leave the cell blank when nobody has claimed the work.
This page is for OpenMP features that require changes in Flang compiler
components (parser, semantics, lowering, diagnostics) and that may additionally
entail corresponding runtime support. OpenMP features whose status does not
involve updates to the Flang compiler are tracked under the Clang OpenMP Support
page (`clang/docs/OpenMPSupport.rst`).
## Updating This Page
- When claiming a feature, set `Status` to <span class="progress">in progress</span> and add the GitHub username in `Claimed By`.
- When a GitHub PR is opened, add the PR link in `Reviews`. Keep the claimant listed until the work is finished or unclaimed.
- When support lands but remains incomplete, set `Status` to <span class="part">partial</span> and summarize the missing parser, semantics, lowering, diagnostics, or test work in `Notes`.
- When support is complete, set `Status` to <span class="good">done</span>. Clear `Claimed By` if no further follow-up is expected.
- When work is abandoned or not yet started, set `Status` to <span class="none">unclaimed</span>, remove the claimant, and keep `Notes` focused on the missing implementation work.
Note: In the OpenMP 4.0 section, no distinction is made between support in
Parser/Semantics, MLIR, Lowering, or the OpenMPIRBuilder.
## OpenMP 4.0
| Feature | Status | Claimed By | Comments |
|:-----------------------------------------------------------|:----------------------------------|:-----------|:--------------------------------------------------------|
| proc_bind clause | <span class="good">done</span> | | |
| simd construct | <span class="part">partial</span> | | Implicit linearization is skipped if iv is a pointer or allocatable|
| declare simd directive | <span class="part">partial</span> | chichunchen | Semantics coverage exists (for example `flang/test/Semantics/OpenMP/declarative-directive01.f90`) and lowering exists for key forms (for example `flang/test/Lower/OpenMP/declare-simd-interface-body.f90`), but coverage is not yet complete for all variants. |
| do simd construct | <span class="part">partial</span> | | Implicit linearization is skipped if iv is a pointer or allocatable |
| target data construct | <span class="good">done</span> | | |
| target construct | <span class="good">done</span> | | |
| target update construct | <span class="good">done</span> | | |
| declare target directive | <span class="good">done</span> | | |
| teams construct | <span class="good">done</span> | | |
| distribute construct | <span class="good">done</span> | | |
| distribute simd construct | <span class="part">partial</span> | | Implicit linearization is skipped if iv is a pointer or allocatable |
| distribute parallel loop construct | <span class="good">done</span> | | |
| distribute parallel loop simd construct | <span class="part">partial</span> | | Implicit linearization is skipped if iv is a pointer or allocatable |
| depend clause | <span class="good">done</span> | | |
| declare reduction directive | <span class="part">partial</span> | sshrestha-aa | Partial support, including user-defined reductions with derived types. |
| atomic construct extensions | <span class="good">done</span> | | |
| cancel construct | <span class="good">done</span> | | |
| cancellation point construct | <span class="good">done</span> | | |
| parallel do simd construct | <span class="part">partial</span> | | Implicit linearization is skipped if iv is a pointer or allocatable |
| target teams construct | <span class="good">done</span> | | |
| teams distribute construct | <span class="good">done</span> | | |
| teams distribute simd construct | <span class="part">partial</span> | | Implicit linearization is skipped if iv is a pointer or allocatable |
| target teams distribute construct | <span class="good">done</span> | | |
| teams distribute parallel loop construct | <span class="good">done</span> | | |
| target teams distribute parallel loop construct | <span class="good">done</span> | | |
| teams distribute parallel loop simd construct | <span class="part">partial</span> | | Implicit linearization is skipped if iv is a pointer or allocatable |
| target teams distribute parallel loop simd construct | <span class="part">partial</span> | | Implicit linearization is completely skipped |
| taskgroup construct | <span class="good">done</span> | | Semantics and lowering coverage exists (`flang/test/Semantics/OpenMP/taskgroup01.f90`, `flang/test/Lower/OpenMP/taskgroup.f90`). |
## OpenMP 4.5
| Feature | Status | Claimed By | Notes | Reviews |
|:--------|:-------|:-----------|:------|:--------|
| directive-name-modifier in if clause for combined constructs | <span class="good">done</span> | | Semantics and lowering coverage exists for all combined-construct if-modifier forms (`flang/test/Semantics/OpenMP/if-clause-45.f90`, `flang/test/Semantics/OpenMP/if-clause.f90`, `flang/test/Lower/OpenMP/if-clause.f90`). | [llvm/llvm-project#118128](https://github.com/llvm/llvm-project/pull/118128), [llvm/llvm-project#205164](https://github.com/llvm/llvm-project/pull/205164) |
| stand-alone ordered construct and source/sink depend types | <span class="part">partial</span> | dreachem | Semantics coverage exists (`flang/test/Semantics/OpenMP/ordered01.f90`, `flang/test/Semantics/OpenMP/do-ordered.f90`), and stand-alone ordered without depend lowers correctly (`flang/test/Lower/OpenMP/ordered-threads.f90`); lowering of `depend(source)` and `depend(sink:)` forms is explicitly TODO (`flang/test/Lower/OpenMP/Todo/ordered-depend.f90`). | [llvm/llvm-project#115396](https://github.com/llvm/llvm-project/pull/115396), [llvm/llvm-project#115397](https://github.com/llvm/llvm-project/pull/115397), [llvm/llvm-project#156693](https://github.com/llvm/llvm-project/pull/156693), [llvm/llvm-project#200193](https://github.com/llvm/llvm-project/pull/200193) |
| scalar variables implicitly firstprivate for target | <span class="good">done</span> | | Coverage exists for implicit DSA handling on target (`flang/test/Semantics/OpenMP/implicit-dsa.f90`, `flang/test/Lower/OpenMP/DelayedPrivatization/target-private-implicit-scalar-map.f90`). | [llvm/llvm-project#142783](https://github.com/llvm/llvm-project/pull/142783), [llvm/llvm-project#147442](https://github.com/llvm/llvm-project/pull/147442) |
| private, firstprivate, and defaultmap on target | <span class="good">done</span> | | Coverage exists across target privatization and defaultmap tests (`flang/test/Lower/OpenMP/defaultmap.f90`, `flang/test/Semantics/OpenMP/defaultmap-clause-v50.f90`). | [llvm/llvm-project#116506](https://github.com/llvm/llvm-project/pull/116506), [llvm/llvm-project#177715](https://github.com/llvm/llvm-project/pull/177715) |
| linear-modifier for linear clause | <span class="good">done</span> | chichunchen | val, ref, and uval modifier forms are covered in semantics and lowering (`flang/test/Semantics/OpenMP/linear-clause01.f90`-`linear-clause03.f90`, `flang/test/Lower/OpenMP/simd-linear.f90`). | [llvm/llvm-project#187142](https://github.com/llvm/llvm-project/pull/187142) |
| linear clause on worksharing-loop construct | <span class="good">done</span> | | Lowering coverage exists (`flang/test/Lower/OpenMP/wsloop-linear.f90`). | [llvm/llvm-project#139385](https://github.com/llvm/llvm-project/pull/139385), [llvm/llvm-project#182816](https://github.com/llvm/llvm-project/pull/182816) |
| is_device_ptr and use_device_ptr clauses | <span class="part">partial</span> | | `use_device_ptr` has semantics and lowering coverage (`flang/test/Semantics/OpenMP/use_device_ptr.f90`, `flang/test/Lower/OpenMP/use-device-ptr-to-use-device-addr.f90`). `is_device_ptr` has semantics coverage (`flang/test/Semantics/OpenMP/target01.f90`) but no dedicated lowering test. | [llvm/llvm-project#67290](https://github.com/llvm/llvm-project/pull/67290), [llvm/llvm-project#109810](https://github.com/llvm/llvm-project/pull/109810), [llvm/llvm-project#113919](https://github.com/llvm/llvm-project/pull/113919) |
| target enter data and target exit data constructs | <span class="good">done</span> | | Semantics and lowering coverage exists, including nowait and depend on these constructs (`flang/test/Semantics/OpenMP/device-constructs.f90`, `flang/test/Lower/OpenMP/target.f90`). | [llvm/llvm-project#71051](https://github.com/llvm/llvm-project/pull/71051), [llvm/llvm-project#81610](https://github.com/llvm/llvm-project/pull/81610) |
| simdlen clause on simd construct | <span class="good">done</span> | | Covered in simd lowering tests (`flang/test/Lower/OpenMP/simd.f90`, `flang/test/Lower/OpenMP/distribute-simd.f90`). | [llvm/llvm-project#97819](https://github.com/llvm/llvm-project/pull/97819) |
| simd clause on ordered construct | <span class="good">done</span> | sshrestha-aa | Semantics and lowering coverage exists (`flang/test/Semantics/OpenMP/ordered-simd.f90`, `flang/test/Lower/OpenMP/ordered-simd.f90`). | [llvm/llvm-project#183379](https://github.com/llvm/llvm-project/pull/183379) |
| priority clause for task construct | <span class="good">done</span> | | Semantics and lowering coverage exists (`flang/test/Semantics/OpenMP/clause-validity01.f90`, `flang/test/Lower/OpenMP/task.f90`). | [llvm/llvm-project#120710](https://github.com/llvm/llvm-project/pull/120710) |
| taskloop construct | <span class="part">partial</span> | | Tracked in the OpenMP 5.0 section (where combined forms and lowering gaps are noted). Semantics/lowering coverage exists for core forms. | [llvm/llvm-project#138646](https://github.com/llvm/llvm-project/pull/138646), [llvm/llvm-project#165851](https://github.com/llvm/llvm-project/pull/165851), [llvm/llvm-project#166751](https://github.com/llvm/llvm-project/pull/166751) |
| nowait and depend clauses on target construct | <span class="good">done</span> | | Lowering coverage exists for nowait and depend on target, target enter data, and target update (`flang/test/Lower/OpenMP/target.f90`). | [llvm/llvm-project#75345](https://github.com/llvm/llvm-project/pull/75345), [llvm/llvm-project#81610](https://github.com/llvm/llvm-project/pull/81610) |
| hint clause on critical construct | <span class="good">done</span> | | Semantics and lowering coverage exists (`flang/test/Semantics/OpenMP/critical-hint-clause.f90`, `flang/test/Lower/OpenMP/critical.f90`). | [llvm/llvm-project#136311](https://github.com/llvm/llvm-project/pull/136311) |
| target parallel, target parallel do, and target parallel do simd constructs | <span class="part">partial</span> | | Basic construct coverage exists in lowering (`flang/test/Lower/OpenMP/target.f90`, `flang/test/Lower/OpenMP/compound.f90`), but no dedicated lowering tests for these forms exist; simd implicit linearization gaps apply to the simd variant as for other simd-containing constructs. | [llvm/llvm-project#198783](https://github.com/llvm/llvm-project/pull/198783) |
## OpenMP 5.0
| Feature | Status | Claimed By | Notes | Reviews |
|:--------|:-------|:-----------|:------|:--------|
| compound taskloop constructs (taskloop simd, master taskloop, master taskloop simd) | <span class="part">partial</span> | | This row tracks OpenMP 5.0 compound taskloop forms, with semantics/lowering coverage in `flang/test/Semantics/OpenMP/taskloop-simd01.f90`, `flang/test/Lower/OpenMP/master_taskloop_simd.f90`, and related taskloop lowering tests; some compound-form lowering paths remain TODO. | [llvm/llvm-project#138646](https://github.com/llvm/llvm-project/pull/138646), [llvm/llvm-project#165851](https://github.com/llvm/llvm-project/pull/165851), [llvm/llvm-project#187222](https://github.com/llvm/llvm-project/pull/187222) |
| memory allocators | <span class="part">partial</span> | | Semantics coverage exists in `flang/test/Semantics/OpenMP/allocators01.f90`-`flang/test/Semantics/OpenMP/allocators07.f90`; lowering gaps remain (for example `flang/lib/Lower/OpenMP/OpenMP.cpp` TODO paths). | [llvm/llvm-project#165719](https://github.com/llvm/llvm-project/pull/165719), [llvm/llvm-project#187167](https://github.com/llvm/llvm-project/pull/187167) |
| allocate directive and allocate clause | <span class="part">partial</span> | | Semantics coverage exists in `flang/test/Semantics/OpenMP/allocate-directive.f90` and `flang/test/Semantics/OpenMP/allocate-clause01.f90`; lowering support expanded, with remaining TODO coverage (`flang/test/Lower/OpenMP/Todo/allocate-clause-align.f90`, `flang/test/Lower/OpenMP/Todo/allocate-clause-allocator.f90`). | [llvm/llvm-project#121356](https://github.com/llvm/llvm-project/pull/121356), [llvm/llvm-project#165719](https://github.com/llvm/llvm-project/pull/165719), [llvm/llvm-project#165865](https://github.com/llvm/llvm-project/pull/165865), [llvm/llvm-project#187167](https://github.com/llvm/llvm-project/pull/187167) |
| metadirective | <span class="part">partial</span> | chichunchen | Semantics coverage exists across selector categories (`flang/test/Semantics/OpenMP/metadirective-construct.f90`, `metadirective-user.f90`, `metadirective-implementation.f90`, `metadirective-device.f90`, `metadirective-loop-nest.f90`, `metadirective-loop-sequence.f90`, `metadirective-loop-applicability.f90`, `metadirective-common.f90`). Lowering coverage exists for construct, user-condition, implementation, device-kind/arch/isa selectors, and otherwise/default fallback (`flang/test/Lower/OpenMP/metadirective-construct.f90`, `metadirective-nothing.f90`, `metadirective-user.f90`, `metadirective-implementation.f90`, `metadirective-device-kind.f90`, `metadirective-device-arch.f90`, `metadirective-device-isa.f90`). Remaining lowering TODOs: `target_device` selector, clause/extension trait matching, declarative variants, and loop-associated variants (`flang/test/Lower/OpenMP/Todo/metadirective-target-device.f90`, `Todo/metadirective-structured-trait-property.f90`, `Todo/metadirective-declarative.f90`, `Todo/metadirective-loop.f90`). | [llvm/llvm-project#159945](https://github.com/llvm/llvm-project/pull/159945), [llvm/llvm-project#193664](https://github.com/llvm/llvm-project/pull/193664), [llvm/llvm-project#194402](https://github.com/llvm/llvm-project/pull/194402), [llvm/llvm-project#194424](https://github.com/llvm/llvm-project/pull/194424), [llvm/llvm-project#207088](https://github.com/llvm/llvm-project/pull/207088), [llvm/llvm-project#208844](https://github.com/llvm/llvm-project/pull/208844) |
| support full defaultmap functionality | <span class="part">partial</span> | | Core coverage exists (`flang/test/Lower/OpenMP/defaultmap.f90`, `flang/test/Semantics/OpenMP/defaultmap-clause-v50.f90`), but lowering has known partial paths (for example defaultmap-firstprivate TODO tests). | [llvm/llvm-project#135226](https://github.com/llvm/llvm-project/pull/135226), [llvm/llvm-project#166715](https://github.com/llvm/llvm-project/pull/166715), [llvm/llvm-project#167806](https://github.com/llvm/llvm-project/pull/167806), [llvm/llvm-project#177389](https://github.com/llvm/llvm-project/pull/177389), [llvm/llvm-project#190764](https://github.com/llvm/llvm-project/pull/190764) |
| clause: uses_allocators | <span class="part">partial</span> | | Parsing and semantic checking are supported for the OpenMP 5.2 syntax and for the pre-5.2 comma-separated list syntax, the latter accepted in 5.0/5.1, accepted with a deprecation warning in 5.2, and removed and rejected in 6.0 and later (`flang/test/Parser/OpenMP/uses-allocators.f90`, `flang/test/Semantics/OpenMP/uses-allocators.f90`, `flang/test/Semantics/OpenMP/uses-allocators-version60.f90`); lowering is unimplemented and reports a `not yet implemented` diagnostic (`flang/test/Lower/OpenMP/Todo/target-uses-allocators.f90`). Only a single clause-argument-specification is supported; the OpenMP 6.0 form that separates more than one specification with ';' is not parsed. | [llvm/llvm-project#213955](https://github.com/llvm/llvm-project/pull/213955) |
| clause: in_reduction | <span class="part">partial</span> | Saieiei | Semantics and lowering coverage exists for several task/taskgroup/taskloop forms (`flang/test/Semantics/OpenMP/in-reduction.f90`, `flang/test/Lower/OpenMP/task-inreduction.f90`, `flang/test/Lower/OpenMP/taskloop-inreduction.f90`, `flang/test/Lower/OpenMP/taskgroup-task_reduction02.f90`); some target-related forms remain TODO (for example `flang/test/Lower/OpenMP/Todo/target-inreduction.f90`). | [llvm/llvm-project#139704](https://github.com/llvm/llvm-project/pull/139704), [llvm/llvm-project#205124](https://github.com/llvm/llvm-project/pull/205124) |
| user-defined mappers | <span class="good">done</span> | | Supported with semantics/lowering/transform coverage. | [llvm/llvm-project#140560](https://github.com/llvm/llvm-project/pull/140560), [llvm/llvm-project#163860](https://github.com/llvm/llvm-project/pull/163860), [llvm/llvm-project#167903](https://github.com/llvm/llvm-project/pull/167903), [llvm/llvm-project#179936](https://github.com/llvm/llvm-project/pull/179936), [llvm/llvm-project#189136](https://github.com/llvm/llvm-project/pull/189136) |
| map array-section with implicit mapper | <span class="part">partial</span> | | Mapper and map coverage exists (`flang/test/Lower/OpenMP/map-mapper.f90`, `flang/test/Lower/OpenMP/target-data-skip-mapper-calls.f90`), with remaining iterator/modifier gaps in lowering (`flang/lib/Lower/OpenMP/ClauseProcessor.cpp` TODOs). | [llvm/llvm-project#175133](https://github.com/llvm/llvm-project/pull/175133), [llvm/llvm-project#177389](https://github.com/llvm/llvm-project/pull/177389) |
| clause: use_device_addr for target data | <span class="good">done</span> | | Supported for core forms. | [llvm/llvm-project#82834](https://github.com/llvm/llvm-project/pull/82834), [llvm/llvm-project#176815](https://github.com/llvm/llvm-project/pull/176815) |
| support non-contiguous array sections for target update | <span class="part">partial</span> | | Target update coverage exists (`flang/test/Semantics/OpenMP/target-update01.f90`, `flang/test/Semantics/OpenMP/target-update-mapper.f90`), with additional corner-case validation still ongoing. | [llvm/llvm-project#101538](https://github.com/llvm/llvm-project/pull/101538) |
| pointer attachment | <span class="part">partial</span> | | Pointer mapping coverage exists (`flang/test/Semantics/OpenMP/use_device_ptr.f90`, `flang/test/Lower/OpenMP/pointer-to-array.f90`), with descriptor and attach-related TODOs remaining in lowering. | [llvm/llvm-project#124019](https://github.com/llvm/llvm-project/pull/124019) |
| hints for the atomic construct | <span class="part">partial</span> | | Semantics coverage exists (`flang/test/Semantics/OpenMP/atomic-hint-clause.f90`) and lowering coverage exists for common atomic forms; compare/fail forms remain partial. | [llvm/llvm-project#137852](https://github.com/llvm/llvm-project/pull/137852), [llvm/llvm-project#136311](https://github.com/llvm/llvm-project/pull/136311) |
| conditional modifier for lastprivate clause | <span class="progress">in progress</span> | sshrestha-aa | Lastprivate lowering/semantics coverage exists for base forms, but no dedicated support coverage for the conditional modifier was identified in current Flang tests. | |
| task affinity | <span class="part">partial</span> | | Semantics and lowering coverage exists, including iterator-based affinity in task constructs (`flang/test/Semantics/OpenMP/affinity-clause.f90`, `flang/test/Lower/OpenMP/task-affinity.f90`). | [llvm/llvm-project#179003](https://github.com/llvm/llvm-project/pull/179003), [llvm/llvm-project#182222](https://github.com/llvm/llvm-project/pull/182222) |
| iterator modifier for depend clause | <span class="good">done</span> | | Semantics/lowering coverage exists (`flang/test/Lower/OpenMP/depend-iterator.f90`). | [llvm/llvm-project#189412](https://github.com/llvm/llvm-project/pull/189412) |
| scan directive and inscan modifier for reduction | <span class="part">partial</span> | chandraghale | Semantics and lowering coverage exists (`flang/test/Semantics/OpenMP/scan1.f90`, `flang/test/Semantics/OpenMP/scan2.f90`, `flang/test/Lower/OpenMP/scan.f90`), but breadth across all reduction combinations should continue to be validated. | [llvm/llvm-project#102792](https://github.com/llvm/llvm-project/pull/102792), [llvm/llvm-project#123254](https://github.com/llvm/llvm-project/pull/123254) |
| reduction and in_reduction clauses on taskloop | <span class="part">partial</span> | Saieiei | OpenMP taskloop reduction and in_reduction clause additions are tracked here. Taskloop reduction and in_reduction lowering coverage exists (`flang/test/Lower/OpenMP/taskloop-reduction.f90`, `flang/test/Lower/OpenMP/taskloop-inreduction.f90`), with remaining TODO coverage in some combinations. | [llvm/llvm-project#199670](https://github.com/llvm/llvm-project/pull/199670) |
| close modifier in map clause | <span class="part">partial</span> | | Close semantics are covered in targeted lowering tests (for example `flang/test/Lower/OpenMP/cptr-usm-close-and-use-device-ptr.f90`), with continued validation needed across broader mapping combinations. | [llvm/llvm-project#163258](https://github.com/llvm/llvm-project/pull/163258) |
| mapping Fortran pointer and allocatable variables | <span class="part">partial</span> | | Pointer/allocatable mapping coverage exists (`flang/test/Semantics/OpenMP/use_device_ptr.f90`, `flang/test/Lower/OpenMP/wsloop-reduction-allocatable.f90`, `flang/test/Lower/OpenMP/wsloop-reduction-pointer.f90`), but not all descriptor/attachment edge cases are complete. | [llvm/llvm-project#165714](https://github.com/llvm/llvm-project/pull/165714) |
| declare variant directive | <span class="part">partial</span> | chichunchen | Frontend semantics support is substantial (`flang/test/Semantics/OpenMP/declare-variant.f90`, `flang/test/Semantics/OpenMP/declare-variant-match.f90`), while lowering remains TODO-tracked (`flang/test/Lower/OpenMP/Todo/declare-variant.f90`). | [llvm/llvm-project#130578](https://github.com/llvm/llvm-project/pull/130578), [llvm/llvm-project#198799](https://github.com/llvm/llvm-project/pull/198799), [llvm/llvm-project#206714](https://github.com/llvm/llvm-project/pull/206714) |
| implicit declare target directive | <span class="none">unclaimed</span> | | No dedicated Flang parser/semantics/lowering coverage for implicit declare target handling was identified in current OpenMP test coverage. | |
| requires directive | <span class="part">partial</span> | | Frontend and lowering coverage exists (`flang/test/Semantics/OpenMP/requires01.f90`-`requires10.f90`, `flang/test/Lower/OpenMP/requires.f90`), but some clauses are still flagged as unsupported (for example reverse_offload warning path). | [llvm/llvm-project#204647](https://github.com/llvm/llvm-project/pull/204647) |
| teams construct on host | <span class="good">done</span> | | Teams support is established and exercised across semantics/lowering coverage in Flang OpenMP tests. | |
| loop construct and order(concurrent) clause | <span class="part">partial</span> | | Loop and order-related coverage exists (`flang/test/Semantics/OpenMP/compiler-directives-loop.f90`, `flang/test/Semantics/OpenMP/order-clause01.f90`, `flang/test/Lower/OpenMP/loop-directive.f90`, `flang/test/Lower/OpenMP/order-clause.f90`), with some transformations still evolving. | [llvm/llvm-project#169346](https://github.com/llvm/llvm-project/pull/169346), [llvm/llvm-project#208315](https://github.com/llvm/llvm-project/pull/208315) |
| collapsing imperfectly nested loops | <span class="good">done</span> | | Intervening code is emitted into the collapsed loop body, so it executes once per collapsed logical iteration. Semantics coverage in `flang/test/Semantics/OpenMP/do-collapse.f90`, lowering coverage in `flang/test/Lower/OpenMP/collapse-imperfect-nest.f90`. | [llvm/llvm-project#211000](https://github.com/llvm/llvm-project/pull/211000), [llvm/llvm-project#225159](https://github.com/llvm/llvm-project/pull/225159) |
| if clause and nontemporal clause on simd | <span class="part">partial</span> | | SIMD nontemporal coverage exists (`flang/test/Semantics/OpenMP/nontemporal.f90`), but complete OpenMP 5.0-level coverage for all if(simd)/nontemporal combinations remains incomplete. | [llvm/llvm-project#110015](https://github.com/llvm/llvm-project/pull/110015) |
| atomic in simd | <span class="none">unclaimed</span> | | No dedicated Flang OpenMP coverage for atomic-in-simd forms was identified in current parser/semantics/lowering tests. | |
| detach clause on task and omp_fulfill_event routine | <span class="good">done</span> | | Flang semantics and lowering coverage exists (`flang/test/Semantics/OpenMP/detach01.f90`, `flang/test/Semantics/OpenMP/detach02.f90`, `flang/test/Lower/OpenMP/task_detach.f90`); runtime routine is available in OpenMP module/runtime. | [llvm/llvm-project#119172](https://github.com/llvm/llvm-project/pull/119172), [llvm/llvm-project#119128](https://github.com/llvm/llvm-project/pull/119128) |
| taskloop construct can be canceled by cancel construct | <span class="part">partial</span> | | Dedicated lowering coverage exists (`flang/test/Lower/OpenMP/taskloop-cancel.f90`), and semantics checks include taskloop nesting constraints for cancel/cancellation-point. | [llvm/llvm-project#188071](https://github.com/llvm/llvm-project/pull/188071), [llvm/llvm-project#188070](https://github.com/llvm/llvm-project/pull/188070) |
| reverse offload | <span class="none">unclaimed</span> | | Flang currently emits an unsupported warning path for reverse_offload in requires handling (`flang/test/Semantics/OpenMP/requires01.f90`). | [llvm/llvm-project#204647](https://github.com/llvm/llvm-project/pull/204647) |
| depend clause on taskwait | <span class="part">partial</span> | | Lowering is explicitly TODO-tracked (`flang/test/Lower/OpenMP/Todo/taskwait-depend.f90`); runtime support exists in OpenMP runtime tests. | [llvm/llvm-project#111562](https://github.com/llvm/llvm-project/pull/111562) |
| acquire/release clauses on atomic and flush | <span class="part">partial</span> | | Memory-order lowering is complete for regular atomic (read/write/update/capture): all five orderings map to `mlir::omp::ClauseMemoryOrderKind` in `Atomic.cpp` and are exercised by non-TODO tests (`flang/test/Lower/OpenMP/atomic-read.f90`, `flang/test/Lower/OpenMP/atomic-mem-order-transform.f90`). Remaining gap: flush memory-order clauses (`acquire`, `release`, `acq_rel`, `seq_cst`) all hit `processTODO` in lowering and `mlir::omp::FlushOp` has no `memory_order` attribute yet (`flang/test/Lower/OpenMP/Todo/flush-seq-cst.f90`). | [llvm/llvm-project#199636](https://github.com/llvm/llvm-project/pull/199636), [llvm/llvm-project#114072](https://github.com/llvm/llvm-project/pull/114072) |
| mutexinoutset on depend clause | <span class="good">done</span> | | Semantics/lowering coverage exists for mutexinoutset depend handling (`flang/test/Semantics/OpenMP/depend06.f90`, `flang/test/Lower/OpenMP/task.f90`). | [llvm/llvm-project#114895](https://github.com/llvm/llvm-project/pull/114895), [llvm/llvm-project#120715](https://github.com/llvm/llvm-project/pull/120715) |
| depobj construct | <span class="part">partial</span> | | Semantics coverage exists for v5.0+ forms (`flang/test/Semantics/OpenMP/depobj-construct-v50.f90`), but lowering still has TODO paths (`flang/test/Lower/OpenMP/Todo/depobj-construct.f90`, `flang/test/Lower/OpenMP/Todo/depend-clause-depobj.f90`). | [llvm/llvm-project#114074](https://github.com/llvm/llvm-project/pull/114074), [llvm/llvm-project#116621](https://github.com/llvm/llvm-project/pull/116621), [llvm/llvm-project#173056](https://github.com/llvm/llvm-project/pull/173056), [llvm/llvm-project#203910](https://github.com/llvm/llvm-project/pull/203910) |
| combined master constructs (master taskloop, parallel master, parallel master taskloop, master taskloop simd, parallel master taskloop simd) | <span class="part">partial</span> | | Frontend/lowering coverage exists for multiple master combined forms (`flang/test/Lower/OpenMP/parallel-master.f90`, `flang/test/Lower/OpenMP/master_taskloop_simd.f90`, `flang/test/Lower/OpenMP/parallel-master-taskloop-simd.f90`) with additional completeness work tracked alongside taskloop combined forms. | [llvm/llvm-project#113893](https://github.com/llvm/llvm-project/pull/113893) |
## OpenMP 5.1
| Feature | Status | Claimed By | Notes | Reviews |
|:--------|:-------|:-----------|:------|:--------|
| compare clause on atomic construct | <span class="part">partial</span> | SunilKuravinakop | Semantics and lowering coverage exist (`flang/test/Semantics/OpenMP/atomic-compare.f90`, `flang/test/Lower/OpenMP/atomic-compare.f90`); remaining gaps are primarily fail/capture combinations and broader type coverage. | [llvm/llvm-project#184761](https://github.com/llvm/llvm-project/pull/184761) |
| fail clause on atomic construct | <span class="part">partial</span> | SunilKuravinakop | Semantics coverage exists (`flang/test/Semantics/OpenMP/atomic-compare.f90`), but lowering for `fail(...)` paths is still TODO (`flang/test/Lower/OpenMP/Todo/atomic-compare-fail.f90`). Complete lowering for compare+fail(+capture), then add non-TODO lowering tests. | [llvm/llvm-project#184761](https://github.com/llvm/llvm-project/pull/184761) |
| interop construct | <span class="part">partial</span> | sshrestha-aa | Semantics coverage exists (`flang/test/Semantics/OpenMP/interop-construct.f90`), but lowering remains TODO-tracked (`flang/lib/Lower/OpenMP/OpenMP.cpp` TODO: `OpenMPInteropConstruct`; `flang/test/Lower/OpenMP/Todo/interop-construct.f90`). | [llvm/llvm-project#132343](https://github.com/llvm/llvm-project/pull/132343) |
| dispatch construct | <span class="part">partial</span> | SunilKuravinakop | Semantics coverage exists (`flang/test/Semantics/OpenMP/dispatch.f90`), follow-on completeness work still in progress: Being implemented in 3 parts, MLIR support under review | [llvm/llvm-project#121982](https://github.com/llvm/llvm-project/pull/121982), [llvm/llvm-project#215877](https://github.com/llvm/llvm-project/pull/215877) |
| masked construct | <span class="part">partial</span> | | Covered in semantics/lowering (`flang/test/Semantics/OpenMP/masked.f90`, `flang/test/Lower/OpenMP/masked.f90`). | [llvm/llvm-project#91432](https://github.com/llvm/llvm-project/pull/91432) |
| masked combined constructs | <span class="part">partial</span> | | Covered in lowering tests (`flang/test/Lower/OpenMP/masked_taskloop.f90`, `flang/test/Lower/OpenMP/parallel-masked-taskloop.f90`) with ongoing breadth expansion. | [llvm/llvm-project#188071](https://github.com/llvm/llvm-project/pull/188071), [llvm/llvm-project#188070](https://github.com/llvm/llvm-project/pull/188070) |
| present map type modifier | <span class="part">partial</span> | | Semantics coverage exists (`flang/test/Semantics/OpenMP/present.f90`) and map lowering exists, with ongoing completeness checks. | [llvm/llvm-project#129586](https://github.com/llvm/llvm-project/pull/129586) |
| present modifier in motion clauses | <span class="part">partial</span> | | Motion/update coverage exists (`flang/test/Semantics/OpenMP/target-update01.f90`, `flang/test/Semantics/OpenMP/target-update-mapper.f90`), with ongoing completeness checks. | [llvm/llvm-project#114593](https://github.com/llvm/llvm-project/pull/114593), [llvm/llvm-project#117447](https://github.com/llvm/llvm-project/pull/117447), [llvm/llvm-project#129586](https://github.com/llvm/llvm-project/pull/129586) |
| present in defaultmap clause | <span class="part">partial</span> | | Defaultmap semantics coverage exists (`flang/test/Semantics/OpenMP/defaultmap-clause-v50.f90`), with ongoing completeness checks. | [llvm/llvm-project#116506](https://github.com/llvm/llvm-project/pull/116506) |
| thread_limit clause on target construct | <span class="part">partial</span> | | Lowering/semantics coverage exists for thread-limit dimensions (`flang/test/Lower/OpenMP/thread-limit-dims.f90`), with additional target interactions still under validation. | [llvm/llvm-project#171454](https://github.com/llvm/llvm-project/pull/171454), [llvm/llvm-project#171825](https://github.com/llvm/llvm-project/pull/171825) |
| has_device_addr clause on target construct | <span class="part">partial</span> | | Semantics/lowering coverage exists (`flang/test/Lower/OpenMP/has_device_addr-mapinfo.f90`) with ongoing validation for all mapping combinations. | [llvm/llvm-project#67290](https://github.com/llvm/llvm-project/pull/67290), [llvm/llvm-project#74187](https://github.com/llvm/llvm-project/pull/74187), [llvm/llvm-project#128568](https://github.com/llvm/llvm-project/pull/128568) |
| iterators in map or motion clauses | <span class="part">partial</span> | | Some iterator coverage exists (`flang/test/Lower/OpenMP/depend-iterator.f90`), but lowering still has explicit iterator TODOs in `flang/lib/Lower/OpenMP/ClauseProcessor.cpp`. | [llvm/llvm-project#189412](https://github.com/llvm/llvm-project/pull/189412) |
| omp_all_memory reserved locator for depend clause | <span class="part">partial</span> | | Locator parsing/semantics groundwork exists, with remaining TODO lowering coverage for reserved locator handling (`flang/test/Lower/OpenMP/Todo/locator-reserved.f90`). | [llvm/llvm-project#203910](https://github.com/llvm/llvm-project/pull/203910) |
| align clause on allocate directive and allocator/align modifiers on allocate clause | <span class="part">partial</span> | Saieiei | Allocate directive/clause support is present, but align-related lowering remains TODO-tracked (`flang/test/Lower/OpenMP/Todo/allocate-clause-align.f90`). | [llvm/llvm-project#121356](https://github.com/llvm/llvm-project/pull/121356), [llvm/llvm-project#165719](https://github.com/llvm/llvm-project/pull/165719) |
| target_device selector | <span class="part">partial</span> | | Semantics coverage exists for target_device selectors in metadirective/declare-variant matching (`flang/test/Semantics/OpenMP/metadirective-device.f90`, `flang/test/Semantics/OpenMP/declare-variant-match.f90`). | [llvm/llvm-project#123243](https://github.com/llvm/llvm-project/pull/123243), [llvm/llvm-project#206714](https://github.com/llvm/llvm-project/pull/206714) |
| adjust_args and append_args on declare variant | <span class="none">unclaimed</span> | | Parsing accepts forms, but semantics currently diagnose both clauses as not yet implemented (`flang/test/Semantics/OpenMP/declare-variant-match.f90`, `flang/test/Semantics/OpenMP/declare-variant.f90`). | [llvm/llvm-project#206714](https://github.com/llvm/llvm-project/pull/206714) |
| indirect clause on declare target | <span class="part">partial</span> | | Parser coverage exists (`flang/test/Parser/OpenMP/declare-target-indirect-tree.f90`), while lowering remains TODO-tracked (`flang/test/Lower/OpenMP/Todo/omp-clause-indirect.f90`). | [llvm/llvm-project#143505](https://github.com/llvm/llvm-project/pull/143505) |
| error directive | <span class="good">done</span> | cenewcombe | Semantics, lowering, and runtime support are complete. `at(compilation)` is diagnosed at compile time and `at(execution)` is reported at run time, on both the host and inside `target` regions. | [llvm/llvm-project#121509](https://github.com/llvm/llvm-project/pull/121509), [llvm/llvm-project#206175](https://github.com/llvm/llvm-project/pull/206175), [llvm/llvm-project#220702](https://github.com/llvm/llvm-project/pull/220702) |
| nothing directive | <span class="good">done</span> | | Parser and lowering coverage exists for standalone and metadirective-selected forms (`flang/test/Parser/OpenMP/nothing.f90`, `flang/test/Lower/OpenMP/nothing.f90`, `flang/test/Lower/OpenMP/metadirective-nothing.f90`). | [llvm/llvm-project#193664](https://github.com/llvm/llvm-project/pull/193664), [llvm/llvm-project#202679](https://github.com/llvm/llvm-project/pull/202679) |
| tile and unroll constructs | <span class="part">partial</span> | | Semantics coverage exists across tile/unroll and loop-transformation tests (`flang/test/Semantics/OpenMP/tile01.f90`, `flang/test/Semantics/OpenMP/tile09.f90`, `flang/test/Semantics/OpenMP/loop-transformation-construct01.f90`), with additional lowering/transform completeness work ongoing. The `full` and `partial` clauses on `unroll` are lowered (`flang/test/Lower/OpenMP/unroll-full01.f90`, `flang/test/Lower/OpenMP/unroll-partial01.f90`). | [llvm/llvm-project#160298](https://github.com/llvm/llvm-project/pull/160298), [llvm/llvm-project#185296](https://github.com/llvm/llvm-project/pull/185296), [llvm/llvm-project#188025](https://github.com/llvm/llvm-project/pull/188025) |
| scope construct | <span class="part">partial</span> | | Scope construct support is available, with follow-on completeness work still in progress for some combinations (see also OpenMP 5.2 scope-related rows). | [llvm/llvm-project#113700](https://github.com/llvm/llvm-project/pull/113700), [llvm/llvm-project#193098](https://github.com/llvm/llvm-project/pull/193098) |
| assumes directives | <span class="none">unclaimed</span> | | Lowering still has explicit TODO (`flang/lib/Lower/OpenMP/OpenMP.cpp` TODO: `OpenMP ASSUMES declaration`; `flang/test/Lower/OpenMP/Todo/assumes.f90`). | [llvm/llvm-project#102008](https://github.com/llvm/llvm-project/pull/102008) |
| assume directive | <span class="none">unclaimed</span> | | Lowering still has explicit TODO (`flang/lib/Lower/OpenMP/OpenMP.cpp` TODO: `OpenMP ASSUME construct`; `flang/test/Lower/OpenMP/Todo/assume.f90`). | [llvm/llvm-project#102008](https://github.com/llvm/llvm-project/pull/102008) |
| default(firstprivate) | <span class="good">done</span> | | Supported for `default(firstprivate)` clause forms, with semantics and lowering coverage (`flang/test/Semantics/OpenMP/default-clause.f90`, `flang/test/Lower/OpenMP/default-clause.f90`, `flang/test/Lower/OpenMP/default-clause-byref.f90`). | [D123930](https://reviews.llvm.org/D123930) |
| default(private) | <span class="part">partial</span> | | Semantics/default-clause coverage exists (`flang/test/Semantics/OpenMP/default.f90`, `flang/test/Semantics/OpenMP/default02.f90`) with ongoing lowering completeness checks. | [llvm/llvm-project#107586](https://github.com/llvm/llvm-project/pull/107586) |
| inoutset in depend clause | <span class="part">partial</span> | | Semantics coverage exists (`flang/test/Semantics/OpenMP/depend06.f90`) with broader lowering/runtime verification ongoing. | [llvm/llvm-project#114895](https://github.com/llvm/llvm-project/pull/114895), [llvm/llvm-project#120715](https://github.com/llvm/llvm-project/pull/120715) |
| nowait clause on taskwait | <span class="part">partial</span> | | Taskwait coverage exists (`flang/test/Semantics/OpenMP/taskwait.f90`, `flang/test/Lower/OpenMP/taskwait.f90`), with nowait+depend combinations still partial (`flang/test/Lower/OpenMP/Todo/taskwait-nowait.f90`). | [llvm/llvm-project#111562](https://github.com/llvm/llvm-project/pull/111562) |
| seq_cst clause on flush | <span class="part">partial</span> | | Semantics coverage exists for OpenMP 5.1 `flush seq_cst` (`flang/test/Semantics/OpenMP/flush02.f90`), but lowering for flush memory-order clauses is still TODO-tracked (`flang/test/Lower/OpenMP/Todo/flush-seq-cst.f90`; `mlir::omp::FlushOp` has no `memory_order` attribute yet). | [llvm/llvm-project#114072](https://github.com/llvm/llvm-project/pull/114072) |
| omp_atv_serialized and omp_atv_default values for alloctrait_key | <span class="none">unclaimed</span> | | No dedicated Flang parser/semantics/lowering coverage for these alloctrait values was identified in current OpenMP tests. | |
| strict modifier for taskloop construct | <span class="none">unclaimed</span> | | No dedicated parser/semantics/lowering coverage for the taskloop strict modifier was identified in current Flang OpenMP tests. | |
## OpenMP 5.2
| Feature | Status | Claimed By | Notes | Reviews |
|:--------|:-------|:-----------|:------|:--------|
| if clause on teams construct | <span class="good">done</span> | | Semantics and lowering coverage exists for teams-specific `if` forms, including combined teams variants (`flang/test/Semantics/OpenMP/if-clause.f90`, `flang/test/Semantics/OpenMP/if-clause-50.f90`, `flang/test/Lower/OpenMP/if-clause.f90`, `flang/test/Lower/OpenMP/teams.f90`). | [llvm/llvm-project#205164](https://github.com/llvm/llvm-project/pull/205164), [llvm/llvm-project#118128](https://github.com/llvm/llvm-project/pull/118128), [llvm/llvm-project#110015](https://github.com/llvm/llvm-project/pull/110015), [llvm/llvm-project#97819](https://github.com/llvm/llvm-project/pull/97819), [llvm/llvm-project#106207](https://github.com/llvm/llvm-project/pull/106207), [llvm/llvm-project#106211](https://github.com/llvm/llvm-project/pull/106211) |
| ompx and omx sentinel for implementation extensions in free/fixed source | <span class="part">partial</span> | | Extension semantics coverage exists for `ompx` forms (`flang/test/Semantics/OpenMP/ompx-bare.f90`), while broader sentinel coverage (including fixed-form `omx`) remains limited. | [llvm/llvm-project#111106](https://github.com/llvm/llvm-project/pull/111106) |
| allow copyprivate and nowait clause on starting directive of construct | <span class="good">done</span> | | Semantics coverage includes valid starting-directive uses (`!$omp single nowait`, `!$omp single copyprivate(...)`) in `flang/test/Semantics/OpenMP/single04.f90`. | [llvm/llvm-project#204339](https://github.com/llvm/llvm-project/pull/204339), [llvm/llvm-project#205607](https://github.com/llvm/llvm-project/pull/205607) |
| step modifier | <span class="none">unclaimed</span> | | Add parser+semantics acceptance/diagnostics for OpenMP 5.2 step-modifier forms, then add lowering coverage showing emitted loop metadata/ops for accepted cases. | |
| declare mapper iterator modifier | <span class="none">unclaimed</span> | | Parser and semantics should accept iterator-modified DECLARE MAPPER forms, then lowering must thread iterator bounds through map info generation (see related TODO test `flang/test/Lower/OpenMP/Todo/declare-mapper-iterator.f90`). | |
| present modifier in map clauses on declare mapper | <span class="none">unclaimed</span> | | Iterator coverage is tracked separately above; no dedicated present-modifier support coverage was identified for DECLARE MAPPER map clauses. | |
| enter clause replaces to clause on declare target | <span class="good">done</span> | | Semantics coverage exists for `declare target enter(...)` forms (`flang/test/Semantics/OpenMP/declare-target01.f90`, `flang/test/Semantics/OpenMP/requires05.f90`). | [llvm/llvm-project#110015](https://github.com/llvm/llvm-project/pull/110015) |
| otherwise clause on metadirectives | <span class="good">done</span> | | Lowering handles `OmpClause::Otherwise` as the fallback variant in `genMetadirective` (`flang/lib/Lower/OpenMP/OpenMP.cpp`); the legacy `default` clause spelling is also handled. | [llvm/llvm-project#194402](https://github.com/llvm/llvm-project/pull/194402), [llvm/llvm-project#194424](https://github.com/llvm/llvm-project/pull/194424) |
| doacross with omp_cur_iteration | <span class="progress">in progress</span> | dreachem | Implement parser/semantics validation for `omp_cur_iteration` placement and lowering of doacross dependence tokens, then add semantics+lowering tests for source/sink combinations. | |
| implicit map type for target enter and exit data | <span class="good">done</span> | | Target enter data applies implicit `to` mapping; target exit data applies implicit `from` mapping. Lowering via `getImplicitMapTypeAndKind` and MapInfoFinalization pass. Comprehensive test coverage in `target-enter-data-default-openmp52.f90` for OpenMP 5.2+ including allocatable descriptor handling. | [llvm/llvm-project#174665](https://github.com/llvm/llvm-project/pull/174665), [llvm/llvm-project#193851](https://github.com/llvm/llvm-project/pull/193851) |
| allocate and firstprivate on scope directive | <span class="part">partial</span> | | Firstprivate on scope is fully supported and tested (`scope.f90`). Host-side allocate clauses on scope use allocator-backed storage for fixed-size intrinsic scalar PRIVATE/FIRSTPRIVATE items with omitted/default/explicit allocator and ALIGN (`scope-allocate-clause.f90`, `openmp-scope-allocate-clause.mlir`), including SAVE entities and individually listed common-block members. Arrays, descriptors, pointers, allocatables, derived types, named common-block list items, and target/device scope allocation remain unsupported. | [llvm/llvm-project#193098](https://github.com/llvm/llvm-project/pull/193098) |
| loop consistency changes for order clause | <span class="none">unclaimed</span> | | Extend semantic loop-consistency checks for updated ORDER rules and add diagnostics tests for invalid nest/ordering combinations. | |
| keep original base pointer on map without matched candidate | <span class="none">unclaimed</span> | | Update map finalization so unmatched candidates preserve original base-pointer mapping semantics; add lowering tests for pointer-member mapping regressions. | |
| pure procedure support for certain directives | <span class="good">done</span> | ShashwathiNavada | Semantics enforce that metadirective, assumption directives (ASSUME/ASSUMES), NOTHING, ERROR, and the loop-transforming constructs TILE/UNROLL are permitted in a Fortran PURE procedure, in addition to the baseline of SIMD and declarative directives; other directives are rejected with a version-aware diagnostic. | [llvm/llvm-project#212676](https://github.com/llvm/llvm-project/pull/212676) |
| ALLOCATE statement support for allocators | <span class="none">unclaimed</span> | | Wire OpenMP allocator semantics into Fortran ALLOCATE statement handling and add semantics+lowering tests for allocator traits and error paths. | |
| dispatch extension supporting end directive | <span class="none">unclaimed</span> | | Base dispatch support is partial, and no dedicated support coverage for the OpenMP 5.2 dispatch end-directive extension was identified. | |
| minus operator deprecation handling | <span class="part">partial</span> | | Partially handled in semantic diagnostics; semantics checks diagnose minus operator usage in reductions (`flang/test/Semantics/OpenMP/reduction-subtract.f90`). | [llvm/llvm-project#192796](https://github.com/llvm/llvm-project/pull/192796) |
| linear clause syntax deprecation | <span class="none">unclaimed</span> | | Add semantic deprecation diagnostics with fix-it guidance and tests for accepted/deprecated spellings. | |
| map clause modifiers without commas (deprecation) | <span class="none">unclaimed</span> | | Add parser/semantics deprecation diagnostics for comma-less map modifiers and tests that verify warning text and accepted replacements. | |
| uses_allocators list syntax (deprecation) | <span class="part">partial</span> | | The comma-separated list syntax is accepted in OpenMP 5.0 and 5.1, accepted with a deprecation/portability warning in 5.2, and removed and rejected in 6.0 and later, where [6.0:B.2] removes all features deprecated in 5.0, 5.1 and 5.2 (`flang/test/Semantics/OpenMP/uses-allocators.f90`, `flang/test/Semantics/OpenMP/uses-allocators-version60.f90`); lowering of the clause is still unimplemented. | |
| default clause on metadirectives (deprecation) | <span class="none">unclaimed</span> | | Add dedicated metadirective deprecation diagnostics and tests for legacy/default-clause usage. | |
| destroy clause syntax on depobj (deprecation) | <span class="part">partial</span> | | Deprecation diagnostics are implemented (for example warning coverage in `flang/test/Semantics/OpenMP/depobj-construct-v52.f90`). | [llvm/llvm-project#114988](https://github.com/llvm/llvm-project/pull/114988) |
| source and sink task-dependence modifiers (deprecation) | <span class="part">partial</span> | | Deprecation diagnostics are implemented (for example warning coverage in `flang/test/Semantics/OpenMP/depobj-construct-v52.f90`). | [llvm/llvm-project#114988](https://github.com/llvm/llvm-project/pull/114988) |
| interop type position on init clause (deprecation) | <span class="none">unclaimed</span> | | Add parser+semantics deprecation diagnostics for legacy interop init type-position forms and tests showing canonical replacement. | |
## OpenMP 6.0
| Feature | Status | Claimed By | Notes | Reviews |
|:--------|:-------|:-----------|:------|:--------|
| threadset clause | <span class="part">partial</span> | | Frontend (parsing + semantics) and lowering coverage exists (`flang/test/Semantics/OpenMP/threadset-clause.f90`, `flang/test/Semantics/OpenMP/threadset-clause-v60.f90`, `flang/test/Lower/OpenMP/threadset.f90`); the clause is represented on `omp.task`/`omp.taskloop.context` and translated to the runtime free-agent task flag. | [llvm/llvm-project#169856](https://github.com/llvm/llvm-project/pull/169856) |
| groupprivate directive | <span class="part">partial</span> | | Semantics and lowering coverage exists (`flang/test/Semantics/OpenMP/groupprivate.f90`, `flang/test/Lower/OpenMP/groupprivate.f90`, `flang/test/Lower/OpenMP/groupprivate-modfile.f90`); lowering in non-teams contexts not fully handled. | [llvm/llvm-project#166199](https://github.com/llvm/llvm-project/pull/166199), [llvm/llvm-project#166214](https://github.com/llvm/llvm-project/pull/166214), [llvm/llvm-project#180934](https://github.com/llvm/llvm-project/pull/180934) |
| recording of task graphs | <span class="progress">in progress</span> | | Semantics coverage exists (`flang/test/Semantics/OpenMP/taskgraph.f90`). | |
| workdistribute construct | <span class="part">partial</span> | | Semantics/lowering/transform coverage exists (`flang/test/Semantics/OpenMP/workdistribute01.f90`, `flang/test/Lower/OpenMP/workdistribute.f90`, `flang/test/Transforms/OpenMP/lower-workdistribute-fission.mlir`) including `target teams` placement updates; some team-nesting combinations still intentionally diagnose as unsupported. | [llvm/llvm-project#154377](https://github.com/llvm/llvm-project/pull/154377), [llvm/llvm-project#154378](https://github.com/llvm/llvm-project/pull/154378), [llvm/llvm-project#140523](https://github.com/llvm/llvm-project/pull/140523), [llvm/llvm-project#199006](https://github.com/llvm/llvm-project/pull/199006) |
| map clause updates (v6.0 forms) | <span class="part">partial</span> | | Semantics coverage exists for v6.0 map-clause updates (`flang/test/Semantics/OpenMP/map-clause-v60.f90`; see `flang/lib/Semantics/check-omp-structure.cpp` updates in [#176810](https://github.com/llvm/llvm-project/pull/176810)). Lowering coverage is currently generic map lowering (`flang/test/Lower/OpenMP/target.f90`) plus a basic v6.0 test for no-modifier map form (`flang/test/Lower/OpenMP/map-no-modifier-v60.f90`), while dedicated lowering validation for v6.0-specific map-type forms remains incomplete. | [llvm/llvm-project#176810](https://github.com/llvm/llvm-project/pull/176810) |
| map modifier updates (v6.0 and v6.1 forms) | <span class="part">partial</span> | | Semantics coverage exists (`flang/test/Semantics/OpenMP/map-modifiers-v60.f90`, `flang/test/Semantics/OpenMP/map-modifiers-v61.f90`) with ongoing lowering completeness work. | [llvm/llvm-project#172080](https://github.com/llvm/llvm-project/pull/172080), [llvm/llvm-project#176810](https://github.com/llvm/llvm-project/pull/176810) |
| loop fusion transformation | <span class="good">done</span> | | Supported. | [llvm/llvm-project#161213](https://github.com/llvm/llvm-project/pull/161213) |
| loop construct with DO CONCURRENT | <span class="progress">in progress</span> | | Experimental support is available and under active development. | [llvm/llvm-project#178138](https://github.com/llvm/llvm-project/pull/178138), [llvm/llvm-project#190990](https://github.com/llvm/llvm-project/pull/190990) |
| optional argument for all clauses | <span class="part">partial</span> | | Semantics coverage exists across clause tests (for example `flang/test/Semantics/OpenMP/if-clause-50.f90`). | [llvm/llvm-project#205164](https://github.com/llvm/llvm-project/pull/205164) |
| canonical loop sequences | <span class="part">partial</span> | | Related loop/transform coverage exists (`flang/test/Semantics/OpenMP/loop-transformation-construct01.f90`, `flang/test/Lower/OpenMP/loop-directive.f90`). | [llvm/llvm-project#161213](https://github.com/llvm/llvm-project/pull/161213), [llvm/llvm-project#168884](https://github.com/llvm/llvm-project/pull/168884), [llvm/llvm-project#170734](https://github.com/llvm/llvm-project/pull/170734), [llvm/llvm-project#170735](https://github.com/llvm/llvm-project/pull/170735) |
| pure directives in DO CONCURRENT | <span class="good">done</span> | | Semantics enforce that OpenMP directives inside a DO CONCURRENT body must have the "pure" property. | [llvm/llvm-project#216642](https://github.com/llvm/llvm-project/pull/216642) |
| pure procedure support extended to more directives | <span class="good">done</span> | | Semantics extend the OpenMP 5.2 pure-procedure allow list with the newly added loop-transforming constructs and the scan directive. | [llvm/llvm-project#212676](https://github.com/llvm/llvm-project/pull/212676) |
| extensions to depobj construct | <span class="none">unclaimed</span> | | Semantics and deprecation diagnostics exist for several depobj forms, but extension support remains incomplete in lowering (for example `flang/test/Lower/OpenMP/Todo/depobj-construct.f90`). Implement lowering for extension operands/modifiers and add non-TODO lowering tests. | |
| extensions to atomic construct | <span class="part">partial</span> | | Atomic compare lowering is now available (`flang/test/Lower/OpenMP/atomic-compare.f90`), but fail/capture-related extension paths remain incomplete (`flang/test/Lower/OpenMP/Todo/atomic-compare-fail.f90`). | [llvm/llvm-project#184761](https://github.com/llvm/llvm-project/pull/184761) |
| clarifications to Fortran map semantics | <span class="none">unclaimed</span> | | Document each 6.0 clarification point against existing map finalization behavior, then add focused semantics/lowering regression tests for unresolved points. | |
## OpenMP 6.1 (Future / Experimental)
| Feature | Status | Claimed By | Notes | Reviews |
|:--------|:-------|:-----------|:------|:--------|
| dyn_groupprivate clause | <span class="progress">in progress</span> | mjklemm | Experimental and in progress (`flang/test/Semantics/OpenMP/dyn-groupprivate.f90`). | [llvm/llvm-project#166199](https://github.com/llvm/llvm-project/pull/166199), [llvm/llvm-project#166214](https://github.com/llvm/llvm-project/pull/166214) |
| dims strict behavior (multidimensional teams/leagues) | <span class="progress">in progress</span> | mjklemm | Experimental and in progress (`flang/test/Lower/OpenMP/thread-limit-dims.f90`). | [llvm/llvm-project#171454](https://github.com/llvm/llvm-project/pull/171454), [llvm/llvm-project#171767](https://github.com/llvm/llvm-project/pull/171767), [llvm/llvm-project#171825](https://github.com/llvm/llvm-project/pull/171825) |
| attach map-type modifier | <span class="part">partial</span> | | Parser/semantics/lowering coverage exists (`flang/test/Parser/OpenMP/map-modifiers-v61.f90`, `flang/test/Semantics/OpenMP/map-modifiers-v61.f90`, `flang/test/Lower/OpenMP/attach-and-ref-modifier.f90`); broader integration coverage across additional mapping contexts is still in progress. | [llvm/llvm-project#177715](https://github.com/llvm/llvm-project/pull/177715), [llvm/llvm-project#177301](https://github.com/llvm/llvm-project/pull/177301), [llvm/llvm-project#177302](https://github.com/llvm/llvm-project/pull/177302) |
| need_device_ptr modifier for adjust_args clause | <span class="none">unclaimed</span> | | Add parser+semantics support for modifier placement/rules, then lower adjust_args with device-pointer selection semantics and add end-to-end tests. | |
| fallback modifier for use_device_ptr clause | <span class="none">unclaimed</span> | | Add parser+semantics diagnostics and lowering behavior for fallback selection; add tests for fallback and non-fallback resolution paths. | |
| loop flatten transformation | <span class="none">unclaimed</span> | | Implement parser/semantics acceptance and lowering transform plumbing, then add transform/lowering tests demonstrating flattened loop mapping. | |
| loop grid and tile modifiers for sizes clause | <span class="none">unclaimed</span> | | Extend clause parsing/semantics for grid/tile size modifiers and add lowering tests showing generated loop partitioning metadata/ops. | |
## Extensions
### ATOMIC construct
The implementation of the ATOMIC construct follows OpenMP 6.0 with the following extensions:
- `x = x` is an allowed form of ATOMIC UPDATE.
This is motivated by the fact that the equivalent forms `x = x+0` or `x = x*1` are allowed.
- Explicit type conversions are allowed in ATOMIC READ, WRITE or UPDATE constructs, and in the capture statement in ATOMIC UPDATE CAPTURE.
The OpenMP spec requires intrinsic- or pointer-assignments, which include (as per the Fortran standard) implicit type conversions. Since such conversions need to be handled, allowing explicit conversions comes at no extra cost.
- A literal `.true.` or `.false.` is an allowed condition in ATOMIC UPDATE COMPARE. [1]
- A logical variable is an allowed form of the condition even if its value is not computed within the ATOMIC UPDATE COMPARE construct [1].
- `expr equalop x` is an allowed condition in ATOMIC UPDATE COMPARE. [1]
[1] Code generation for ATOMIC UPDATE COMPARE is not implemented yet.