From 5581cb2bb6bebe3b72590003c936ce7f716ee74d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 16:00:44 +0000 Subject: [PATCH 1/2] Initial plan From 5c29907012a04ef8b9482c16f7fafacc2311f07c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 16:24:11 +0000 Subject: [PATCH 2/2] Fix GLSL global const diagnostic regression - add test exclusion for GLSL module Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com> --- source/slang/slang-check-decl.cpp | 14 +++++++--- .../glsl-global-const-with-init.slang | 26 +++++++++++++++++++ ...-global-const-with-init-still-errors.slang | 18 +++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 tests/diagnostics/glsl-global-const-with-init.slang create mode 100644 tests/diagnostics/hlsl-global-const-with-init-still-errors.slang diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 46876131a22..1dc230daea1 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -240,13 +240,19 @@ struct SemanticsDeclModifiersVisitor : public SemanticsDeclVisitorBase, // In HLSL, const global variables without static are uniform parameters // that cannot have default values // Exception: specialization constants are allowed to have initializers + // Exception: In GLSL mode, global const variables are real constants, not uniform + // parameters if (isGlobalDecl(decl) && (hasConst || hasUniform) && !hasStatic && !hasSpecializationConstant && decl->initExpr) { - getSink()->diagnose( - decl, - Diagnostics::constGlobalVarWithInitRequiresStatic, - decl->getName()); + auto moduleDecl = getModuleDecl(decl); + if (!moduleDecl || !moduleDecl->hasModifier()) + { + getSink()->diagnose( + decl, + Diagnostics::constGlobalVarWithInitRequiresStatic, + decl->getName()); + } } } diff --git a/tests/diagnostics/glsl-global-const-with-init.slang b/tests/diagnostics/glsl-global-const-with-init.slang new file mode 100644 index 00000000000..ff5b35b750a --- /dev/null +++ b/tests/diagnostics/glsl-global-const-with-init.slang @@ -0,0 +1,26 @@ +//TEST:SIMPLE(filecheck=CHK): -target glsl -stage fragment -entry main -allow-glsl + +// Test for GLSL mode: global const variables with initializers should be allowed +// In GLSL mode, global const variables are real constants, not uniform parameters +// This should NOT produce the error 31224 that would trigger in HLSL mode + +#version 450 + +// These should NOT trigger error 31224 in GLSL mode (they would in HLSL) +const float globalConstWithInit = 1.0; // OK in GLSL - real constant +const vec3 globalVecConst = vec3(1.0, 2.0, 3.0); // OK in GLSL - real constant +const int globalIntConst = 42; // OK in GLSL - real constant + +// Regular uniforms without const should still be allowed +uniform float uniformFloat; // OK - uniform without const +uniform vec4 uniformVec; // OK - uniform without const + +// CHK-NOT: error 31224 +// CHK: void main() + +out vec4 fragColor; + +void main() +{ + fragColor = vec4(globalConstWithInit, globalVecConst.x, globalIntConst, 1.0); +} \ No newline at end of file diff --git a/tests/diagnostics/hlsl-global-const-with-init-still-errors.slang b/tests/diagnostics/hlsl-global-const-with-init-still-errors.slang new file mode 100644 index 00000000000..71471a6b342 --- /dev/null +++ b/tests/diagnostics/hlsl-global-const-with-init-still-errors.slang @@ -0,0 +1,18 @@ +//TEST:SIMPLE(filecheck=CHK): -target hlsl -entry main + +// Test to ensure HLSL mode still produces the diagnostic for global const with initializers +// This verifies our fix doesn't break existing HLSL behavior + +// This should trigger error 31224 in HLSL mode +//CHK: ([[# @LINE + 1]]): error 31224: global const variable with initializer must be declared static: 'globalConstWithInit' +const float globalConstWithInit = 1.0f; + +// This should also trigger error 31224 in HLSL mode +//CHK: ([[# @LINE + 1]]): error 31224: global const variable with initializer must be declared static: 'uniformWithInit' +uniform float uniformWithInit = 2.0f; + +[shader("vertex")] +float4 main() : SV_Position +{ + return float4(1, 0, 0, 1); +} \ No newline at end of file