aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Analysis/ThreadSafetyCommon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Analysis/ThreadSafetyCommon.cpp')
-rw-r--r--clang/lib/Analysis/ThreadSafetyCommon.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp
index 25ad673..ef48ae4 100644
--- a/clang/lib/Analysis/ThreadSafetyCommon.cpp
+++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp
@@ -248,9 +248,17 @@ til::SExpr *SExprBuilder::translateVariable(const VarDecl *VD,
// defining VD, use its pre-assignment value to break the cycle.
if (VarsBeingTranslated.contains(VD->getCanonicalDecl()))
return new (Arena) til::LiteralPtr(VD);
- VarsBeingTranslated.insert(VD->getCanonicalDecl());
+
+ // The closure captures state that is updated to correctly translate chains of
+ // aliases. Restore it when we are done with recursive translation.
auto Cleanup = llvm::make_scope_exit(
- [&] { VarsBeingTranslated.erase(VD->getCanonicalDecl()); });
+ [&, RestoreClosure =
+ VarsBeingTranslated.empty() ? LookupLocalVarExpr : nullptr] {
+ VarsBeingTranslated.erase(VD->getCanonicalDecl());
+ if (VarsBeingTranslated.empty())
+ LookupLocalVarExpr = RestoreClosure;
+ });
+ VarsBeingTranslated.insert(VD->getCanonicalDecl());
QualType Ty = VD->getType();
if (!VD->isStaticLocal() && Ty->isPointerType()) {