diff options
-rw-r--r-- | lib/Analysis/ThreadSafety.cpp | 5 | ||||
-rw-r--r-- | test/SemaCXX/warn-thread-safety-analysis.cpp | 40 |
2 files changed, 43 insertions, 2 deletions
diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp index 8875943480..196d5e1eb3 100644 --- a/lib/Analysis/ThreadSafety.cpp +++ b/lib/Analysis/ThreadSafety.cpp @@ -454,7 +454,6 @@ private: void buildSExprFromExpr(Expr *MutexExp, Expr *DeclExp, const NamedDecl *D) { CallingContext CallCtx(D); - if (MutexExp) { if (StringLiteral* SLit = dyn_cast<StringLiteral>(MutexExp)) { if (SLit->getString() == StringRef("*")) @@ -562,7 +561,9 @@ public: bool matches(const SExpr &Other, unsigned i = 0, unsigned j = 0) const { if (NodeVec[i].matches(Other.NodeVec[j])) { - unsigned n = NodeVec[i].arity(); + unsigned ni = NodeVec[i].arity(); + unsigned nj = Other.NodeVec[j].arity(); + unsigned n = (ni < nj) ? ni : nj; bool Result = true; unsigned ci = i+1; // first child of i unsigned cj = j+1; // first child of j diff --git a/test/SemaCXX/warn-thread-safety-analysis.cpp b/test/SemaCXX/warn-thread-safety-analysis.cpp index 463dd7d05b..430df574f3 100644 --- a/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -3341,3 +3341,43 @@ public: } // end namespace TemplateLockReturned +namespace ExprMatchingBugFix { + +class Foo { +public: + Mutex mu_; +}; + + +class Bar { +public: + bool c; + Foo* foo; + Bar(Foo* f) : foo(f) { } + + struct Nested { + Foo* foo; + Nested(Foo* f) : foo(f) { } + + void unlockFoo() UNLOCK_FUNCTION(&Foo::mu_); + }; + + void test(); +}; + + +void Bar::test() { + foo->mu_.Lock(); + if (c) { + Nested *n = new Nested(foo); + n->unlockFoo(); + } + else { + foo->mu_.Unlock(); + } +} + +}; // end namespace ExprMatchingBugfix + + + |