[Analysis] resolveAllCalls - fix use after std::move warning. NFCI.
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 3 Oct 2020 16:51:40 +0000 (17:51 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 3 Oct 2020 16:52:20 +0000 (17:52 +0100)
We can't use Use.Calls after its std::move()'d to TmpCalls as it will be in an undefined state. Instead, swap with the known empty map in TmpCalls so we can then safely emplace_back into the now empty Use.Calls.

Fixes clang static analyzer warning.

llvm/lib/Analysis/StackSafetyAnalysis.cpp

index 9947dda..8c9bce4 100644 (file)
@@ -692,7 +692,10 @@ const ConstantRange *findParamAccess(const FunctionSummary &FS,
 void resolveAllCalls(UseInfo<GlobalValue> &Use,
                      const ModuleSummaryIndex *Index) {
   ConstantRange FullSet(Use.Range.getBitWidth(), true);
-  UseInfo<GlobalValue>::CallsTy TmpCalls = std::move(Use.Calls);
+  // Move Use.Calls to a temp storage and repopulate - don't use std::move as it
+  // leaves Use.Calls in an undefined state.
+  UseInfo<GlobalValue>::CallsTy TmpCalls;
+  std::swap(TmpCalls, Use.Calls);
   for (const auto &C : TmpCalls) {
     const Function *F = findCalleeInModule(C.first.Callee);
     if (F) {