Merge pull request #10731 from gottesmm/ignore_unreachable_nonowning_uses
diff --git a/lib/SIL/SILOwnershipVerifier.cpp b/lib/SIL/SILOwnershipVerifier.cpp
index f41ffbb..59c7e6d 100644
--- a/lib/SIL/SILOwnershipVerifier.cpp
+++ b/lib/SIL/SILOwnershipVerifier.cpp
@@ -1884,21 +1884,29 @@
});
}
- // Make sure that we do not have any lifetime ending uses left to visit. If we
- // do, then these non lifetime ending uses must be outside of our "alive"
- // blocks implying a use-after free.
+ // Make sure that we do not have any lifetime ending uses left to visit that
+ // are not transitively unreachable blocks. If we do, then these non lifetime
+ // ending uses must be outside of our "alive" blocks implying a use-after
+ // free.
if (!BlocksWithNonLifetimeEndingUses.empty()) {
- return handleError([&] {
- llvm::errs() << "Function: '" << Value->getFunction()->getName() << "'\n"
- << "Found use after free due to unvisited non lifetime "
- "ending uses?!\n"
- << "Value: " << *Value << " Remaining Users:\n";
- for (auto &Pair : BlocksWithNonLifetimeEndingUses) {
- llvm::errs() << "User:" << *Pair.second << "Block: bb"
- << Pair.first->getDebugID() << "\n";
+ for (auto &Pair : BlocksWithNonLifetimeEndingUses) {
+ if (TUB.isUnreachable(Pair.first)) {
+ continue;
}
- llvm::errs() << "\n";
- });
+
+ return handleError([&] {
+ llvm::errs() << "Function: '" << Value->getFunction()->getName()
+ << "'\n"
+ << "Found use after free due to unvisited non lifetime "
+ "ending uses?!\n"
+ << "Value: " << *Value << " Remaining Users:\n";
+ for (auto &Pair : BlocksWithNonLifetimeEndingUses) {
+ llvm::errs() << "User:" << *Pair.second << "Block: bb"
+ << Pair.first->getDebugID() << "\n";
+ }
+ llvm::errs() << "\n";
+ });
+ }
}
return true;
diff --git a/test/SIL/ownership-verifier/unreachable_code.sil b/test/SIL/ownership-verifier/unreachable_code.sil
index fbe963d..4d88955 100644
--- a/test/SIL/ownership-verifier/unreachable_code.sil
+++ b/test/SIL/ownership-verifier/unreachable_code.sil
@@ -128,3 +128,22 @@
%9999 = tuple()
return %9999 : $()
}
+
+sil @test7 : $@convention(thin) (@owned Builtin.NativeObject) -> () {
+bb0(%0 : @owned $Builtin.NativeObject):
+ %1 = begin_borrow %0 : $Builtin.NativeObject
+ cond_br undef, bb1, bb2
+
+bb1:
+ end_borrow %1 from %0 : $Builtin.NativeObject, $Builtin.NativeObject
+ destroy_value %0 : $Builtin.NativeObject
+ %9999 = tuple()
+ return %9999 : $()
+
+bb2:
+ end_borrow %1 from %0 : $Builtin.NativeObject, $Builtin.NativeObject
+ br bb3
+
+bb3:
+ unreachable
+}