[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