[clang] [OpenCL] Suppress -Wreturn-stack-address for function-scope local variable (PR #181602)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Feb 15 22:20:50 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Wenju He (wenju-he)
<details>
<summary>Changes</summary>
when __cl_clang_function_scope_local_variables extension is enabled.
OpenCL local variable has lifetime of work-group, not function call stack.
---
Full diff: https://github.com/llvm/llvm-project/pull/181602.diff
2 Files Affected:
- (modified) clang/lib/Sema/CheckExprLifetime.cpp (+7)
- (added) clang/test/SemaOpenCL/function-scope-local-return.cl (+13)
``````````diff
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;
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/181602
More information about the cfe-commits
mailing list