]> granicus.if.org Git - clang/commitdiff
Thread safety analysis no longer hands when analyzing a self-referencing initializer.
authorAaron Ballman <aaron@aaronballman.com>
Fri, 24 Aug 2018 18:48:35 +0000 (18:48 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Fri, 24 Aug 2018 18:48:35 +0000 (18:48 +0000)
This fixes PR38640.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@340636 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ThreadSafety.cpp
test/SemaCXX/warn-thread-safety-analysis.cpp

index 74648dfb5eb5781d5d5d7c91412ce8cc45c05f7e..88b3f3c2c10b6ea047a812ec29c926873f7f8874 100644 (file)
@@ -1656,6 +1656,9 @@ void BuildLockset::checkAccess(const Expr *Exp, AccessKind AK,
     const auto *VD = dyn_cast<VarDecl>(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;
       }
index 50d09882282e4155f85400580b3dc4e2d8385934..29408e82b4e1ccf7a7b382e4707e85eb1c394bc0 100644 (file)
@@ -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}}
+}
+}