llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-analysis Author: Prabhu Rajasekaran (Prabhuk) <details> <summary>Changes</summary> Before emitting warning about locks being held at the end of function scope check if the underlying mutex is function scoped or not. --- Full diff: https://github.com/llvm/llvm-project/pull/157171.diff 1 Files Affected: - (modified) clang/lib/Analysis/ThreadSafety.cpp (+16) ``````````diff diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index 131170df9976e..b215a6e6d74cc 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/lib/Analysis/ThreadSafety.cpp @@ -2443,6 +2443,22 @@ void ThreadSafetyAnalyzer::intersectAndWarn(FactSet &EntrySet, if (join(FactMan[*EntryIt], ExitFact, JoinLoc, EntryLEK)) *EntryIt = Fact; } else if (!ExitFact.managed() || EntryLEK == LEK_LockedAtEndOfFunction) { + if (EntryLEK == LEK_LockedAtEndOfFunction) { + const til::SExpr *Sexp = ExitFact.sexpr(); + const VarDecl *Var = nullptr; + + if (const auto *Proj = dyn_cast<til::Project>(Sexp)) { + if (const auto *Base = dyn_cast<til::LiteralPtr>(Proj->record())) + Var = dyn_cast_or_null<VarDecl>(Base->clangDecl()); + } else if (const auto *LP = dyn_cast<til::LiteralPtr>(Sexp)) { + Var = dyn_cast_or_null<VarDecl>(LP->clangDecl()); + } + + if (Var && Var->getStorageDuration() == SD_Automatic && + Var->getDeclContext() == CurrentFunction) { + continue; + } + } ExitFact.handleRemovalFromIntersection(ExitSet, FactMan, JoinLoc, EntryLEK, Handler); } `````````` </details> https://github.com/llvm/llvm-project/pull/157171 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits