[clang] [OpenMP] Move unsupported structured bindings diagnostic (PR #80216)
Mike Rice via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 31 15:27:32 PST 2024
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/80216
Move the diagnostic so it fires only when doing an OpenMP capture, not for non-OpenMP captures. This allows non-OpenMP code to work when using OpenMP elsewhere, such as the code reported in
https://github.com/llvm/llvm-project/issues/66999.
>From e5615a482b31c5cec1220c274c9391d47b5b0a8d Mon Sep 17 00:00:00 2001
From: Mike Rice <michael.p.rice at intel.com>
Date: Wed, 31 Jan 2024 15:18:39 -0800
Subject: [PATCH] [OpenMP] Move unsupported structured bindings diagnostic
Move the diagnostic so it fires only when doing an OpenMP capture, not
for non-OpenMP captures. This allows non-OpenMP code to work when using
OpenMP elsewhere, such as the code reported in
https://github.com/llvm/llvm-project/issues/66999.
---
clang/lib/Sema/SemaExpr.cpp | 18 ++++++-------
clang/test/SemaCXX/decomposition-openmp.cpp | 29 +++++++++++++++++----
2 files changed, 32 insertions(+), 15 deletions(-)
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index abe300ecc5431..d15278bce5a6b 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -19528,16 +19528,6 @@ static bool captureInLambda(LambdaScopeInfo *LSI, ValueDecl *Var,
ByRef = (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
}
- BindingDecl *BD = dyn_cast<BindingDecl>(Var);
- // FIXME: We should support capturing structured bindings in OpenMP.
- if (!Invalid && BD && S.LangOpts.OpenMP) {
- if (BuildAndDiagnose) {
- S.Diag(Loc, diag::err_capture_binding_openmp) << Var;
- S.Diag(Var->getLocation(), diag::note_entity_declared_at) << Var;
- }
- Invalid = true;
- }
-
if (BuildAndDiagnose && S.Context.getTargetInfo().getTriple().isWasm() &&
CaptureType.getNonReferenceType().isWebAssemblyReferenceType()) {
S.Diag(Loc, diag::err_wasm_ca_reference) << 0;
@@ -19879,6 +19869,14 @@ bool Sema::tryCaptureVariable(
// just break here. Similarly, global variables that are captured in a
// target region should not be captured outside the scope of the region.
if (RSI->CapRegionKind == CR_OpenMP) {
+ // FIXME: We should support capturing structured bindings in OpenMP.
+ if (isa<BindingDecl>(Var)) {
+ if (BuildAndDiagnose) {
+ Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
+ Diag(Var->getLocation(), diag::note_entity_declared_at) << Var;
+ }
+ return true;
+ }
OpenMPClauseKind IsOpenMPPrivateDecl = isOpenMPPrivateDecl(
Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
// If the variable is private (i.e. not captured) and has variably
diff --git a/clang/test/SemaCXX/decomposition-openmp.cpp b/clang/test/SemaCXX/decomposition-openmp.cpp
index 28afc39800399..2185f3db83d4e 100644
--- a/clang/test/SemaCXX/decomposition-openmp.cpp
+++ b/clang/test/SemaCXX/decomposition-openmp.cpp
@@ -1,13 +1,32 @@
-
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 -fopenmp %s
-// FIXME: OpenMP should support capturing structured bindings
+// Okay, not an OpenMP capture.
auto f() {
int i[2] = {};
- auto [a, b] = i; // expected-note 2{{declared here}}
+ auto [a, b] = i;
return [=, &a] {
- // expected-error at -1 {{capturing a structured binding is not yet supported in OpenMP}}
return a + b;
- // expected-error at -1 {{capturing a structured binding is not yet supported in OpenMP}}
};
}
+
+// Okay, not an OpenMP capture.
+void foo(int);
+void g() {
+ #pragma omp parallel
+ {
+ int i[2] = {};
+ auto [a, b] = i;
+ auto L = [&] { foo(a+b); };
+ }
+}
+
+// FIXME: OpenMP should support capturing structured bindings
+void h() {
+ int i[2] = {};
+ auto [a, b] = i; // expected-note 2{{declared here}}
+ #pragma omp parallel
+ {
+ // expected-error at +1 2{{capturing a structured binding is not yet supported in OpenMP}}
+ foo(a + b);
+ }
+}
More information about the cfe-commits
mailing list