<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>
--- local: ---
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:
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).
Status to in progress and add the GitHub username in Claimed By.Reviews. Keep the claimant listed until the work is finished or unclaimed.Status to partial and summarize the missing parser, semantics, lowering, diagnostics, or test work in Notes.Status to done. Clear Claimed By if no further follow-up is expected.Status to unclaimed, 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.
| Feature | Status | Claimed By | Comments |
|---|---|---|---|
| proc_bind clause | done | ||
| simd construct | partial | Implicit linearization is skipped if iv is a pointer or allocatable | |
| declare simd directive | partial | 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 | partial | Implicit linearization is skipped if iv is a pointer or allocatable | |
| target data construct | done | ||
| target construct | done | ||
| target update construct | done | ||
| declare target directive | done | ||
| teams construct | done | ||
| distribute construct | done | ||
| distribute simd construct | partial | Implicit linearization is skipped if iv is a pointer or allocatable | |
| distribute parallel loop construct | done | ||
| distribute parallel loop simd construct | partial | Implicit linearization is skipped if iv is a pointer or allocatable | |
| depend clause | done | ||
| declare reduction directive | partial | sshrestha-aa | Partial support, including user-defined reductions with derived types. |
| atomic construct extensions | done | ||
| cancel construct | done | ||
| cancellation point construct | done | ||
| parallel do simd construct | partial | Implicit linearization is skipped if iv is a pointer or allocatable | |
| target teams construct | done | ||
| teams distribute construct | done | ||
| teams distribute simd construct | partial | Implicit linearization is skipped if iv is a pointer or allocatable | |
| target teams distribute construct | done | ||
| teams distribute parallel loop construct | done | ||
| target teams distribute parallel loop construct | done | ||
| teams distribute parallel loop simd construct | partial | Implicit linearization is skipped if iv is a pointer or allocatable | |
| target teams distribute parallel loop simd construct | partial | Implicit linearization is completely skipped | |
| taskgroup construct | done | Semantics and lowering coverage exists (flang/test/Semantics/OpenMP/taskgroup01.f90, flang/test/Lower/OpenMP/taskgroup.f90). |
| Feature | Status | Claimed By | Notes | Reviews |
|---|---|---|---|---|
| directive-name-modifier in if clause for combined constructs | done | 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, llvm/llvm-project#205164 | |
| stand-alone ordered construct and source/sink depend types | partial | 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, llvm/llvm-project#115397, llvm/llvm-project#156693, llvm/llvm-project#200193 |
| scalar variables implicitly firstprivate for target | done | 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, llvm/llvm-project#147442 | |
| private, firstprivate, and defaultmap on target | done | 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, llvm/llvm-project#177715 | |
| linear-modifier for linear clause | done | 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 |
| linear clause on worksharing-loop construct | done | Lowering coverage exists (flang/test/Lower/OpenMP/wsloop-linear.f90). | llvm/llvm-project#139385, llvm/llvm-project#182816 | |
| is_device_ptr and use_device_ptr clauses | partial | 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, llvm/llvm-project#109810, llvm/llvm-project#113919 | |
| target enter data and target exit data constructs | done | 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, llvm/llvm-project#81610 | |
| simdlen clause on simd construct | done | Covered in simd lowering tests (flang/test/Lower/OpenMP/simd.f90, flang/test/Lower/OpenMP/distribute-simd.f90). | llvm/llvm-project#97819 | |
| simd clause on ordered construct | done | 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 |
| priority clause for task construct | done | Semantics and lowering coverage exists (flang/test/Semantics/OpenMP/clause-validity01.f90, flang/test/Lower/OpenMP/task.f90). | llvm/llvm-project#120710 | |
| taskloop construct | partial | 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, llvm/llvm-project#165851, llvm/llvm-project#166751 | |
| nowait and depend clauses on target construct | done | 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, llvm/llvm-project#81610 | |
| hint clause on critical construct | done | Semantics and lowering coverage exists (flang/test/Semantics/OpenMP/critical-hint-clause.f90, flang/test/Lower/OpenMP/critical.f90). | llvm/llvm-project#136311 | |
| target parallel, target parallel do, and target parallel do simd constructs | partial | 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 |
| Feature | Status | Claimed By | Notes | Reviews |
|---|---|---|---|---|
| compound taskloop constructs (taskloop simd, master taskloop, master taskloop simd) | partial | 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, llvm/llvm-project#165851, llvm/llvm-project#187222 | |
| memory allocators | partial | 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, llvm/llvm-project#187167 | |
| allocate directive and allocate clause | partial | 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, llvm/llvm-project#165719, llvm/llvm-project#165865, llvm/llvm-project#187167 | |
| metadirective | partial | 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, llvm/llvm-project#193664, llvm/llvm-project#194402, llvm/llvm-project#194424, llvm/llvm-project#207088, llvm/llvm-project#208844 |
| support full defaultmap functionality | partial | 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, llvm/llvm-project#166715, llvm/llvm-project#167806, llvm/llvm-project#177389, llvm/llvm-project#190764 | |
| clause: uses_allocators | partial | 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 | |
| clause: in_reduction | partial | 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, llvm/llvm-project#205124 |
| user-defined mappers | done | Supported with semantics/lowering/transform coverage. | llvm/llvm-project#140560, llvm/llvm-project#163860, llvm/llvm-project#167903, llvm/llvm-project#179936, llvm/llvm-project#189136 | |
| map array-section with implicit mapper | partial | 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, llvm/llvm-project#177389 | |
| clause: use_device_addr for target data | done | Supported for core forms. | llvm/llvm-project#82834, llvm/llvm-project#176815 | |
| support non-contiguous array sections for target update | partial | 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 | |
| pointer attachment | partial | 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 | |
| hints for the atomic construct | partial | 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, llvm/llvm-project#136311 | |
| conditional modifier for lastprivate clause | in progress | 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 | partial | 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, llvm/llvm-project#182222 | |
| iterator modifier for depend clause | done | Semantics/lowering coverage exists (flang/test/Lower/OpenMP/depend-iterator.f90). | llvm/llvm-project#189412 | |
| scan directive and inscan modifier for reduction | partial | 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, llvm/llvm-project#123254 |
| reduction and in_reduction clauses on taskloop | partial | 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 |
| close modifier in map clause | partial | 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 | |
| mapping Fortran pointer and allocatable variables | partial | 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 | |
| declare variant directive | partial | 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, llvm/llvm-project#198799, llvm/llvm-project#206714 |
| implicit declare target directive | unclaimed | No dedicated Flang parser/semantics/lowering coverage for implicit declare target handling was identified in current OpenMP test coverage. | ||
| requires directive | partial | 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 | |
| teams construct on host | done | Teams support is established and exercised across semantics/lowering coverage in Flang OpenMP tests. | ||
| loop construct and order(concurrent) clause | partial | 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, llvm/llvm-project#208315 | |
| collapsing imperfectly nested loops | unclaimed | Current checks primarily diagnose non-perfect nests (for example flang/test/Semantics/OpenMP/do-collapse.f90), and no dedicated support for imperfect-nest collapsing was identified. | llvm/llvm-project#202435 | |
| if clause and nontemporal clause on simd | partial | 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 | |
| atomic in simd | unclaimed | 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 | done | 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, llvm/llvm-project#119128 | |
| taskloop construct can be canceled by cancel construct | partial | 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, llvm/llvm-project#188070 | |
| reverse offload | unclaimed | Flang currently emits an unsupported warning path for reverse_offload in requires handling (flang/test/Semantics/OpenMP/requires01.f90). | llvm/llvm-project#204647 | |
| depend clause on taskwait | partial | Lowering is explicitly TODO-tracked (flang/test/Lower/OpenMP/Todo/taskwait-depend.f90); runtime support exists in OpenMP runtime tests. | llvm/llvm-project#111562 | |
| acquire/release clauses on atomic and flush | partial | 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, llvm/llvm-project#114072 | |
| mutexinoutset on depend clause | done | Semantics/lowering coverage exists for mutexinoutset depend handling (flang/test/Semantics/OpenMP/depend06.f90, flang/test/Lower/OpenMP/task.f90). | llvm/llvm-project#114895, llvm/llvm-project#120715 | |
| depobj construct | partial | 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, llvm/llvm-project#116621, llvm/llvm-project#173056, llvm/llvm-project#203910 | |
| combined master constructs (master taskloop, parallel master, parallel master taskloop, master taskloop simd, parallel master taskloop simd) | partial | 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 |
| Feature | Status | Claimed By | Notes | Reviews |
|---|---|---|---|---|
| compare clause on atomic construct | partial | 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 |
| fail clause on atomic construct | partial | 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 |
| interop construct | partial | 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 |
| dispatch construct | partial | SunilKuravinakop | Semantics coverage exists (flang/test/Semantics/OpenMP/dispatch.f90), but lowering remains TODO-tracked (flang/lib/Lower/OpenMP/OpenMP.cpp TODO: OpenMPDispatchConstruct; flang/test/Lower/OpenMP/Todo/dispatch.f90). | llvm/llvm-project#121982 |
| masked construct | partial | Covered in semantics/lowering (flang/test/Semantics/OpenMP/masked.f90, flang/test/Lower/OpenMP/masked.f90). | llvm/llvm-project#91432 | |
| masked combined constructs | partial | 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, llvm/llvm-project#188070 | |
| present map type modifier | partial | Semantics coverage exists (flang/test/Semantics/OpenMP/present.f90) and map lowering exists, with ongoing completeness checks. | llvm/llvm-project#129586 | |
| present modifier in motion clauses | partial | 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, llvm/llvm-project#117447, llvm/llvm-project#129586 | |
| present in defaultmap clause | partial | Defaultmap semantics coverage exists (flang/test/Semantics/OpenMP/defaultmap-clause-v50.f90), with ongoing completeness checks. | llvm/llvm-project#116506 | |
| thread_limit clause on target construct | partial | 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, llvm/llvm-project#171825 | |
| has_device_addr clause on target construct | partial | Semantics/lowering coverage exists (flang/test/Lower/OpenMP/has_device_addr-mapinfo.f90) with ongoing validation for all mapping combinations. | llvm/llvm-project#67290, llvm/llvm-project#74187, llvm/llvm-project#128568 | |
| iterators in map or motion clauses | partial | 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 | |
| omp_all_memory reserved locator for depend clause | partial | 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 | |
| align clause on allocate directive and allocator/align modifiers on allocate clause | partial | 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, llvm/llvm-project#165719 |
| target_device selector | partial | 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, llvm/llvm-project#206714 | |
| adjust_args and append_args on declare variant | unclaimed | 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 | |
| indirect clause on declare target | partial | 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 | |
| error directive | partial | cenewcombe | Semantics coverage exists (flang/test/Semantics/OpenMP/error.f90), but lowering still has explicit TODO coverage (flang/test/Lower/OpenMP/Todo/error.f90). | llvm/llvm-project#121509, llvm/llvm-project#206175 |
| nothing directive | done | 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, llvm/llvm-project#202679 | |
| tile and unroll constructs | partial | 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, llvm/llvm-project#185296, llvm/llvm-project#188025 | |
| scope construct | partial | 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, llvm/llvm-project#193098 | |
| assumes directives | unclaimed | 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 | |
| assume directive | unclaimed | 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 | |
| default(firstprivate) | done | 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 | |
| default(private) | partial | 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 | |
| inoutset in depend clause | partial | Semantics coverage exists (flang/test/Semantics/OpenMP/depend06.f90) with broader lowering/runtime verification ongoing. | llvm/llvm-project#114895, llvm/llvm-project#120715 | |
| nowait clause on taskwait | partial | 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 | |
| seq_cst clause on flush | partial | 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 | |
| omp_atv_serialized and omp_atv_default values for alloctrait_key | unclaimed | No dedicated Flang parser/semantics/lowering coverage for these alloctrait values was identified in current OpenMP tests. | ||
| strict modifier for taskloop construct | unclaimed | No dedicated parser/semantics/lowering coverage for the taskloop strict modifier was identified in current Flang OpenMP tests. |
| Feature | Status | Claimed By | Notes | Reviews |
|---|---|---|---|---|
| if clause on teams construct | done | 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, llvm/llvm-project#118128, llvm/llvm-project#110015, llvm/llvm-project#97819, llvm/llvm-project#106207, llvm/llvm-project#106211 | |
| ompx and omx sentinel for implementation extensions in free/fixed source | partial | 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 | |
| allow copyprivate and nowait clause on starting directive of construct | done | Semantics coverage includes valid starting-directive uses (!$omp single nowait, !$omp single copyprivate(...)) in flang/test/Semantics/OpenMP/single04.f90. | llvm/llvm-project#204339, llvm/llvm-project#205607 | |
| step modifier | unclaimed | 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 | unclaimed | 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 | unclaimed | 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 | done | 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 | |
| otherwise clause on metadirectives | done | 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, llvm/llvm-project#194424 | |
| doacross with omp_cur_iteration | in progress | 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 | done | 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, llvm/llvm-project#193851 | |
| allocate and firstprivate on scope directive | partial | Firstprivate on scope is fully supported and tested (scope.f90). Allocate clause on scope is parsed/lowered to MLIR but not yet implemented in LLVM IR translation layer (checkImplementationStatus in OpenMPToLLVMIRTranslation.cpp blocks it). | llvm/llvm-project#193098 | |
| loop consistency changes for order clause | unclaimed | 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 | unclaimed | 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 | done | 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 |
| ALLOCATE statement support for allocators | unclaimed | 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 | unclaimed | 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 | partial | Partially handled in semantic diagnostics; semantics checks diagnose minus operator usage in reductions (flang/test/Semantics/OpenMP/reduction-subtract.f90). | llvm/llvm-project#192796 | |
| linear clause syntax deprecation | unclaimed | Add semantic deprecation diagnostics with fix-it guidance and tests for accepted/deprecated spellings. | ||
| map clause modifiers without commas (deprecation) | unclaimed | Add parser/semantics deprecation diagnostics for comma-less map modifiers and tests that verify warning text and accepted replacements. | ||
| uses_allocators list syntax (deprecation) | partial | 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) | unclaimed | Add dedicated metadirective deprecation diagnostics and tests for legacy/default-clause usage. | ||
| destroy clause syntax on depobj (deprecation) | partial | Deprecation diagnostics are implemented (for example warning coverage in flang/test/Semantics/OpenMP/depobj-construct-v52.f90). | llvm/llvm-project#114988 | |
| source and sink task-dependence modifiers (deprecation) | partial | Deprecation diagnostics are implemented (for example warning coverage in flang/test/Semantics/OpenMP/depobj-construct-v52.f90). | llvm/llvm-project#114988 | |
| interop type position on init clause (deprecation) | unclaimed | Add parser+semantics deprecation diagnostics for legacy interop init type-position forms and tests showing canonical replacement. |
| Feature | Status | Claimed By | Notes | Reviews |
|---|---|---|---|---|
| threadset clause | partial | Semantics coverage exists (flang/test/Semantics/OpenMP/threadset-clause.f90) with ongoing lowering/runtime validation. | llvm/llvm-project#169856 | |
| groupprivate directive | partial | 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, llvm/llvm-project#166214, llvm/llvm-project#180934 | |
| recording of task graphs | in progress | Semantics coverage exists (flang/test/Semantics/OpenMP/taskgraph.f90). | ||
| workdistribute construct | partial | 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, llvm/llvm-project#154378, llvm/llvm-project#140523, llvm/llvm-project#199006 | |
| map clause updates (v6.0 forms) | partial | 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). 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 | |
| map modifier updates (v6.0 and v6.1 forms) | partial | 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, llvm/llvm-project#176810 | |
| loop fusion transformation | done | Supported. | llvm/llvm-project#161213 | |
| loop construct with DO CONCURRENT | in progress | Experimental support is available and under active development. | llvm/llvm-project#178138, llvm/llvm-project#190990 | |
| optional argument for all clauses | partial | Semantics coverage exists across clause tests (for example flang/test/Semantics/OpenMP/if-clause-50.f90). | llvm/llvm-project#205164 | |
| canonical loop sequences | partial | Related loop/transform coverage exists (flang/test/Semantics/OpenMP/loop-transformation-construct01.f90, flang/test/Lower/OpenMP/loop-directive.f90). | llvm/llvm-project#161213, llvm/llvm-project#168884, llvm/llvm-project#170734, llvm/llvm-project#170735 | |
| pure directives in DO CONCURRENT | unclaimed | Define exact PURE+DO CONCURRENT directive legality in semantics and add lowering tests proving accepted forms remain side-effect safe. | ||
| pure procedure support extended to more directives | done | 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 | |
| extensions to depobj construct | unclaimed | 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 | partial | 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 | |
| clarifications to Fortran map semantics | unclaimed | Document each 6.0 clarification point against existing map finalization behavior, then add focused semantics/lowering regression tests for unresolved points. |
| Feature | Status | Claimed By | Notes | Reviews |
|---|---|---|---|---|
| dyn_groupprivate clause | in progress | mjklemm | Experimental and in progress (flang/test/Semantics/OpenMP/dyn-groupprivate.f90). | llvm/llvm-project#166199, llvm/llvm-project#166214 |
| dims strict behavior (multidimensional teams/leagues) | in progress | mjklemm | Experimental and in progress (flang/test/Lower/OpenMP/thread-limit-dims.f90). | llvm/llvm-project#171454, llvm/llvm-project#171767, llvm/llvm-project#171825 |
| attach map-type modifier | partial | 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, llvm/llvm-project#177301, llvm/llvm-project#177302 | |
| need_device_ptr modifier for adjust_args clause | unclaimed | 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 | unclaimed | Add parser+semantics diagnostics and lowering behavior for fallback selection; add tests for fallback and non-fallback resolution paths. | ||
| loop flatten transformation | unclaimed | 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 | unclaimed | Extend clause parsing/semantics for grid/tile size modifiers and add lowering tests showing generated loop partitioning metadata/ops. |
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..true. or .false. is an allowed condition in ATOMIC UPDATE COMPARE. [1]expr equalop x is an allowed condition in ATOMIC UPDATE COMPARE. [1][1] Code generation for ATOMIC UPDATE COMPARE is not implemented yet.