diff options
-rw-r--r-- | clang/lib/Sema/AnalysisBasedWarnings.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 10 |
2 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp index 41b9f3b1a8f..642638bf06f 100644 --- a/clang/lib/Sema/AnalysisBasedWarnings.cpp +++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp @@ -1305,6 +1305,8 @@ static void warnBackEdgeUnequalLocksets(Sema &S, const Lockset LoopReentrySet, static void checkThreadSafety(Sema &S, AnalysisContext &AC) { CFG *CFGraph = AC.getCFG(); if (!CFGraph) return; + const Decl *D = AC.getDecl(); + if (D && D->getAttr<NoThreadSafetyAnalysisAttr>()) return; Lockset::Factory LocksetFactory; diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp index a38d005db5d..a834ee34c77 100644 --- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -314,6 +314,10 @@ class GBFoo { gb_field = 0; // \ // expected-warning {{writing variable 'gb_field' requires lock 'sls_mu' to be held exclusively}} } + + void testNoAnal() __attribute__((no_thread_safety_analysis)) { + gb_field = 0; + } }; GBFoo GlobalGBFoo __attribute__((guarded_by(sls_mu))); @@ -570,6 +574,12 @@ void es_fun_7() { sls_mu.Unlock(); } +void es_fun_8() __attribute__((no_thread_safety_analysis)); + +void es_fun_8() { + Bar.aa_elr_fun_s(); +} + void es_bad_0() { Bar.aa_elr_fun(); // \ // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock 'aa_mu'}} |