From 624770a1e1ba7747cd7b2f5e0def1d677e931c8c Mon Sep 17 00:00:00 2001 From: "Harsh Aggarwal (NVIDIA)" Date: Thu, 5 Jun 2025 13:44:06 +0530 Subject: Fix crash when loading modules with syntax errors (#6993) (#7288) * Fix#6993 - Emit Diagnostic Warning and Fix SIGSEGV * Update external/slang-rhi submodule * Add checks for valid stage names for paq in SemanticsVisitor check * format code --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> Co-authored-by: Ellie Hermaszewska --- source/slang/slang-check-modifier.cpp | 42 +++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-check-modifier.cpp') diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 900f503db..e5249ac88 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -2211,6 +2211,9 @@ void SemanticsVisitor::checkRayPayloadStructFields(StructDecl* structDecl) return; } + // Define valid stage names + const HashSet validStages("anyhit", "closesthit", "miss", "caller"); + // Check each field in the struct for (auto member : structDecl->members) { @@ -2220,8 +2223,11 @@ void SemanticsVisitor::checkRayPayloadStructFields(StructDecl* structDecl) continue; } - bool hasReadModifier = fieldVarDecl->findModifier() != nullptr; - bool hasWriteModifier = fieldVarDecl->findModifier() != nullptr; + auto readModifier = fieldVarDecl->findModifier(); + auto writeModifier = fieldVarDecl->findModifier(); + + bool hasReadModifier = readModifier != nullptr; + bool hasWriteModifier = writeModifier != nullptr; if (!hasReadModifier && !hasWriteModifier) { @@ -2231,6 +2237,38 @@ void SemanticsVisitor::checkRayPayloadStructFields(StructDecl* structDecl) Diagnostics::rayPayloadFieldMissingAccessQualifiers, fieldVarDecl->getName()); } + + // Check stage names in read qualifier + if (readModifier) + { + for (auto& stageToken : readModifier->stageNameTokens) + { + String stageName = stageToken.getContent(); + if (!validStages.contains(stageName)) + { + getSink()->diagnose( + stageToken, + Diagnostics::rayPayloadInvalidStageInAccessQualifier, + stageName); + } + } + } + + // Check stage names in write qualifier + if (writeModifier) + { + for (auto& stageToken : writeModifier->stageNameTokens) + { + String stageName = stageToken.getContent(); + if (!validStages.contains(stageName)) + { + getSink()->diagnose( + stageToken, + Diagnostics::rayPayloadInvalidStageInAccessQualifier, + stageName); + } + } + } } } -- cgit v1.2.3