summaryrefslogtreecommitdiffstats
path: root/source
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
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')
-rw-r--r--source/slang/slang-check-decl.cpp31
-rw-r--r--source/slang/slang-diagnostic-defs.h6
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'")