diff options
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 |
