summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
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'")