From: Aaron Ballman Date: Fri, 24 Aug 2018 18:48:35 +0000 (+0000) Subject: Thread safety analysis no longer hands when analyzing a self-referencing initializer. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e7c1967e0729d3a9db41b1eeb2b3f73ee44f01c;p=clang Thread safety analysis no longer hands when analyzing a self-referencing initializer. This fixes PR38640. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@340636 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp index 74648dfb5e..88b3f3c2c1 100644 --- a/lib/Analysis/ThreadSafety.cpp +++ b/lib/Analysis/ThreadSafety.cpp @@ -1656,6 +1656,9 @@ void BuildLockset::checkAccess(const Expr *Exp, AccessKind AK, const auto *VD = dyn_cast(DRE->getDecl()->getCanonicalDecl()); if (VD && VD->isLocalVarDecl() && VD->getType()->isReferenceType()) { if (const auto *E = VD->getInit()) { + // Guard against self-initialization. e.g., int &i = i; + if (E == Exp) + break; Exp = E; continue; } diff --git a/test/SemaCXX/warn-thread-safety-analysis.cpp b/test/SemaCXX/warn-thread-safety-analysis.cpp index 50d0988228..29408e82b4 100644 --- a/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -5503,3 +5503,11 @@ namespace ReturnScopedLockable { return ptr->f(); } } + +namespace PR38640 { +void f() { + // Self-referencing assignment previously caused an infinite loop when thread + // safety analysis was enabled. + int &i = i; // expected-warning {{reference 'i' is not yet bound to a value when used within its own initialization}} +} +}