[clang] 605a9e3 - [OpenMP] Fix infinite loop on recursive initializers (#126269)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 7 11:44:23 PST 2025
Author: Joseph Huber
Date: 2025-02-07T13:44:20-06:00
New Revision: 605a9e37b64b5b5647f1f3e560f7ffe31157841c
URL: https://github.com/llvm/llvm-project/commit/605a9e37b64b5b5647f1f3e560f7ffe31157841c
DIFF: https://github.com/llvm/llvm-project/commit/605a9e37b64b5b5647f1f3e560f7ffe31157841c.diff
LOG: [OpenMP] Fix infinite loop on recursive initializers (#126269)
Summary:
If the user tried to initialize a gobal declare target variable with
itself the compiler will hang forever. Add a visited set to make sure
this stops.
Fixes: https://github.com/llvm/llvm-project/issues/69194
Added:
Modified:
clang/lib/Sema/SemaOpenMP.cpp
clang/test/OpenMP/declare_target_messages.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index b060039d188a1bc..376995d624e2830 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -22819,8 +22819,12 @@ class GlobalDeclRefChecker final : public StmtVisitor<GlobalDeclRefChecker> {
void declareTargetInitializer(Decl *TD) {
A = TD->getAttr<OMPDeclareTargetDeclAttr>();
DeclVector.push_back(cast<VarDecl>(TD));
+ llvm::SmallDenseSet<Decl *> Visited;
while (!DeclVector.empty()) {
VarDecl *TargetVarDecl = DeclVector.pop_back_val();
+ if (!Visited.insert(TargetVarDecl).second)
+ continue;
+
if (TargetVarDecl->hasAttr<OMPDeclareTargetDeclAttr>() &&
TargetVarDecl->hasInit() && TargetVarDecl->hasGlobalStorage()) {
if (Expr *Ex = TargetVarDecl->getInit())
diff --git a/clang/test/OpenMP/declare_target_messages.cpp b/clang/test/OpenMP/declare_target_messages.cpp
index ce5a833b3866a9b..3c0e766cf72ca8e 100644
--- a/clang/test/OpenMP/declare_target_messages.cpp
+++ b/clang/test/OpenMP/declare_target_messages.cpp
@@ -33,6 +33,11 @@
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{limit} -o - %s
+#pragma omp begin declare target
+static int gg;
+// expected-warning at +1 {{variable 'recursive' is uninitialized when used within its own initialization}}
+int recursive = recursive ^ 3 + gg;
+#pragma omp end declare target
// expected-error at +1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target
More information about the cfe-commits
mailing list