================
@@ -858,6 +858,13 @@ void FactsGenerator::handleExitBlock() {
FactMgr.createFact<GlobalEscapeFact>(O.ID, VD));
}
}
+
+ // A borrow captured via [[clang::lifetime_capture_by(this)]] flows into the
+ // never-expiring `this` origin, so it is not otherwise live at the captured
+ // local's expiry. Keep `this` live at exit so the dangle is caught.
+ if (auto ThisOrigins = FactMgr.getOriginMgr().getThisOrigins())
+ EscapesInCurrentBlock.push_back(FactMgr.createFact<ThisEscapeFact>(
+ (*ThisOrigins)->getOuterOriginID(), AC.getDecl()->getEndLoc()));
----------------
NeKon69 wrote:
Can I ask more of a general naming convention question?
As per your comment above, this fact is here only to make sure `this` origin
stays live, then why is the fact named `ThisEscapeFact`? It's not like we 100%
know that something escapes to `this`, we just make the origin there live,
though maybe I am missing something? (the same thing can be said about
`GlobalEscapeFact` and `FieldEscapeFact`, since I feel like they are much
different from `ReturnEscapeFact` where we actually prove that the origin
escapes)
https://github.com/llvm/llvm-project/pull/204630
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits