================
@@ -438,18 +445,28 @@ void llvm::PointerMayBeCaptured(const Value *V,
CaptureTracker *Tracker,
};
while (!Worklist.empty()) {
const Use *U = Worklist.pop_back_val();
- switch (DetermineUseCaptureKind(*U, IsDereferenceableOrNull)) {
- case UseCaptureKind::NO_CAPTURE:
+ CaptureInfo CI = DetermineUseCaptureKind(*U, IsDereferenceableOrNull);
+ if (capturesNothing(CI))
continue;
- case UseCaptureKind::MAY_CAPTURE:
- if (Tracker->captured(U))
+ CaptureComponents OtherCC = CI.getOtherComponents();
+ CaptureComponents RetCC = CI.getRetComponents();
+ if (capturesAnything(OtherCC)) {
+ switch (Tracker->captured(U, CI)) {
+ case CaptureTracker::Stop:
return;
- continue;
- case UseCaptureKind::PASSTHROUGH:
- if (!AddUses(U->getUser()))
- return;
- continue;
+ case CaptureTracker::ContinueIgnoringReturn:
+ continue;
+ case CaptureTracker::Continue:
+ // Fall through to passthrough handling, but only if RetCC contains
+ // additional components that OtherCC does not.
----------------
goldsteinn wrote:
Whats the reasoning behind this? I think of return/other capture cases as
orthogonal?
https://github.com/llvm/llvm-project/pull/125880
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits