https://github.com/skadewdl3 created https://github.com/llvm/llvm-project/pull/234881
Fixes #230923. Taking a look at the segfault in a debugger and playing around with the reproducer, the error happened only when: - There's a non-empty statement before the nested for-loop - There's an interchange directive present The segfault was happening in `JumpScopeChecker::BuildScopeInformation` when processing the statement as an `OMPExecutableDirective`. In case of an interchange directive being present, `getStructuredBlock` returned `nullptr` causing `getBeginLoc` to segfault. This PR adds a fallback so if the transformed statement returned by `getStructuredBlock()` isn't available, the raw AST statement is used instead. Assisted-by: GPT Sol 6.1 I used Sol to decide upon where the fix should be placed. >From 1df7e90e7dcac1a6345f6a4b06328af97f65bb80 Mon Sep 17 00:00:00 2001 From: Soham Karandikar <[email protected]> Date: Fri, 23 Oct 2026 03:53:33 -0500 Subject: [PATCH 1/3] Raw source statement is used as fallback if transformed structured block isn't available --- clang/lib/Sema/JumpDiagnostics.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/JumpDiagnostics.cpp b/clang/lib/Sema/JumpDiagnostics.cpp index bbe6f644609bf8..6489c9ede77592 100644 --- a/clang/lib/Sema/JumpDiagnostics.cpp +++ b/clang/lib/Sema/JumpDiagnostics.cpp @@ -655,12 +655,19 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, default: if (auto *ED = dyn_cast<OMPExecutableDirective>(S)) { if (!ED->isStandaloneDirective()) { + // Sometimes, the transformed structured block may not be available + // when transformation is deferred (e.g., when using `omp interchange`). + // In such cases, use the existing source statement + Stmt *Block = ED->getStructuredBlock(); + if (!Block) + Block = ED->getRawStmt(); + unsigned NewParentScope = Scopes.size(); Scopes.emplace_back(ParentScope, diag::note_omp_protected_structured_block, diag::note_omp_exits_structured_block, - ED->getStructuredBlock()->getBeginLoc()); - BuildScopeInformation(ED->getStructuredBlock(), NewParentScope); + Block->getBeginLoc()); + BuildScopeInformation(Block, NewParentScope); return; } } >From 1177fcc3a337c6720776f67514800b0a1c7b3fb5 Mon Sep 17 00:00:00 2001 From: Soham Karandikar <[email protected]> Date: Fri, 23 Oct 2026 04:01:45 -0500 Subject: [PATCH 2/3] Added test --- clang/test/OpenMP/interchange_messages.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/clang/test/OpenMP/interchange_messages.cpp b/clang/test/OpenMP/interchange_messages.cpp index 7b9a4963445e4f..d714267722a9b4 100644 --- a/clang/test/OpenMP/interchange_messages.cpp +++ b/clang/test/OpenMP/interchange_messages.cpp @@ -220,6 +220,19 @@ static void templated_func_type_dependent() { } +// Deferred interchange must not crash jump-scope checking +template <typename T> +static void interchange_in_switch() { + switch (T(0)) { + int a = 10; +#pragma omp for collapse(2) +#pragma omp interchange + for (int j = 0; j < 2; j++) + for (int k = 0; k < 2; k++) + ; + } +} + void template_inst() { // expected-note@+1 {{in instantiation of function template specialization 'templated_func<int>' requested here}} templated_func<int>(); >From 97d74a8cb73dd9e0f4e61abef7715c5187b341af Mon Sep 17 00:00:00 2001 From: Soham Karandikar <[email protected]> Date: Fri, 23 Oct 2026 04:14:27 -0500 Subject: [PATCH 3/3] Ran git clang-format --- clang/lib/Sema/JumpDiagnostics.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/JumpDiagnostics.cpp b/clang/lib/Sema/JumpDiagnostics.cpp index 6489c9ede77592..96e65b4ca766c6 100644 --- a/clang/lib/Sema/JumpDiagnostics.cpp +++ b/clang/lib/Sema/JumpDiagnostics.cpp @@ -663,10 +663,9 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, Block = ED->getRawStmt(); unsigned NewParentScope = Scopes.size(); - Scopes.emplace_back(ParentScope, - diag::note_omp_protected_structured_block, - diag::note_omp_exits_structured_block, - Block->getBeginLoc()); + Scopes.emplace_back( + ParentScope, diag::note_omp_protected_structured_block, + diag::note_omp_exits_structured_block, Block->getBeginLoc()); BuildScopeInformation(Block, NewParentScope); return; } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
