[clang] [OpenMP] Support capturing structured bindings in OpenMP regions. (PR #190832)
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Sat May 9 09:14:39 PDT 2026
https://github.com/alexey-bataev requested changes to this pull request.
Several blockers and design concerns; not ready to land.
1. Tuple-like bindings crash the compiler. `EmitOMPCapturedBindingLValue` ends in `llvm_unreachable` when `BD->getBinding()->IgnoreImplicit()` is neither `MemberExpr` nor `ArraySubscriptExpr`, which is exactly the tuple-like case (`std::pair`, `std::tuple`, `std::array`). Release notes claim this case 'will produce a compilation error' but no diagnostic is emitted. Restore the Sema-level rejection for tuple-like bindings (or implement them) and add a regression test, otherwise any `auto [a,b] = std::pair{...}` followed by an OpenMP region ICEs.
2. CodeGen is overly hand-rolled. The new `EmitOMPCapturedBindingLValue` constructs a synthetic `DeclRefExpr` only to call `EmitLValue` and then patches up the address element type. The standard `VarDecl` branch in `EmitDeclRefLValue` already handles all the relevant pieces (LocalDeclMap, reference unwrapping via `EmitLoadOfReferenceLValue`, captured-stmt fallback, nontemporal SIMD annotation). The new function silently drops the nontemporal annotation. Reuse the standard path or make the new one consistent with it.
3. SemaStmt.cpp dedup logic and manual reference field. Dropping captures from `RSI->Captures` for duplicate `DecompositionDecl` ends up with a `CapturedStmt` whose number of captures no longer matches the original tracked bindings. Confirm template instantiation, AST dumpers, and source-rewriter clients still walk this consistently. Also, the manually-constructed `LValueReferenceType` field ignores `Cap.isReferenceCapture()` and assumes by-ref capture; this assumption needs an assert at minimum.
4. setOpenMPCaptureKind is now called with the `DecompositionDecl`. DSAs are tracked per-binding (the user-visible names in `firstprivate(a)` etc.), not per-decomposed-decl, so this lookup will miss explicit DSAs.
5. Test coverage. No test exercises tuple-like bindings (would crash today), `target`/`target parallel for`, explicit DSA clauses on bindings, combined/composite directives, `task`, template instantiation, or static structured bindings.
6. Release notes wording is wrong. 'C++17 structured bindings in OpenMP regions' suggests the feature is structured bindings themselves, but those have always worked. The new feature is 'capturing structured bindings' (a C++20 extension, warned in C++17). Also fix the misleading 'will produce a compilation error' since the code currently crashes via `llvm_unreachable`.
Inline comments below.
https://github.com/llvm/llvm-project/pull/190832
More information about the cfe-commits
mailing list