[clang] [HLSL] Diagnose initialization of static local resource variables (PR #205230)
Krisitan Erik Olsen via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 22 18:04:56 PDT 2026
https://github.com/Kristianerik created https://github.com/llvm/llvm-project/pull/205230
Initializing a static local variable with a resource type
(`static RWByteAddressBuffer buf = gBuf0;`) is not valid in HLSL,
but the compiler had no guard for it. The code reached globalopt,
which attempted to constant-fold a zeroinitializer on a target
extension type that does not support zero initialization, causing
an assertion failure.
This patch adds an early check in `SemaHLSL::handleInitialization`
that rejects static local resource variables with an initializer,
emitting a clean diagnostic instead of crashing. Default-initialized
static local resources (`static RWBuffer<float> buf;`) remain valid
and are unaffected.
Fixes #205169.
>From 80ba6a180004722baae8c7eb88cb7a22ce4d2893 Mon Sep 17 00:00:00 2001
From: Kristianerik <kristian.erik at outlook.com>
Date: Mon, 22 Jun 2026 18:02:04 -0700
Subject: [PATCH] [HLSL] Diagnose initialization of static local resource
variables
---
clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 +++
clang/lib/Sema/SemaHLSL.cpp | 7 +++++++
.../Resources/static_local_resource_init.hlsl | 14 ++++++++++++++
3 files changed, 24 insertions(+)
create mode 100644 clang/test/SemaHLSL/Resources/static_local_resource_init.hlsl
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index cb5f124c609ce..8cafec94aab3f 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -13806,6 +13806,9 @@ def warn_hlsl_assigning_local_resource_is_not_unique
"unique global resource">,
InGroup<HLSLExplicitBinding>;
+def err_hlsl_static_local_resource : Error<
+ "static local resource variable is not allowed">;
+
def err_hlsl_push_constant_unique
: Error<"cannot have more than one push constant block">;
def err_hlsl_samplecmp_requires_float
diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 075dc97b0aef2..f45a9ee94bb1d 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -6513,6 +6513,13 @@ QualType SemaHLSL::checkMatrixComponent(Sema &S, QualType baseType,
}
bool SemaHLSL::handleInitialization(VarDecl *VDecl, Expr *&Init) {
+ // Static local resource variables cannot be copy-initialized.
+ if (VDecl->isStaticLocal() && VDecl->getType()->isHLSLResourceRecord()) {
+ SemaRef.Diag(VDecl->getLocation(), diag::err_hlsl_static_local_resource);
+ VDecl->setInvalidDecl();
+ return false;
+ }
+
// If initializing a local resource, track the resource binding it is using
if (VDecl->getType()->isHLSLResourceRecord() && !VDecl->hasGlobalStorage())
trackLocalResource(VDecl, Init);
diff --git a/clang/test/SemaHLSL/Resources/static_local_resource_init.hlsl b/clang/test/SemaHLSL/Resources/static_local_resource_init.hlsl
new file mode 100644
index 0000000000000..e20981c7286aa
--- /dev/null
+++ b/clang/test/SemaHLSL/Resources/static_local_resource_init.hlsl
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-compute -x hlsl -fsyntax-only %s -verify
+// This test validates that initializing a static local variable with a resource
+// type produces a diagnostic error instead of crashing during optimization.
+
+RWByteAddressBuffer gBuf0 : register(u0);
+
+void fn() {
+ // expected-error at +1 {{static local resource variable is not allowed}}
+ static RWByteAddressBuffer buf = gBuf0;
+}
+
+[numthreads(1,1,1)]
+void main() {
+}
More information about the cfe-commits
mailing list