summaryrefslogtreecommitdiff
path: root/source/slang
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-check-decl.cpp25
-rw-r--r--source/slang/slang-diagnostic-defs.h7
2 files changed, 31 insertions, 1 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index 79482ea6e..daa761d3d 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -42,6 +42,31 @@ struct SemanticsDeclModifiersVisitor : public SemanticsDeclVisitorBase,
void visitDeclGroup(DeclGroup*) {}
+ void visitVarDecl(VarDecl* decl)
+ {
+ visitDecl(decl);
+
+ // Export'd/Extern'd variables must be `const`, otherwise we may have a mismatch
+ // causing errors.
+ bool hasConst = false;
+ bool hasExportOrExtern = false;
+ bool hasStatic = 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<HLSLStaticModifier>(m))
+ hasStatic = true;
+ }
+ if (hasExportOrExtern && hasConst != hasStatic)
+ getSink()->diagnose(
+ decl,
+ Diagnostics::ExternAndExportVarDeclMustBeConst,
+ decl->getName());
+ }
+
void visitDecl(Decl* decl) { checkModifiers(decl); }
void visitStructDecl(StructDecl* structDecl);
diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h
index 6bedcfe3e..cafd61062 100644
--- a/source/slang/slang-diagnostic-defs.h
+++ b/source/slang/slang-diagnostic-defs.h
@@ -1366,13 +1366,18 @@ DIAGNOSTIC(
Error,
variableCannotBePushAndSpecializationConstant,
"'$0' cannot be a push constant and a specialization constant at the same time")
-
DIAGNOSTIC(31221, Error, invalidHLSLRegisterName, "invalid HLSL register name '$0'.")
DIAGNOSTIC(
31222,
Error,
invalidHLSLRegisterNameForType,
"invalid HLSL register name '$0' for type '$1'.")
+DIAGNOSTIC(
+ 31223,
+ Error,
+ ExternAndExportVarDeclMustBeConst,
+ "extern and export variables must be static const: '$0'")
+
// Enums
DIAGNOSTIC(32000, Error, invalidEnumTagType, "invalid tag type for 'enum': '$0'")