diff options
| author | Yong He <yonghe@outlook.com> | 2025-07-15 23:36:18 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-16 06:36:18 +0000 |
| commit | 56e91e91e425b77a9d1512cca3d26ce446781935 (patch) | |
| tree | 78ab9ceaaad5a36c480359e3e7e23c0bef48d863 /source | |
| parent | bcd53322fb7bc3d226cc03a47cc6b91a37850690 (diff) | |
Diagnose on initExpr of a global `const` decl (#7711)
* Add diagnostic for const/uniform global variables with initializers
Global const and uniform variables without the static modifier are
treated as uniform parameters in HLSL, which cannot have default values.
This change adds error 31224 to catch this case early and provide clear
guidance to users.
Fixes #7701
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
* Add test case for global const/uniform variable diagnostic
Add test for diagnostic 31224 which catches global const and uniform
variables with initializers that aren't declared static. The test
verifies both error cases and valid cases to ensure the diagnostic
works correctly.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
* Fix failing tests due to new global const diagnostic
Add 'static' keyword to global const variables with initializers
to resolve diagnostic 31224: "global const variable with initializer
must be declared static"
Co-authored-by: Jay Kwak <jkwak-work@users.noreply.github.com>
* Allow specialization constants with initializers without static
- Modified diagnostic logic in slang-check-decl.cpp to allow specialization
constants (SpecializationConstantAttribute and VkConstantIdAttribute) to
have initializers without requiring the static keyword
- Updated 8 SPIRV test files to remove unnecessary static keywords from
specialization constant declarations
- Enhanced diagnostic test case to include specialization constant examples
- All tests passing with the new behavior
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
* format code (#7765)
Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
* Remove static keyword from specialization constants and add comprehensive test cases
- Remove static from specialization constants in test files as they are semantically meaningless
- Update tests to use existing diagnostic 31219 for static specialization constant errors
- Add comprehensive test cases that verify the error occurs when static is used with specialization constants
- Fixes suggested in PR review to make static specialization constants an error
Co-authored-by: ArielG-NV <ArielG-NV@users.noreply.github.com>
* Add error for static specialization constants
Static specialization constants are semantically meaningless and should
produce an error. This change adds logic to trigger diagnostic 31219
when both 'static' and specialization constant attributes are present.
The existing diagnostic 31219 'push or specialization constants cannot
be static' is now correctly triggered for:
- [SpecializationConstant] static const variables
- [vk::constant_id] static const variables
Co-authored-by: ArielG-NV <ArielG-NV@users.noreply.github.com>
* Update source/slang/slang-check-decl.cpp
* Update tests/glsl/compute-shader-layout-id.slang
* Update tests/glsl/compute-shader-layout-id.slang
* Fix test case Claude broke
* Update global-uniform.slang
* Update global-uniform.slang.expected
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
Co-authored-by: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com>
Co-authored-by: Jay Kwak <jkwak-work@users.noreply.github.com>
Co-authored-by: slangbot <ellieh+slangbot@nvidia.com>
Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Co-authored-by: ArielG-NV <ArielG-NV@users.noreply.github.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 20 | ||||
| -rw-r--r-- | source/slang/slang-diagnostic-defs.h | 6 |
2 files changed, 26 insertions, 0 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 9853b0097..a3662702a 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -212,22 +212,42 @@ struct SemanticsDeclModifiersVisitor : public SemanticsDeclVisitorBase, // Export'd/Extern'd variables must be `const`, otherwise we may have a mismatch // causing errors. bool hasConst = false; + bool hasUniform = false; bool hasExportOrExtern = false; bool hasStatic = false; + bool hasSpecializationConstant = false; for (auto m : decl->modifiers) { if (as<ExternModifier>(m) || as<HLSLExportModifier>(m)) hasExportOrExtern = true; else if (as<ConstModifier>(m)) hasConst = true; + else if (as<HLSLUniformModifier>(m)) + hasUniform = true; else if (as<HLSLStaticModifier>(m)) hasStatic = true; + else if (as<SpecializationConstantAttribute>(m) || as<VkConstantIdAttribute>(m)) + hasSpecializationConstant = true; } if (hasExportOrExtern && hasConst != hasStatic) getSink()->diagnose( decl, Diagnostics::ExternAndExportVarDeclMustBeConst, decl->getName()); + + + // Global const or uniform variables with initializers must be static + // In HLSL, const global variables without static are uniform parameters + // that cannot have default values + // Exception: specialization constants are allowed to have initializers + if (isGlobalDecl(decl) && (hasConst || hasUniform) && !hasStatic && + !hasSpecializationConstant && decl->initExpr) + { + getSink()->diagnose( + decl, + Diagnostics::constGlobalVarWithInitRequiresStatic, + decl->getName()); + } } void visitDecl(Decl* decl) { checkModifiers(decl); } diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h index c549ccca3..3d584679e 100644 --- a/source/slang/slang-diagnostic-defs.h +++ b/source/slang/slang-diagnostic-defs.h @@ -1508,6 +1508,12 @@ DIAGNOSTIC( ExternAndExportVarDeclMustBeConst, "extern and export variables must be static const: '$0'") +DIAGNOSTIC( + 31224, + Error, + constGlobalVarWithInitRequiresStatic, + "global const variable with initializer must be declared static: '$0'") + // Enums DIAGNOSTIC(32000, Error, invalidEnumTagType, "invalid tag type for 'enum': '$0'") |
