diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 20 | ||||
| -rw-r--r-- | source/slang/slang-diagnostic-defs.h | 6 |
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'") |
