Flang OpenMP Support

<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:

  • unclaimed : No implementation is known to be underway.
  • partial : Some support exists, but important cases are still missing.
  • in progress : Work is actively underway, or the implementation is available only experimentally.
  • done : 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 in progress 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 partial and summarize the missing parser, semantics, lowering, diagnostics, or test work in Notes.
  • When support is complete, set Status to done. Clear Claimed By if no further follow-up is expected.
  • When work is abandoned or not yet started, set 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.

OpenMP 4.0

FeatureStatusClaimed ByComments
proc_bind clausedone
simd constructpartialImplicit linearization is skipped if iv is a pointer or allocatable
declare simd directivepartialchichunchenSemantics 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 constructpartialImplicit linearization is skipped if iv is a pointer or allocatable
target data constructdone
target constructdone
target update constructdone
declare target directivedone
teams constructdone
distribute constructdone
distribute simd constructpartialImplicit linearization is skipped if iv is a pointer or allocatable
distribute parallel loop constructdone
distribute parallel loop simd constructpartialImplicit linearization is skipped if iv is a pointer or allocatable
depend clausedone
declare reduction directivepartialsshrestha-aaPartial support, including user-defined reductions with derived types.
atomic construct extensionsdone
cancel constructdone
cancellation point constructdone
parallel do simd constructpartialImplicit linearization is skipped if iv is a pointer or allocatable
target teams constructdone
teams distribute constructdone
teams distribute simd constructpartialImplicit linearization is skipped if iv is a pointer or allocatable
target teams distribute constructdone
teams distribute parallel loop constructdone
target teams distribute parallel loop constructdone
teams distribute parallel loop simd constructpartialImplicit linearization is skipped if iv is a pointer or allocatable
target teams distribute parallel loop simd constructpartialImplicit linearization is completely skipped
taskgroup constructdoneSemantics and lowering coverage exists (flang/test/Semantics/OpenMP/taskgroup01.f90, flang/test/Lower/OpenMP/taskgroup.f90).

OpenMP 4.5

FeatureStatusClaimed ByNotesReviews
directive-name-modifier in if clause for combined constructsdoneSemantics 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 typespartialdreachemSemantics 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 targetdoneCoverage 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 targetdoneCoverage 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 clausedonechichunchenval, 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 constructdoneLowering coverage exists (flang/test/Lower/OpenMP/wsloop-linear.f90).llvm/llvm-project#139385, llvm/llvm-project#182816
is_device_ptr and use_device_ptr clausespartialuse_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 constructsdoneSemantics 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 constructdoneCovered 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 constructdonesshrestha-aaSemantics 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 constructdoneSemantics and lowering coverage exists (flang/test/Semantics/OpenMP/clause-validity01.f90, flang/test/Lower/OpenMP/task.f90).llvm/llvm-project#120710
taskloop constructpartialTracked 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 constructdoneLowering 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 constructdoneSemantics 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 constructspartialBasic 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

OpenMP 5.0

FeatureStatusClaimed ByNotesReviews
compound taskloop constructs (taskloop simd, master taskloop, master taskloop simd)partialThis 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 allocatorspartialSemantics 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 clausepartialSemantics 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
metadirectivepartialchichunchenSemantics 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 functionalitypartialCore 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_allocatorspartialParsing 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_reductionpartialSaieieiSemantics 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 mappersdoneSupported 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 mapperpartialMapper 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 datadoneSupported for core forms.llvm/llvm-project#82834, llvm/llvm-project#176815
support non-contiguous array sections for target updatepartialTarget 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 attachmentpartialPointer 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 constructpartialSemantics 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 clausein progresssshrestha-aaLastprivate lowering/semantics coverage exists for base forms, but no dedicated support coverage for the conditional modifier was identified in current Flang tests.
task affinitypartialSemantics 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 clausedoneSemantics/lowering coverage exists (flang/test/Lower/OpenMP/depend-iterator.f90).llvm/llvm-project#189412
scan directive and inscan modifier for reductionpartialchandraghaleSemantics 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 tasklooppartialSaieieiOpenMP 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 clausepartialClose 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 variablespartialPointer/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 directivepartialchichunchenFrontend 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 directiveunclaimedNo dedicated Flang parser/semantics/lowering coverage for implicit declare target handling was identified in current OpenMP test coverage.
requires directivepartialFrontend 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 hostdoneTeams support is established and exercised across semantics/lowering coverage in Flang OpenMP tests.
loop construct and order(concurrent) clausepartialLoop 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 loopsunclaimedCurrent 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 simdpartialSIMD 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 simdunclaimedNo 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 routinedoneFlang 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 constructpartialDedicated 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 offloadunclaimedFlang 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 taskwaitpartialLowering 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 flushpartialMemory-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 clausedoneSemantics/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 constructpartialSemantics 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)partialFrontend/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

OpenMP 5.1

FeatureStatusClaimed ByNotesReviews
compare clause on atomic constructpartialSunilKuravinakopSemantics 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 constructpartialSunilKuravinakopSemantics 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 constructpartialsshrestha-aaSemantics 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 constructpartialSunilKuravinakopSemantics 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 constructpartialCovered in semantics/lowering (flang/test/Semantics/OpenMP/masked.f90, flang/test/Lower/OpenMP/masked.f90).llvm/llvm-project#91432
masked combined constructspartialCovered 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 modifierpartialSemantics coverage exists (flang/test/Semantics/OpenMP/present.f90) and map lowering exists, with ongoing completeness checks.llvm/llvm-project#129586
present modifier in motion clausespartialMotion/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 clausepartialDefaultmap semantics coverage exists (flang/test/Semantics/OpenMP/defaultmap-clause-v50.f90), with ongoing completeness checks.llvm/llvm-project#116506
thread_limit clause on target constructpartialLowering/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 constructpartialSemantics/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 clausespartialSome 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 clausepartialLocator 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 clausepartialSaieieiAllocate 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 selectorpartialSemantics 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 variantunclaimedParsing 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 targetpartialParser 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 directivepartialcenewcombeSemantics 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 directivedoneParser 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 constructspartialSemantics 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 constructpartialScope 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 directivesunclaimedLowering 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 directiveunclaimedLowering 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)doneSupported 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)partialSemantics/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 clausepartialSemantics 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 taskwaitpartialTaskwait 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 flushpartialSemantics 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_keyunclaimedNo dedicated Flang parser/semantics/lowering coverage for these alloctrait values was identified in current OpenMP tests.
strict modifier for taskloop constructunclaimedNo dedicated parser/semantics/lowering coverage for the taskloop strict modifier was identified in current Flang OpenMP tests.

OpenMP 5.2

FeatureStatusClaimed ByNotesReviews
if clause on teams constructdoneSemantics 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 sourcepartialExtension 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 constructdoneSemantics 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 modifierunclaimedAdd 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 modifierunclaimedParser 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 mapperunclaimedIterator 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 targetdoneSemantics 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 metadirectivesdoneLowering 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_iterationin progressdreachemImplement 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 datadoneTarget 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 directivepartialFirstprivate 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 clauseunclaimedExtend 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 candidateunclaimedUpdate map finalization so unmatched candidates preserve original base-pointer mapping semantics; add lowering tests for pointer-member mapping regressions.
pure procedure support for certain directivesdoneShashwathiNavadaSemantics 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 allocatorsunclaimedWire OpenMP allocator semantics into Fortran ALLOCATE statement handling and add semantics+lowering tests for allocator traits and error paths.
dispatch extension supporting end directiveunclaimedBase dispatch support is partial, and no dedicated support coverage for the OpenMP 5.2 dispatch end-directive extension was identified.
minus operator deprecation handlingpartialPartially 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 deprecationunclaimedAdd semantic deprecation diagnostics with fix-it guidance and tests for accepted/deprecated spellings.
map clause modifiers without commas (deprecation)unclaimedAdd parser/semantics deprecation diagnostics for comma-less map modifiers and tests that verify warning text and accepted replacements.
uses_allocators list syntax (deprecation)partialThe 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)unclaimedAdd dedicated metadirective deprecation diagnostics and tests for legacy/default-clause usage.
destroy clause syntax on depobj (deprecation)partialDeprecation 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)partialDeprecation 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)unclaimedAdd parser+semantics deprecation diagnostics for legacy interop init type-position forms and tests showing canonical replacement.

OpenMP 6.0

FeatureStatusClaimed ByNotesReviews
threadset clausepartialSemantics coverage exists (flang/test/Semantics/OpenMP/threadset-clause.f90) with ongoing lowering/runtime validation.llvm/llvm-project#169856
groupprivate directivepartialSemantics 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 graphsin progressSemantics coverage exists (flang/test/Semantics/OpenMP/taskgraph.f90).
workdistribute constructpartialSemantics/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)partialSemantics 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)partialSemantics 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 transformationdoneSupported.llvm/llvm-project#161213
loop construct with DO CONCURRENTin progressExperimental support is available and under active development.llvm/llvm-project#178138, llvm/llvm-project#190990
optional argument for all clausespartialSemantics coverage exists across clause tests (for example flang/test/Semantics/OpenMP/if-clause-50.f90).llvm/llvm-project#205164
canonical loop sequencespartialRelated 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 CONCURRENTunclaimedDefine 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 directivesdoneSemantics 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 constructunclaimedSemantics 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 constructpartialAtomic 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 semanticsunclaimedDocument 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)

FeatureStatusClaimed ByNotesReviews
dyn_groupprivate clausein progressmjklemmExperimental 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 progressmjklemmExperimental 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 modifierpartialParser/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 clauseunclaimedAdd 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 clauseunclaimedAdd parser+semantics diagnostics and lowering behavior for fallback selection; add tests for fallback and non-fallback resolution paths.
loop flatten transformationunclaimedImplement parser/semantics acceptance and lowering transform plumbing, then add transform/lowering tests demonstrating flattened loop mapping.
loop grid and tile modifiers for sizes clauseunclaimedExtend 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.