diff options
author | Aaron Puchert <aaron.puchert@sap.com> | 2019-03-18 23:26:54 +0000 |
---|---|---|
committer | Aaron Puchert <aaron.puchert@sap.com> | 2019-03-18 23:26:54 +0000 |
commit | ad4d52a50140e39cd93c195cf7333460a273f378 (patch) | |
tree | 62312c99b203ff0b26629cb2d79c93d3f64a26bb /clang/lib/Sema/AnalysisBasedWarnings.cpp | |
parent | ed350f73c1dc4a2eab13fc1d08d3ba3fcd0573fb (diff) | |
download | bcm5719-llvm-ad4d52a50140e39cd93c195cf7333460a273f378.tar.gz bcm5719-llvm-ad4d52a50140e39cd93c195cf7333460a273f378.zip |
Thread safety analysis: Add note for unlock kind mismatch
Summary:
Similar to D56967, we add the existing diag::note_locked_here to tell
the user where we saw the locking that isn't matched correctly.
Reviewers: aaron.ballman, delesley
Reviewed By: aaron.ballman
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59455
llvm-svn: 356427
Diffstat (limited to 'clang/lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r-- | clang/lib/Sema/AnalysisBasedWarnings.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp index 6120d2b9df3..00fa33f9602 100644 --- a/clang/lib/Sema/AnalysisBasedWarnings.cpp +++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp @@ -1642,6 +1642,13 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler { return ONS; } + OptionalNotes makeLockedHereNote(SourceLocation LocLocked, StringRef Kind) { + return LocLocked.isValid() + ? getNotes(PartialDiagnosticAt( + LocLocked, S.PDiag(diag::note_locked_here) << Kind)) + : getNotes(); + } + public: ThreadSafetyReporter(Sema &S, SourceLocation FL, SourceLocation FEL) : S(S), FunLocation(FL), FunEndLocation(FEL), @@ -1679,13 +1686,15 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler { void handleIncorrectUnlockKind(StringRef Kind, Name LockName, LockKind Expected, LockKind Received, + SourceLocation LocLocked, SourceLocation Loc) override { if (Loc.isInvalid()) Loc = FunLocation; PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_unlock_kind_mismatch) << Kind << LockName << Received << Expected); - Warnings.emplace_back(std::move(Warning), getNotes()); + Warnings.emplace_back(std::move(Warning), + makeLockedHereNote(LocLocked, Kind)); } void handleDoubleLock(StringRef Kind, Name LockName, SourceLocation LocLocked, @@ -1694,12 +1703,8 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler { Loc = FunLocation; PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_double_lock) << Kind << LockName); - OptionalNotes Notes = - LocLocked.isValid() - ? getNotes(PartialDiagnosticAt( - LocLocked, S.PDiag(diag::note_locked_here) << Kind)) - : getNotes(); - Warnings.emplace_back(std::move(Warning), std::move(Notes)); + Warnings.emplace_back(std::move(Warning), + makeLockedHereNote(LocLocked, Kind)); } void handleMutexHeldEndOfScope(StringRef Kind, Name LockName, @@ -1726,13 +1731,8 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler { PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID) << Kind << LockName); - if (LocLocked.isValid()) { - PartialDiagnosticAt Note(LocLocked, S.PDiag(diag::note_locked_here) - << Kind); - Warnings.emplace_back(std::move(Warning), getNotes(Note)); - return; - } - Warnings.emplace_back(std::move(Warning), getNotes()); + Warnings.emplace_back(std::move(Warning), + makeLockedHereNote(LocLocked, Kind)); } void handleExclusiveAndShared(StringRef Kind, Name LockName, |