From: DeLesley Hutchins Date: Wed, 19 Sep 2012 19:18:29 +0000 (+0000) Subject: Thread-safety analysis: fix ICE when EXCLUSIVE_LOCKS_REQUIRED or X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5b280f28351bbdc103cc50d3b0f52f92d286fa0a;p=clang Thread-safety analysis: fix ICE when EXCLUSIVE_LOCKS_REQUIRED or LOCKS_EXCLUDED is used on a method with a name that is is not a simple identifier. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164242 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp index 196d5e1eb3..e7d9a2d642 100644 --- a/lib/Analysis/ThreadSafety.cpp +++ b/lib/Analysis/ThreadSafety.cpp @@ -1794,9 +1794,12 @@ void BuildLockset::warnIfMutexHeld(const NamedDecl *D, Expr* Exp, } LockData* LDat = FSet.findLock(Analyzer->FactMan, Mutex); - if (LDat) - Analyzer->Handler.handleFunExcludesLock(D->getName(), Mutex.toString(), + if (LDat) { + std::string DeclName = D->getNameAsString(); + StringRef DeclNameSR (DeclName); + Analyzer->Handler.handleFunExcludesLock(DeclNameSR, Mutex.toString(), Exp->getExprLoc()); + } } diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index 7455c75c2e..a3aee9afe0 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -1084,7 +1084,7 @@ class ThreadSafetyReporter : public clang::thread_safety::ThreadSafetyHandler { diag::warn_variable_requires_any_lock: diag::warn_var_deref_requires_any_lock; PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) - << D->getName() << getLockKindFromAccessKind(AK)); + << D->getNameAsString() << getLockKindFromAccessKind(AK)); Warnings.push_back(DelayedDiag(Warning, OptionalNotes())); } @@ -1105,7 +1105,7 @@ class ThreadSafetyReporter : public clang::thread_safety::ThreadSafetyHandler { break; } PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) - << D->getName() << LockName << LK); + << D->getNameAsString() << LockName << LK); PartialDiagnosticAt Note(Loc, S.PDiag(diag::note_found_mutex_near_match) << *PossibleMatch); Warnings.push_back(DelayedDiag(Warning, OptionalNotes(1, Note))); @@ -1122,7 +1122,7 @@ class ThreadSafetyReporter : public clang::thread_safety::ThreadSafetyHandler { break; } PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) - << D->getName() << LockName << LK); + << D->getNameAsString() << LockName << LK); Warnings.push_back(DelayedDiag(Warning, OptionalNotes())); } } diff --git a/test/SemaCXX/warn-thread-safety-analysis.cpp b/test/SemaCXX/warn-thread-safety-analysis.cpp index 430df574f3..4e8893d3ca 100644 --- a/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -3380,4 +3380,42 @@ void Bar::test() { }; // end namespace ExprMatchingBugfix +namespace ComplexNameTest { +class Foo { +public: + static Mutex mu_; + + Foo() EXCLUSIVE_LOCKS_REQUIRED(mu_) { } + ~Foo() EXCLUSIVE_LOCKS_REQUIRED(mu_) { } + + int operator[](int i) EXCLUSIVE_LOCKS_REQUIRED(mu_) { return 0; } +}; + +class Bar { +public: + static Mutex mu_; + + Bar() LOCKS_EXCLUDED(mu_) { } + ~Bar() LOCKS_EXCLUDED(mu_) { } + + int operator[](int i) LOCKS_EXCLUDED(mu_) { return 0; } +}; + + +void test1() { + Foo f; // expected-warning {{calling function 'Foo' requires exclusive lock on 'mu_'}} + int a = f[0]; // expected-warning {{calling function 'operator[]' requires exclusive lock on 'mu_'}} +} // expected-warning {{calling function '~Foo' requires exclusive lock on 'mu_'}} + + +void test2() { + Bar::mu_.Lock(); + { + Bar b; // expected-warning {{cannot call function 'Bar' while mutex 'mu_' is locked}} + int a = b[0]; // expected-warning {{cannot call function 'operator[]' while mutex 'mu_' is locked}} + } // expected-warning {{cannot call function '~Bar' while mutex 'mu_' is locked}} + Bar::mu_.Unlock(); +} + +}; // end namespace ComplexNameTest