summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-check-decl.cpp31
-rw-r--r--source/slang/slang-diagnostic-defs.h6
-rw-r--r--tests/bugs/static-const-without-default-value.slang27
3 files changed, 64 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'")
diff --git a/tests/bugs/static-const-without-default-value.slang b/tests/bugs/static-const-without-default-value.slang
new file mode 100644
index 000000000..b9d9055c9
--- /dev/null
+++ b/tests/bugs/static-const-without-default-value.slang
@@ -0,0 +1,27 @@
+// TEST:SIMPLE(filecheck=CHECK): -target spirv -stage compute -entry computeMain -emit-spirv-directly
+
+// Test cases for static const variables without initializers producing an error
+
+// CHECK: ([[# @LINE+1]]): error 31225
+static const int globalVar;
+
+// CHECK-NOT: error 31225
+
+// This should NOT cause an error - extern static const
+extern static const int externVar;
+
+interface ITest
+{
+ // This should NOT cause an error - interface member
+ static const int interfaceVar;
+}
+
+// This should NOT cause an error - has initializer
+static const int initializedVar = 42;
+const int nonStaticVar;
+static int nonConstVar;
+
+[numthreads(1,1,1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+}