diff options
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 31 | ||||
| -rw-r--r-- | source/slang/slang-diagnostic-defs.h | 6 | ||||
| -rw-r--r-- | tests/bugs/static-const-without-default-value.slang | 27 |
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) +{ +} |
