diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2023-04-21 14:05:49 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-21 14:05:49 +0800 |
| commit | deb130645e8538eed8fb9f682de64e2dd329473d (patch) | |
| tree | 100542512c9eece9d147dee0728ad3d6aa07df61 /source/slang/slang-ir-use-uninitialized-out-param.cpp | |
| parent | 8177fff665d10f2a116d8fd6b7a48b68d518647f (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.cpp | 29 |
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); } } } |
