[clang] [OpenCL] Suppress -Wreturn-stack-address for function-scope local variable (PR #181602)
Wenju He via cfe-commits
cfe-commits at lists.llvm.org
Sun Feb 15 22:20:19 PST 2026
https://github.com/wenju-he created https://github.com/llvm/llvm-project/pull/181602
when __cl_clang_function_scope_local_variables extension is enabled.
OpenCL local variable has lifetime of work-group, not function call stack.
>From 2b014e12d738f03e1a6b17eae3f61c8401e287b5 Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Mon, 16 Feb 2026 07:18:28 +0100
Subject: [PATCH] [OpenCL] Suppress -Wreturn-stack-address for function-scope
local variable
when __cl_clang_function_scope_local_variables extension is enabled.
OpenCL local variable has lifetime of work-group, not function call stack.
---
clang/lib/Sema/CheckExprLifetime.cpp | 7 +++++++
.../test/SemaOpenCL/function-scope-local-return.cl | 13 +++++++++++++
2 files changed, 20 insertions(+)
create mode 100644 clang/test/SemaOpenCL/function-scope-local-return.cl
diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp
index 5d4b4508541b7..c2f2aa8fc9487 100644
--- a/clang/lib/Sema/CheckExprLifetime.cpp
+++ b/clang/lib/Sema/CheckExprLifetime.cpp
@@ -1337,6 +1337,13 @@ checkExprLifetimeImpl(Sema &SemaRef, const InitializedEntity *InitEntity,
// expression.
if (LK == LK_StmtExprResult)
return false;
+ if (auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
+ if (VD->getType().getAddressSpace() == LangAS::opencl_local &&
+ SemaRef.getOpenCLOptions().isAvailableOption(
+ "__cl_clang_function_scope_local_variables",
+ SemaRef.getLangOpts()))
+ return false;
+ }
SemaRef.Diag(DiagLoc, diag::warn_ret_stack_addr_ref)
<< InitEntity->getType()->isReferenceType() << DRE->getDecl()
<< isa<ParmVarDecl>(DRE->getDecl()) << (LK == LK_MustTail)
diff --git a/clang/test/SemaOpenCL/function-scope-local-return.cl b/clang/test/SemaOpenCL/function-scope-local-return.cl
new file mode 100644
index 0000000000000..1de86b4293a9a
--- /dev/null
+++ b/clang/test/SemaOpenCL/function-scope-local-return.cl
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL3.0
+
+// Check returning a pointer to a local address space variable does not warn
+// if __cl_clang_function_scope_local_variables extension is enabled.
+
+// expected-no-diagnostics
+
+#pragma OPENCL EXTENSION __cl_clang_function_scope_local_variables : enable
+
+local int* get_group_scratch() {
+ local int data[64];
+ return data;
+}
More information about the cfe-commits
mailing list