diff options
| author | ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> | 2025-07-30 14:23:27 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-30 21:23:27 +0000 |
| commit | c4dd2eb0033b3eaf683791a6666cff63aeb9f139 (patch) | |
| tree | 685ee2df21730638ed56d00723af08b92bf8915c /source | |
| parent | 5f9547b9c8ebf3458516d170dcc7b9a5f31a3263 (diff) | |
disallow `static const` variables without default-value (#7993)
* Fix static const variables without initializers causing internal errors
Add validation in SemanticsDeclHeaderVisitor::checkVarDeclCommon to detect static const variables without initializers and emit proper error diagnostics instead of allowing internal errors to escape during SPIR-V generation.
- Add new diagnostic (ID 31225) for static const variables without initializers
- Skip validation for extern static const variables
- Skip validation for interface member variables
- Add comprehensive test case covering various scenarios
Fixes #7989
Co-authored-by: ArielG-NV <ArielG-NV@users.noreply.github.com>
* clean up test and implementation
* format code (#7994)
Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: ArielG-NV <ArielG-NV@users.noreply.github.com>
Co-authored-by: slangbot <ellieh+slangbot@nvidia.com>
Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 31 | ||||
| -rw-r--r-- | source/slang/slang-diagnostic-defs.h | 6 |
2 files changed, 37 insertions, 0 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 4ebad6392..02f404d88 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -2356,6 +2356,37 @@ void SemanticsDeclHeaderVisitor::checkVarDeclCommon(VarDeclBase* varDecl) // global variables and struct fields to prevent mangling. addModifier(varDecl, m_astBuilder->create<ExternCppModifier>()); } + + // Check for static const variables without initializers + if (!varDecl->initExpr) + { + bool isStatic = false; + bool isConst = false; + bool isExtern = false; + for (auto modifier : varDecl->modifiers) + { + if (as<HLSLStaticModifier>(modifier)) + isStatic = true; + else if (as<ConstModifier>(modifier)) + isConst = true; + else if (as<ExternModifier>(modifier)) + isExtern = true; + + if (isStatic && isConst && isExtern) + break; + } + if (isStatic && isConst && + // Don't error for extern variables + // Don't error for interface member variables + !isExtern && !as<InterfaceDecl>(varDecl->parentDecl)) + { + getSink()->diagnose( + varDecl, + Diagnostics::staticConstVariableRequiresInitializer, + varDecl); + } + } + checkVisibility(varDecl); } diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h index 5544329a5..8f4845421 100644 --- a/source/slang/slang-diagnostic-defs.h +++ b/source/slang/slang-diagnostic-defs.h @@ -1510,6 +1510,12 @@ DIAGNOSTIC( constGlobalVarWithInitRequiresStatic, "global const variable with initializer must be declared static: '$0'") +DIAGNOSTIC( + 31225, + Error, + staticConstVariableRequiresInitializer, + "static const variable '$0' must have an initializer") + // Enums DIAGNOSTIC(32000, Error, invalidEnumTagType, "invalid tag type for 'enum': '$0'") |
