From 844d8d2212d11f3d28a55c81f234c99db2c26250 Mon Sep 17 00:00:00 2001 From: Darren Wihandi <65404740+fairywreath@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:52:28 -0400 Subject: Emit errors for missing returns on unsupported targets (#6633) * initial wip * more WIP * preserve old lower behavior * remove unnecessary includes * add test * add no target case in test * fix broken test --------- Co-authored-by: Ellie Hermaszewska --- source/slang/slang-ir-missing-return.cpp | 54 +++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 5 deletions(-) (limited to 'source/slang/slang-ir-missing-return.cpp') diff --git a/source/slang/slang-ir-missing-return.cpp b/source/slang/slang-ir-missing-return.cpp index 9dcda37ca..82d1171e0 100644 --- a/source/slang/slang-ir-missing-return.cpp +++ b/source/slang/slang-ir-missing-return.cpp @@ -1,6 +1,8 @@ // ir-missing-return.cpp #include "slang-ir-missing-return.h" +#include "core/slang-type-text-util.h" +#include "slang-compiler.h" #include "slang-ir-insts.h" #include "slang-ir.h" @@ -10,7 +12,45 @@ namespace Slang class DiagnosticSink; struct IRModule; -void checkForMissingReturnsRec(IRInst* inst, DiagnosticSink* sink) +// Returns false if compilation target does not allow and errors out(i.e. during downstream +// compilation) on missing returns. +static bool doesTargetAllowMissingReturns(CodeGenTarget target) +{ + if (isKhronosTarget(target) || isWGPUTarget(target)) + { + return false; + } + + return true; +} + +static void diagnoseMissingReturnForTarget( + IRMissingReturn* missingReturn, + DiagnosticSink* sink, + CodeGenTarget target, + bool diagnoseWarning) +{ + if (doesTargetAllowMissingReturns(target)) + { + if (diagnoseWarning) + { + sink->diagnose(missingReturn, Diagnostics::missingReturn); + } + } + else + { + sink->diagnose( + missingReturn, + Diagnostics::missingReturnError, + TypeTextUtil::getCompileTargetName(SlangCompileTarget(target))); + } +} + +void checkForMissingReturnsRec( + IRInst* inst, + DiagnosticSink* sink, + CodeGenTarget target, + bool diagnoseWarning) { if (auto code = as(inst)) { @@ -20,21 +60,25 @@ void checkForMissingReturnsRec(IRInst* inst, DiagnosticSink* sink) if (auto missingReturn = as(terminator)) { - sink->diagnose(missingReturn, Diagnostics::missingReturn); + diagnoseMissingReturnForTarget(missingReturn, sink, target, diagnoseWarning); } } } for (auto childInst : inst->getDecorationsAndChildren()) { - checkForMissingReturnsRec(childInst, sink); + checkForMissingReturnsRec(childInst, sink, target, diagnoseWarning); } } -void checkForMissingReturns(IRModule* module, DiagnosticSink* sink) +void checkForMissingReturns( + IRModule* module, + DiagnosticSink* sink, + CodeGenTarget target, + bool diagnoseWarning) { // Look for any `missingReturn` instructions - checkForMissingReturnsRec(module->getModuleInst(), sink); + checkForMissingReturnsRec(module->getModuleInst(), sink, target, diagnoseWarning); } } // namespace Slang -- cgit v1.2.3