summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-use-uninitialized-out-param.cpp
diff options
context:
space:
mode:
authorEllie Hermaszewska <ellieh@nvidia.com>2023-04-21 14:05:49 +0800
committerGitHub <noreply@github.com>2023-04-21 14:05:49 +0800
commitdeb130645e8538eed8fb9f682de64e2dd329473d (patch)
tree100542512c9eece9d147dee0728ad3d6aa07df61 /source/slang/slang-ir-use-uninitialized-out-param.cpp
parent8177fff665d10f2a116d8fd6b7a48b68d518647f (diff)
Add warning for returning without initializing out parameter (#2807)
* Add warning for returning without initializing out parameter * Add unused prelude function to squash uninitialized out variable warnings
Diffstat (limited to 'source/slang/slang-ir-use-uninitialized-out-param.cpp')
-rw-r--r--source/slang/slang-ir-use-uninitialized-out-param.cpp29
1 files changed, 20 insertions, 9 deletions
diff --git a/source/slang/slang-ir-use-uninitialized-out-param.cpp b/source/slang/slang-ir-use-uninitialized-out-param.cpp
index 9818cec53..64f5f8bd3 100644
--- a/source/slang/slang-ir-use-uninitialized-out-param.cpp
+++ b/source/slang/slang-ir-use-uninitialized-out-param.cpp
@@ -75,27 +75,33 @@ namespace Slang
}
}
// Check all address loads.
- List<IRLoad*> loads;
+ List<IRInst*> loadsAndReturns;
for (auto addr : addresses)
{
for (auto use = addr->firstUse; use; use = use->nextUse)
{
if (auto load = as<IRLoad>(use->getUser()))
- loads.add(load);
+ loadsAndReturns.add(load);
}
}
+ for(const auto& b : func->getBlocks())
+ {
+ auto t = b->getTerminator();
+ if (t->m_op == kIROp_Return)
+ loadsAndReturns.add(t);
+ }
for (auto store : stores)
{
// Remove insts from `loads` that is reachable from the store.
- for (Index i = 0; i < loads.getCount();)
+ for (Index i = 0; i < loadsAndReturns.getCount();)
{
- auto load = loads[i];
- if (!canAddressesPotentiallyAlias(func, store.address, loads[i]->getPtr()))
+ auto load = as<IRLoad>(loadsAndReturns[i]);
+ if (load && !canAddressesPotentiallyAlias(func, store.address, load->getPtr()))
continue;
- if (reachability.isInstReachable(store.storeInst, load))
+ if (reachability.isInstReachable(store.storeInst, loadsAndReturns[i]))
{
- loads.fastRemoveAt(i);
+ loadsAndReturns.fastRemoveAt(i);
}
else
{
@@ -104,9 +110,14 @@ namespace Slang
}
}
// If there are any loads left, it means they are using uninitialized out params.
- for (auto load : loads)
+ for (auto load : loadsAndReturns)
{
- sink->diagnose(load, Diagnostics::usingUninitializedValue);
+ sink->diagnose(
+ load,
+ load->m_op == kIROp_Return
+ ? Diagnostics::returningWithUninitializedOut
+ : Diagnostics::usingUninitializedValue,
+ param);
}
}
}