summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-missing-return.cpp
diff options
context:
space:
mode:
authorDarren Wihandi <65404740+fairywreath@users.noreply.github.com>2025-03-21 11:52:28 -0400
committerGitHub <noreply@github.com>2025-03-21 15:52:28 +0000
commit844d8d2212d11f3d28a55c81f234c99db2c26250 (patch)
treef541932dc6fca77f8b0f5ad869644a674d60fccf /source/slang/slang-ir-missing-return.cpp
parent16ac0efa3e1e834e3b12af8ac34cf47a6418bb34 (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.cpp54
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