summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-decl.cpp
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2025-07-30 14:23:27 -0700
committerGitHub <noreply@github.com>2025-07-30 21:23:27 +0000
commitc4dd2eb0033b3eaf683791a6666cff63aeb9f139 (patch)
tree685ee2df21730638ed56d00723af08b92bf8915c /source/slang/slang-check-decl.cpp
parent5f9547b9c8ebf3458516d170dcc7b9a5f31a3263 (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/slang/slang-check-decl.cpp')
-rw-r--r--source/slang/slang-check-decl.cpp31
1 files changed, 31 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);
}