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 <[email protected]> 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@+1 {{static local resource variable is not allowed}} + static RWByteAddressBuffer buf = gBuf0; +} + +[numthreads(1,1,1)] +void main() { +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
