================ @@ -139,22 +141,41 @@ class FactEntry : public CapabilityExpr { bool declared() const { return Source == Declared; } bool managed() const { return Source == Managed; } - virtual void - handleRemovalFromIntersection(const FactSet &FSet, FactManager &FactMan, - SourceLocation JoinLoc, LockErrorKind LEK, - ThreadSafetyHandler &Handler) const = 0; + virtual void handleRemovalFromIntersection(FactSet &FSet, + FactManager &FactMan, + SourceLocation JoinLoc, + LockErrorKind LEK, + ThreadSafetyHandler &Handler) = 0; virtual void handleLock(FactSet &FSet, FactManager &FactMan, const FactEntry &entry, - ThreadSafetyHandler &Handler) const = 0; + ThreadSafetyHandler &Handler) = 0; virtual void handleUnlock(FactSet &FSet, FactManager &FactMan, const CapabilityExpr &Cp, SourceLocation UnlockLoc, - bool FullyRemove, - ThreadSafetyHandler &Handler) const = 0; + bool FullyRemove, ThreadSafetyHandler &Handler) = 0; // Return true if LKind >= LK, where exclusive > shared bool isAtLeast(LockKind LK) const { return (LKind == LK_Exclusive) || (LK == LK_Shared); } + + // Return true if we can acquire a capability reentrant. + [[nodiscard]] bool tryReenter(LockKind ReenterKind) { + if (!reentrant()) + return false; + if (kind() != ReenterKind) + return false; + if (++ReentrancyCount == 0) + llvm::report_fatal_error("Maximum reentrancy reached"); ---------------- AaronBallman wrote:
This should use a real diagnostic rather than reporting a fatal error, though I expect no user will ever run into the diagnostic in practice. https://github.com/llvm/llvm-project/pull/137133 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits