From e9f74ebfa83cd6aca39d7e3da2801cd47935bd1a Mon Sep 17 00:00:00 2001 From: "James Helferty (NVIDIA)" Date: Fri, 26 Sep 2025 13:01:38 -0400 Subject: Diagnostic on use of unsupported entry point modifiers (#8487) Generate a diagnostic warning whenever unsupported modifiers (keywords, attributes) are found on entry point parameters. These have been silently ignored up until now, with the parser accepting them but Slang not actually doing anything with them. Fixes #7151 --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> --- source/slang/slang-check-shader.cpp | 44 ++++++++++++++++++++++++++++++++++++ source/slang/slang-diagnostic-defs.h | 6 +++++ 2 files changed, 50 insertions(+) (limited to 'source') 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()) + { + sink->diagnose( + param, + Diagnostics::unhandledModOnEntryPointParameter, + "attribute '[[vk::binding(...)]]'", + param->getName()); + } + if (param->findModifier()) + { + sink->diagnose( + param, + Diagnostics::unhandledModOnEntryPointParameter, + "attribute '[[vk::push_constant]]'", + param->getName()); + } + if (param->findModifier()) + { + sink->diagnose( + param, + Diagnostics::unhandledModOnEntryPointParameter, + "keyword 'register'", + param->getName()); + } + if (param->findModifier()) + { + 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 @@ -2076,6 +2076,12 @@ DIAGNOSTIC( expectedValueOfTypeForSpecializationArg, "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, -- cgit v1.2.3