summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-check-shader.cpp44
-rw-r--r--source/slang/slang-diagnostic-defs.h6
2 files changed, 50 insertions, 0 deletions
diff --git a/source/slang/slang-check-shader.cpp b/source/slang/slang-check-shader.cpp
index 29134131c..ed62e948d 100644
--- a/source/slang/slang-check-shader.cpp
+++ b/source/slang/slang-check-shader.cpp
@@ -531,6 +531,50 @@ void validateEntryPoint(EntryPoint* entryPoint, DiagnosticSink* sink)
}
}
+ // Attribute and keyword diagnostics. Check for the [[vk::binding]] and [[vk::push_constants]]
+ // attributes, and the register() and packoffset() keywords on entry point parameters. Slang
+ // currently ignores these, which can lead to user confusion whenever the output does not
+ // correspond to what was requested. Conversely, Slang silently generating output that just
+ // happens to align with what's requested can also lead to user confusion, with the user
+ // mistakenly believing that the modifiers are working as intended.
+ //
+ // Note that this only checks when they're used on entry point parameters.
+ for (const auto& param : entryPointFuncDecl->getParameters())
+ {
+ if (param->findModifier<GLSLBindingAttribute>())
+ {
+ sink->diagnose(
+ param,
+ Diagnostics::unhandledModOnEntryPointParameter,
+ "attribute '[[vk::binding(...)]]'",
+ param->getName());
+ }
+ if (param->findModifier<PushConstantAttribute>())
+ {
+ sink->diagnose(
+ param,
+ Diagnostics::unhandledModOnEntryPointParameter,
+ "attribute '[[vk::push_constant]]'",
+ param->getName());
+ }
+ if (param->findModifier<HLSLRegisterSemantic>())
+ {
+ sink->diagnose(
+ param,
+ Diagnostics::unhandledModOnEntryPointParameter,
+ "keyword 'register'",
+ param->getName());
+ }
+ if (param->findModifier<HLSLPackOffsetSemantic>())
+ {
+ sink->diagnose(
+ param,
+ Diagnostics::unhandledModOnEntryPointParameter,
+ "keyword 'packoffset'",
+ param->getName());
+ }
+ }
+
for (auto target : linkage->targets)
{
auto targetCaps = target->getTargetCaps();
diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h
index 08e852547..6d9f7faab 100644
--- a/source/slang/slang-diagnostic-defs.h
+++ b/source/slang/slang-diagnostic-defs.h
@@ -2077,6 +2077,12 @@ DIAGNOSTIC(
"expected a constant value of type '$0' as argument for specialization parameter '$1'")
DIAGNOSTIC(
+ 38010,
+ Warning,
+ unhandledModOnEntryPointParameter,
+ "$0 on parameter '$1' is unsupported on entry point parameters and will be ignored")
+
+DIAGNOSTIC(
38100,
Error,
typeDoesntImplementInterfaceRequirement,