diff options
| author | Darren Wihandi <65404740+fairywreath@users.noreply.github.com> | 2025-03-21 11:52:28 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-21 15:52:28 +0000 |
| commit | 844d8d2212d11f3d28a55c81f234c99db2c26250 (patch) | |
| tree | f541932dc6fca77f8b0f5ad869644a674d60fccf /source/slang/slang-ir-missing-return.cpp | |
| parent | 16ac0efa3e1e834e3b12af8ac34cf47a6418bb34 (diff) | |
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 <ellieh@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir-missing-return.cpp')
| -rw-r--r-- | source/slang/slang-ir-missing-return.cpp | 54 |
1 files changed, 49 insertions, 5 deletions
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<IRGlobalValueWithCode>(inst)) { @@ -20,21 +60,25 @@ void checkForMissingReturnsRec(IRInst* inst, DiagnosticSink* sink) if (auto missingReturn = as<IRMissingReturn>(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 |
