summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-check-decl.cpp20
-rw-r--r--source/slang/slang-diagnostic-defs.h6
2 files changed, 26 insertions, 0 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index 9853b0097..a3662702a 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -212,22 +212,42 @@ struct SemanticsDeclModifiersVisitor : public SemanticsDeclVisitorBase,
// Export'd/Extern'd variables must be `const`, otherwise we may have a mismatch
// causing errors.
bool hasConst = false;
+ bool hasUniform = false;
bool hasExportOrExtern = false;
bool hasStatic = false;
+ bool hasSpecializationConstant = false;
for (auto m : decl->modifiers)
{
if (as<ExternModifier>(m) || as<HLSLExportModifier>(m))
hasExportOrExtern = true;
else if (as<ConstModifier>(m))
hasConst = true;
+ else if (as<HLSLUniformModifier>(m))
+ hasUniform = true;
else if (as<HLSLStaticModifier>(m))
hasStatic = true;
+ else if (as<SpecializationConstantAttribute>(m) || as<VkConstantIdAttribute>(m))
+ hasSpecializationConstant = true;
}
if (hasExportOrExtern && hasConst != hasStatic)
getSink()->diagnose(
decl,
Diagnostics::ExternAndExportVarDeclMustBeConst,
decl->getName());
+
+
+ // Global const or uniform variables with initializers must be static
+ // In HLSL, const global variables without static are uniform parameters
+ // that cannot have default values
+ // Exception: specialization constants are allowed to have initializers
+ if (isGlobalDecl(decl) && (hasConst || hasUniform) && !hasStatic &&
+ !hasSpecializationConstant && decl->initExpr)
+ {
+ getSink()->diagnose(
+ decl,
+ Diagnostics::constGlobalVarWithInitRequiresStatic,
+ decl->getName());
+ }
}
void visitDecl(Decl* decl) { checkModifiers(decl); }
diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h
index c549ccca3..3d584679e 100644
--- a/source/slang/slang-diagnostic-defs.h
+++ b/source/slang/slang-diagnostic-defs.h
@@ -1508,6 +1508,12 @@ DIAGNOSTIC(
ExternAndExportVarDeclMustBeConst,
"extern and export variables must be static const: '$0'")
+DIAGNOSTIC(
+ 31224,
+ Error,
+ constGlobalVarWithInitRequiresStatic,
+ "global const variable with initializer must be declared static: '$0'")
+
// Enums
DIAGNOSTIC(32000, Error, invalidEnumTagType, "invalid tag type for 'enum': '$0'")