warn-thread-safety-analysis.cpp revision e03b2b3ca9032b18fd1c3d0fca7692e4d2551277
13ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety %s 23ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 3988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define LOCKABLE __attribute__ ((lockable)) 4988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define SCOPED_LOCKABLE __attribute__ ((scoped_lockable)) 5988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define GUARDED_BY(x) __attribute__ ((guarded_by(x))) 6988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define GUARDED_VAR __attribute__ ((guarded_var)) 7988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define PT_GUARDED_BY(x) __attribute__ ((pt_guarded_by(x))) 8988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define PT_GUARDED_VAR __attribute__ ((pt_guarded_var)) 9988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define ACQUIRED_AFTER(...) __attribute__ ((acquired_after(__VA_ARGS__))) 10988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define ACQUIRED_BEFORE(...) __attribute__ ((acquired_before(__VA_ARGS__))) 11988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__ ((exclusive_lock_function(__VA_ARGS__))) 12988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define SHARED_LOCK_FUNCTION(...) __attribute__ ((shared_lock_function(__VA_ARGS__))) 13988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__ ((exclusive_trylock_function(__VA_ARGS__))) 14988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define SHARED_TRYLOCK_FUNCTION(...) __attribute__ ((shared_trylock_function(__VA_ARGS__))) 15988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define UNLOCK_FUNCTION(...) __attribute__ ((unlock_function(__VA_ARGS__))) 16988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define LOCK_RETURNED(x) __attribute__ ((lock_returned(x))) 17988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define LOCKS_EXCLUDED(...) __attribute__ ((locks_excluded(__VA_ARGS__))) 18988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define EXCLUSIVE_LOCKS_REQUIRED(...) \ 19988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski __attribute__ ((exclusive_locks_required(__VA_ARGS__))) 20988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define SHARED_LOCKS_REQUIRED(...) \ 21988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski __attribute__ ((shared_locks_required(__VA_ARGS__))) 22988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski#define NO_THREAD_SAFETY_ANALYSIS __attribute__ ((no_thread_safety_analysis)) 233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------// 253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// Helper fields 263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------// 273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass __attribute__((lockable)) Mutex { 303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski public: 313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void Lock() __attribute__((exclusive_lock_function)); 323ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void ReaderLock() __attribute__((shared_lock_function)); 333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void Unlock() __attribute__((unlock_function)); 343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski bool TryLock() __attribute__((exclusive_trylock_function(true))); 353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski bool ReaderTryLock() __attribute__((shared_trylock_function(true))); 363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void LockWhen(const int &cond) __attribute__((exclusive_lock_function)); 373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}; 383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 391fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchinsclass __attribute__((scoped_lockable)) MutexLock { 401fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins public: 411fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins MutexLock(Mutex *mu) __attribute__((exclusive_lock_function(mu))); 421fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins ~MutexLock() __attribute__((unlock_function)); 431fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins}; 441fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 451fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchinsclass __attribute__((scoped_lockable)) ReaderMutexLock { 461fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins public: 471fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins ReaderMutexLock(Mutex *mu) __attribute__((exclusive_lock_function(mu))); 481fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins ~ReaderMutexLock() __attribute__((unlock_function)); 491fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins}; 501fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 523ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex sls_mu; 533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex sls_mu2 __attribute__((acquired_after(sls_mu))); 553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiint sls_guard_var __attribute__((guarded_var)) = 0; 563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiint sls_guardby_var __attribute__((guarded_by(sls_mu))) = 0; 573ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 583ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskibool getBool(); 593ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 603ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass MutexWrapper { 613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskipublic: 623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski Mutex mu; 63194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski int x __attribute__((guarded_by(mu))); 64194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski void MyLock() __attribute__((exclusive_lock_function(mu))); 653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}; 663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutexWrapper sls_mw; 683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 693ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_0() { 703ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mw.mu.Lock(); 71194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski sls_mw.x = 5; 723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mw.mu.Unlock(); 733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 753ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_2() { 763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski int x = sls_guard_var; 783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 813ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_3() { 823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 833ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guard_var = 2; 843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 853ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 863ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 873ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_4() { 883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); 893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guard_var = 2; 903ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Unlock(); 913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 923ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_5() { 943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 953ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski int x = sls_guardby_var; 963ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 973ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 983ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 993ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_6() { 1003ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1013ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guardby_var = 2; 1023ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1033ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1043ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_7() { 1063ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1073ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); 1083ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Unlock(); 1093ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_8() { 1133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1163ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 1173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1193ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_9() { 1213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 1243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_good_6() { 1293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1323ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_good_7() { 1433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1443ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski while (getBool()) { 1453ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1473ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1493ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski continue; 1503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1523ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 157194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowskivoid sls_fun_good_8() { 158194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski sls_mw.MyLock(); 159194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski sls_mw.mu.Unlock(); 160194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski} 161194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 1623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_1() { 1633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 1648bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 1653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_2() { 1683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1693ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1708bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{locking 'sls_mu' that is already locked}} 1713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_3() { 1753ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1762fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-warning{{mutex 'sls_mu' is still locked at the end of function}} 1773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_4() { 1803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1813ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 18274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of its scope}} 1833ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 1843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); // \ 18574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu2' is still locked at the end of its scope}} 1863ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1873ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_5() { 1893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 19074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of its scope}} 1913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1923ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1953ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_6() { 1963ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1973ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 19874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of its scope}} 1993ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 2003ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 2013ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 2023ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 2033ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 2043ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2063ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 2078bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 2083ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2093ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_7() { 2114e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Lock(); // \ 21274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2134e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski while (getBool()) { 2143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 2163ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 2173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski continue; 2183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2193ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 22174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of its scope}} 2223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_8() { 2274e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Lock(); // \ 22874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski do { 2304e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Unlock(); 2313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } while (getBool()); 2323ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_9() { 2353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski do { 2363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 23774558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } while (getBool()); 2393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_10() { 2433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 2442fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-warning{{mutex 'sls_mu' is still locked at the end of function}} \ 24574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2464e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski while(getBool()) { 2473ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2493ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_11() { 2523ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski while (getBool()) { 2533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 25474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 2578bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 2583ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2593ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2603ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------// 2613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// Handling lock expressions in attribute args 2623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// -------------------------------------------// 2633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2643ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex aa_mu; 2653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass GlobalLocker { 2673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskipublic: 2683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void globalLock() __attribute__((exclusive_lock_function(aa_mu))); 2693ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void globalUnlock() __attribute__((unlock_function(aa_mu))); 2703ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}; 2713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiGlobalLocker glock; 2733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_1() { 2753ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); 2763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); 2773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_1() { 2803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); // \ 2818bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'aa_mu' that was not locked}} 2823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2833ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_2() { 2853ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); 2863ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); // \ 2878bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{locking 'aa_mu' that is already locked}} 2883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); 2893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2903ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_3() { 2923ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); // \ 2932fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-warning{{mutex 'aa_mu' is still locked at the end of function}} 2943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 295b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 296b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//--------------------------------------------------// 297b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Regression tests for unusual method names 298b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//--------------------------------------------------// 299b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 300b4d0a9678f8c592990593233e64c59247f40a74aCaitlin SadowskiMutex wmu; 301b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 302b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Test diagnostics for other method names. 303b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass WeirdMethods { 304b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski WeirdMethods() { 305b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 3062fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-warning {{mutex 'wmu' is still locked at the end of function}} 307b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 308b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ~WeirdMethods() { 309b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 3102fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-warning {{mutex 'wmu' is still locked at the end of function}} 311b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 312b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void operator++() { 313b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 3142fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-warning {{mutex 'wmu' is still locked at the end of function}} 315b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 316b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski operator int*() { 317b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 3182fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-warning {{mutex 'wmu' is still locked at the end of function}} 319b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski return 0; 320b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 321b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 322b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 32305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski//-----------------------------------------------// 32405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski// Errors for guarded by or guarded var variables 32505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski// ----------------------------------------------// 32605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 32705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiint *pgb_gvar __attribute__((pt_guarded_var)); 32805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiint *pgb_var __attribute__((pt_guarded_by(sls_mu))); 32905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 33005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiclass PGBFoo { 33105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski public: 33205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x; 33305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int *pgb_field __attribute__((guarded_by(sls_mu2))) 33405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski __attribute__((pt_guarded_by(sls_mu))); 33505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski void testFoo() { 33605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski pgb_field = &x; // \ 33774558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'pgb_field' requires locking 'sls_mu2' exclusively}} 33874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski *pgb_field = x; // expected-warning {{reading variable 'pgb_field' requires locking 'sls_mu2'}} \ 33974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_field' requires locking 'sls_mu' exclusively}} 34074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski x = *pgb_field; // expected-warning {{reading variable 'pgb_field' requires locking 'sls_mu2'}} \ 34174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_field' requires locking 'sls_mu'}} 34274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski (*pgb_field)++; // expected-warning {{reading variable 'pgb_field' requires locking 'sls_mu2'}} \ 34374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_field' requires locking 'sls_mu' exclusively}} 34405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski } 34505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}; 34605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 34705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiclass GBFoo { 34805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski public: 34905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int gb_field __attribute__((guarded_by(sls_mu))); 35005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 35105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski void testFoo() { 35205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski gb_field = 0; // \ 35374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'gb_field' requires locking 'sls_mu' exclusively}} 35405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski } 355af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 356af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski void testNoAnal() __attribute__((no_thread_safety_analysis)) { 357af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski gb_field = 0; 358af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski } 35905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}; 36005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 36105b436ef550837e2141c55c590fb16010b8658d8Caitlin SadowskiGBFoo GlobalGBFoo __attribute__((guarded_by(sls_mu))); 36205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 36305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_0() { 36405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Lock(); 36505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_var; 36605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Unlock(); 36705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 36805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 36905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_1() { 37005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Lock(); 37105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_var = 2; 37205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Unlock(); 37305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 37405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 37505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_2() { 37605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x; 37705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski pgb_var = &x; 37805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 37905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 38005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_3() { 38105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int *x = pgb_var; 38205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 38305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 38405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_0() { 38505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var = 1; // \ 38674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 38705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 38805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 38905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_1() { 39005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = sls_guard_var; // \ 39174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{reading variable 'sls_guard_var' requires locking any mutex}} 39205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 39305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 39405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_2() { 39505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guardby_var = 1; // \ 39674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'sls_guardby_var' requires locking 'sls_mu' exclusively}} 39705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 39805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 39905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_3() { 40005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = sls_guardby_var; // \ 40174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading variable 'sls_guardby_var' requires locking 'sls_mu'}} 40205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 40305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 40405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_4() { 40505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_gvar = 1; // \ 40674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_gvar' requires locking any mutex exclusively}} 40705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 40805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 40905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_5() { 41005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_gvar; // \ 41174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_gvar' requires locking any mutex}} 41205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 41305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 41405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_6() { 41505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_var = 1; // \ 41674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_var' requires locking 'sls_mu' exclusively}} 41705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 41805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 41905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_7() { 42005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_var; // \ 42174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_var' requires locking 'sls_mu'}} 42205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 42305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 42405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_8() { 42505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski GBFoo G; 42605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski G.gb_field = 0; // \ 42774558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'gb_field' requires locking 'sls_mu'}} 42805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 42905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 43005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_9() { 43105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var++; // \ 43274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 43305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var--; // \ 43474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 43505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski ++sls_guard_var; // \ 43674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 437a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski --sls_guard_var;// \ 43874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 43905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 440b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 441eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//-----------------------------------------------// 442eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// Warnings on variables with late parsed attributes 443eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// ----------------------------------------------// 444eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 445eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass LateFoo { 446eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskipublic: 447eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int a __attribute__((guarded_by(mu))); 448eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int b; 449eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 450eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void foo() __attribute__((exclusive_locks_required(mu))) { } 451eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 452eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void test() { 453eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski a = 0; // \ 45474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 455eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski b = a; // \ 45674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading variable 'a' requires locking 'mu'}} 457eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski c = 0; // \ 45874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'c' requires locking 'mu' exclusively}} 459eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski } 460eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 461eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int c __attribute__((guarded_by(mu))); 462eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 463eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mutex mu; 464eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 465eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 46699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskiclass LateBar { 46799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski public: 46899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int a_ __attribute__((guarded_by(mu1_))); 46999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int b_; 47099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int *q __attribute__((pt_guarded_by(mu))); 47199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu1_; 47299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu; 47399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo Foo; 47499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo Foo2; 47599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo *FooPointer; 47699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}; 47799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 47899107ebc0a5aea953b736e12757e0919d5249d43Caitlin SadowskiLateBar b1, *b3; 47999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 48099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_0() { 48199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo FooA; 48299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo FooB; 48399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.mu.Lock(); 48499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.a = 5; 48599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.mu.Unlock(); 48699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 48799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 48899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_1() { 48999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 49099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Lock(); 49199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->a = 2; 49299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Unlock(); 49399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 49499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 49599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_0() { 49699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo fooA; 49799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo fooB; 49899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooA.mu.Lock(); 49999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooB.a = 5; // \ 50074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 50199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooA.mu.Unlock(); 50299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 50399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 50499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_1() { 50599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu; 50699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski mu.Lock(); 50799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.mu1_.Lock(); 50899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int res = b1.a_ + b3->b_; 50999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b3->b_ = *b1.q; // \ 51074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{reading the value pointed to by 'q' requires locking 'mu'}} 51199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.mu1_.Unlock(); 51299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.b_ = res; 51399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski mu.Unlock(); 51499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 51599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 51699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_2() { 51799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 51899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Lock(); 51999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.a = 2; // \ 52074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 52199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Unlock(); 52299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 52399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 52499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_3() { 52599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 52699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Lock(); 52799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->a = 2; // \ 52874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 52999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Unlock(); 53099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 53199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 53299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_4() { 53399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 53499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Lock(); 53599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo2.a = 2; // \ 53674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 53799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Unlock(); 53899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 53999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 540a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski//-----------------------------------------------// 541a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski// Extra warnings for shared vs. exclusive locks 542a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski// ----------------------------------------------// 543a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 544a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_0() { 545a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 546a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 547a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 548a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 549a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 550a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 551a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 552a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 553a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_1() { 5544e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.ReaderLock(); // \ 55574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 556a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 557a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 5584e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Lock(); // \ 5594e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 560a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 561a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 562a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 563a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 564a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_3() { 565a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 566a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 567a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 568a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 569a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 570a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 571a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 572a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 573a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_4() { 574a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 575a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); 576a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 577a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); 578a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski int x = sls_guardby_var; 579a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 580a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 581a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 582a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_8() { 583a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 584a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 58574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 586a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 587a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 5888bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 589a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 590a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 591a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 592a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_0() { 5934e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Lock(); // \ 59474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 595a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 596a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 5974e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.ReaderLock(); // \ 5984e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 599a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 600a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 601a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 602a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 603a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_1() { 604a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 605a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 60674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 607a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 608a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 6098bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 610a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 611a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 612a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 613a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 614a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_2() { 615a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 616a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 61774558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 618a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 619a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 6208bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 621a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 622a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 623a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 624978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 625978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski// FIXME: Add support for functions (not only methods) 626978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskiclass LRBar { 627978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski public: 628978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void aa_elr_fun() __attribute__((exclusive_locks_required(aa_mu))); 629978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void aa_elr_fun_s() __attribute__((shared_locks_required(aa_mu))); 630978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void le_fun() __attribute__((locks_excluded(sls_mu))); 631978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}; 632978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 633978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskiclass LRFoo { 634978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski public: 635978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void test() __attribute__((exclusive_locks_required(sls_mu))); 636978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void testShared() __attribute__((shared_locks_required(sls_mu2))); 637978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}; 638978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 639978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid elr_fun() __attribute__((exclusive_locks_required(sls_mu))); 640978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid elr_fun() {} 641978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 642978191e0906606e32965cebcf81627d8e8711b13Caitlin SadowskiLRFoo MyLRFoo; 643978191e0906606e32965cebcf81627d8e8711b13Caitlin SadowskiLRBar Bar; 644978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 645978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_0() { 646978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Lock(); 647978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); 648978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 649978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 650978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 651978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_1() { 652978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Lock(); 653978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); 654978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 655978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 656978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 657978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_2() { 658978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.ReaderLock(); 659978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); 660978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 661978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 662978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 663978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_3() { 664978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 665978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); 666978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 667978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 668978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 669978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_4() { 670978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Lock(); 671978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); 672978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Unlock(); 673978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 674978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 675978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_5() { 676978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.ReaderLock(); 677978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); 678978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Unlock(); 679978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 680978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 681978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_6() { 682978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); 683978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 684978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 685978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_7() { 686978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 687978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski elr_fun(); 688978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 689978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 690978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 691af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowskivoid es_fun_8() __attribute__((no_thread_safety_analysis)); 692af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 693af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowskivoid es_fun_8() { 694af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski Bar.aa_elr_fun_s(); 695af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski} 696af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 697cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowskivoid es_fun_9() __attribute__((shared_locks_required(aa_mu))); 698cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowskivoid es_fun_9() { 699cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski Bar.aa_elr_fun_s(); 700cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski} 701cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski 702cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowskivoid es_fun_10() __attribute__((exclusive_locks_required(aa_mu))); 703cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowskivoid es_fun_10() { 704cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski Bar.aa_elr_fun_s(); 705cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski} 706cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski 707978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_0() { 708978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); // \ 7098bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock on 'aa_mu'}} 710978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 711978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 712978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_1() { 713978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.ReaderLock(); 714978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); // \ 7158bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock on 'aa_mu'}} 716978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 717978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 718978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 719978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_2() { 720978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); // \ 7218bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun_s' requires shared lock on 'aa_mu'}} 722978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 723978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 724978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_3() { 725978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); // \ 7268bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'test' requires exclusive lock on 'sls_mu'}} 727978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 728978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 729978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_4() { 730978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); // \ 7318bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'testShared' requires shared lock on 'sls_mu2'}} 732978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 733978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 734978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_5() { 735978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.ReaderLock(); 736978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); // \ 7378bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'test' requires exclusive lock on 'sls_mu'}} 738978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 739978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 740978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 741978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_6() { 742978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 743978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); // \ 74474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{cannot call function 'le_fun' while mutex 'sls_mu' is locked}} 745978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 746978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 747978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 748978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_7() { 749978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.ReaderLock(); 750978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); // \ 75174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{cannot call function 'le_fun' while mutex 'sls_mu' is locked}} 752978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 753978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 754194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 7558121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 756194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski//-----------------------------------------------// 757194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski// Unparseable lock expressions 758194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski// ----------------------------------------------// 759194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 760194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin SadowskiMutex UPmu; 761194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski// FIXME: add support for lock expressions involving arrays. 762194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin SadowskiMutex mua[5]; 763194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 764f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsint x __attribute__((guarded_by(UPmu = sls_mu))); 765f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsint y __attribute__((guarded_by(mua[0]))); 766194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 767194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 768194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowskivoid testUnparse() { 769f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins x = 5; // \ 770f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning{{cannot resolve lock expression}} 771f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins y = 5; // \ 772f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning{{cannot resolve lock expression}} 773194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski} 774194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 775194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowskivoid testUnparse2() { 776194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski mua[0].Lock(); // \ 777f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning{{cannot resolve lock expression}} 778194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski (&(mua[0]) + 4)->Lock(); // \ 779f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning{{cannot resolve lock expression}} 780194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski} 781194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 782988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 783988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//----------------------------------------------------------------------------// 784988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// The following test cases are ported from the gcc thread safety implementation 785988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// They are each wrapped inside a namespace with the test number of the gcc test 786988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// 787988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// FIXME: add all the gcc tests, once this analysis passes them. 788988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//----------------------------------------------------------------------------// 789988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 790988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//-----------------------------------------// 791988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Good testcases (no errors) 792988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//-----------------------------------------// 793988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 794988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_20 { 795988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 796988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 797988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski static int func1() EXCLUSIVE_LOCKS_REQUIRED(mu1_); 798988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski static int b_ GUARDED_BY(mu1_); 799988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski static Mutex mu1_; 800988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski static int a_ GUARDED_BY(mu1_); 801988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 802988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 803988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar b1; 804988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 805988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Bar::func1() 806988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 807988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int res = 5; 808988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 809988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski if (a_ == 4) 810988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski res = b_; 811988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return res; 812988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 813988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_20 814988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 815988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_22 { 816988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test various usage of GUARDED_BY and PT_GUARDED_BY annotations, especially 817988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// uses in class definitions. 818988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu; 819988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 820988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 821988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 822988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(mu1_); 823988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int b_; 824988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int *q PT_GUARDED_BY(mu); 825988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu1_ ACQUIRED_AFTER(mu); 826988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 827988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 828988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar b1, *b3; 829988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint *p GUARDED_BY(mu) PT_GUARDED_BY(mu); 830988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint res GUARDED_BY(mu) = 5; 831988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 832988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint func(int i) 833988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 834988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 835988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Lock(); 836988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1.mu1_.Lock(); 837988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski res = b1.a_ + b3->b_; 838988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski *p = i; 839988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1.a_ = res + b3->b_; 840988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b3->b_ = *b1.q; 841988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1.mu1_.Unlock(); 842988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1.b_ = res; 843988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x = res; 844988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Unlock(); 845988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return x; 846988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 847988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_22 848988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 849988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_27_modified { 850988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// test lock annotations applied to function definitions 851988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: applied annotations only to function declarations 852988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu1; 853988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu2 ACQUIRED_AFTER(mu1); 854988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 855988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 856988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 857988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int method1(int i) SHARED_LOCKS_REQUIRED(mu2) EXCLUSIVE_LOCKS_REQUIRED(mu1); 858988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 859988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 860988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Foo::method1(int i) { 861988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return i; 862988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 863988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 864988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 865988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint foo(int i) EXCLUSIVE_LOCKS_REQUIRED(mu2) SHARED_LOCKS_REQUIRED(mu1); 866988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint foo(int i) { 867988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return i; 868988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 869988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 870988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskistatic int bar(int i) EXCLUSIVE_LOCKS_REQUIRED(mu1); 871988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskistatic int bar(int i) { 872988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return i; 873988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 874988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 875988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 876988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo a; 877988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 878988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu1.Lock(); 879988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Lock(); 880988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.method1(1); 881988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo(2); 882988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Unlock(); 883988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar(3); 884988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu1.Unlock(); 885988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 886988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_27_modified 887988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 888988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 889988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_38 { 890988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the case where a template member function is annotated with lock 891988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// attributes in a non-template class. 892988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 893988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 894988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void func1(int y) LOCKS_EXCLUDED(mu_); 895988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski template <typename T> void func2(T x) LOCKS_EXCLUDED(mu_); 896988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 897988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 898988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 899988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 900988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFoo *foo; 901988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 902988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 903988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 904988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->func1(5); 905988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->func2(5); 906988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 907988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_38 908988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 909988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_43 { 910988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Tests lock canonicalization 911988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 912988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 913988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu_; 914988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 915988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 916988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass FooBar { 917988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 918988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *foo_; 919988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int GetA() EXCLUSIVE_LOCKS_REQUIRED(foo_->mu_) { return a_; } 920988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(foo_->mu_); 921988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 922988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 923988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFooBar *fb; 924988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 925988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 926988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 927988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 928988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski fb->foo_->mu_->Lock(); 929988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x = fb->GetA(); 930988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski fb->foo_->mu_->Unlock(); 931988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 932988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_43 933988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 934988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_49 { 935988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the support for use of lock expression in the annotations 936988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 937988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 938988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex foo_mu_; 939988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 940988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 941988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 942988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 943988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *foo; 944988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex bar_mu_ ACQUIRED_AFTER(foo->foo_mu_); 945988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 946988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 947988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void Test1() { 948988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->foo_mu_.Lock(); 949988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar_mu_.Lock(); 950988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar_mu_.Unlock(); 951988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->foo_mu_.Unlock(); 952988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 953988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 954988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 955988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 956988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Bar bar; 957988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar.Test1(); 958988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 959988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_49 960988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 961988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_61_modified { 962988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // Modified to fix the compiler errors 963988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // Test the fix for a bug introduced by the support of pass-by-reference 964988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // paramters. 965988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski struct Foo { Foo &operator<< (bool) {return *this;} }; 966988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo &getFoo(); 967988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski struct Bar { Foo &func () {return getFoo();} }; 968988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski struct Bas { void operator& (Foo &) {} }; 969988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void mumble() 970988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski { 971988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Bas() & Bar().func() << "" << ""; 972988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Bas() & Bar().func() << ""; 973988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 974988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_61_modified 975988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 976988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 977988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_65 { 978988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the fix for a bug in the support of allowing reader locks for 979988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// non-const, non-modifying overload functions. (We didn't handle the builtin 980988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// properly.) 981988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskienum MyFlags { 982988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Zero, 983988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski One, 984988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Two, 985988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Three, 986988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Four, 987988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Five, 988988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Six, 989988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Seven, 990988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Eight, 991988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Nine 992988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 993988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 994988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiinline MyFlags 995988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskioperator|(MyFlags a, MyFlags b) 996988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 997988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return MyFlags(static_cast<int>(a) | static_cast<int>(b)); 998988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 999988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1000988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiinline MyFlags& 1001988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskioperator|=(MyFlags& a, MyFlags b) 1002988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1003988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return a = a | b; 1004988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1005988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_65 1006988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1007988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_66_modified { 1008988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: Moved annotation to function defn 1009988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test annotations on out-of-line definitions of member functions where the 1010988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// annotations refer to locks that are also data members in the class. 1011988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu; 1012988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1013988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1014988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1015988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int method1(int i) SHARED_LOCKS_REQUIRED(mu1, mu, mu2); 1016988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int data GUARDED_BY(mu1); 1017988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu1; 1018988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu2; 1019988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1020988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1021988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Foo::method1(int i) 1022988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1023988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return data + i; 1024988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1025988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1026988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1027988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1028988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo a; 1029988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1030988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.mu2->Lock(); 1031988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.mu1->Lock(); 1032988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Lock(); 1033988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.method1(1); 1034988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Unlock(); 1035988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.mu1->Unlock(); 1036988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.mu2->Unlock(); 1037988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1038988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_66_modified 1039988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1040988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_68_modified { 1041988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test a fix to a bug in the delayed name binding with nested template 1042988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// instantiation. We use a stack to make sure a name is not resolved to an 1043988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// inner context. 1044988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskitemplate <typename T> 1045988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 1046988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 1047988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1048988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1049988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskitemplate <typename T> 1050988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1051988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1052988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void func(T x) { 1053988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu_.Lock(); 105423323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins count_ = x; 1055988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu_.Unlock(); 1056988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1057988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1058988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 105923323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins T count_ GUARDED_BY(mu_); 1060988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Bar<T> bar_; 1061988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 1062988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1063988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1064988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1065988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1066988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo<int> *foo; 1067988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->func(5); 1068988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1069988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_68_modified 1070988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1071988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_30_modified { 1072988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test delay parsing of lock attribute arguments with nested classes. 1073988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: trylocks replaced with exclusive_lock_fun 1074988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint a = 0; 1075988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1076988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 1077988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski struct Foo; 1078988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1079988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1080988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void MyLock() EXCLUSIVE_LOCK_FUNCTION(mu); 1081988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1082988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int func() { 1083988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski MyLock(); 1084988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// if (foo == 0) { 1085988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// return 0; 1086988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// } 1087988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a = 5; 1088988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Unlock(); 1089988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return 1; 1090988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1091988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1092988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski class FooBar { 1093988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 1094988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int y; 1095988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski }; 1096988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1097988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1098988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu; 1099988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1100988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1101988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar *bar; 1102988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1103988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1104988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1105988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar->func(); 1106988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1107988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_30_modified 1108988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1109988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_47 { 1110988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the support for annotations on virtual functions. 1111988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// This is a good test case. (i.e. There should be no warning emitted by the 1112988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// compiler.) 1113988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Base { 1114988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1115988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func1() EXCLUSIVE_LOCKS_REQUIRED(mu_); 1116988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func2() LOCKS_EXCLUDED(mu_); 1117988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 1118988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1119988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1120988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Child : public Base { 1121988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1122988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func1() EXCLUSIVE_LOCKS_REQUIRED(mu_); 1123988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func2() LOCKS_EXCLUDED(mu_); 1124988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1125988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1126988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 1127988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Child *c; 1128988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Base *b = c; 1129988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1130988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->mu_.Lock(); 1131988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->func1(); 1132988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->mu_.Unlock(); 1133988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->func2(); 1134988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1135988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->mu_.Lock(); 1136988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->func1(); 1137988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->mu_.Unlock(); 1138988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->func2(); 1139988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1140988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_47 1141988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1142988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//-----------------------------------------// 1143988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Tests which produce errors 1144988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//-----------------------------------------// 1145988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1146988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_13 { 1147988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu1; 1148988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu2; 1149988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1150988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint g GUARDED_BY(mu1); 1151988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint w GUARDED_BY(mu2); 1152988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1153988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1154988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1155988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void bar() LOCKS_EXCLUDED(mu_, mu1); 1156988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int foo() SHARED_LOCKS_REQUIRED(mu_) EXCLUSIVE_LOCKS_REQUIRED(mu2); 1157988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1158988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1159988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(mu_); 1160988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1161988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_ ACQUIRED_AFTER(mu1); 1162988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1163988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1164988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Foo::foo() 1165988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1166988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int res; 1167988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski w = 5.2; 1168988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski res = a_ + 5; 1169988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return res; 1170988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1171988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1172988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid Foo::bar() 1173988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1174988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 1175988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu_.Lock(); 1176988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x = foo(); // expected-warning {{calling function 'foo' requires exclusive lock on 'mu2'}} 1177988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a_ = x + 1; 1178988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu_.Unlock(); 1179988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski if (x > 5) { 1180988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu1.Lock(); 1181988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski g = 2.3; 1182988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu1.Unlock(); 1183988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1184988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1185988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1186988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1187988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1188988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo f1, *f2; 1189988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f1.mu_.Lock(); 119074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski f1.bar(); // expected-warning {{cannot call function 'bar' while mutex 'mu_' is locked}} 1191988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Lock(); 1192988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f1.foo(); 1193988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Unlock(); 1194988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f1.mu_.Unlock(); 1195988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f2->mu_.Lock(); 119674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski f2->bar(); // expected-warning {{cannot call function 'bar' while mutex 'mu_' is locked}} 1197988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f2->mu_.Unlock(); 1198988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Lock(); 1199988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski w = 2.5; 1200988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Unlock(); 1201988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1202988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_13 1203988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1204988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_18_modified { 1205988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: Trylocks removed 1206988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the ability to distnguish between the same lock field of 1207988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// different objects of a class. 1208988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski class Bar { 1209988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1210988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bool MyLock() EXCLUSIVE_LOCK_FUNCTION(mu1_); 1211988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void MyUnlock() UNLOCK_FUNCTION(mu1_); 1212988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(mu1_); 1213988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1214988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1215988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu1_; 1216988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1217988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1218988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar *b1, *b2; 1219988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1220988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid func() 1221988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1222988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1->MyLock(); 1223988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1->a_ = 5; 122474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b2->a_ = 3; // expected-warning {{writing variable 'a_' requires locking 'mu1_' exclusively}} 1225988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b2->MyLock(); 1226988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b2->MyUnlock(); 1227988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1->MyUnlock(); 1228988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1229988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_18_modified 1230988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1231988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_21 { 1232988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test various usage of GUARDED_BY and PT_GUARDED_BY annotations, especially 1233988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// uses in class definitions. 1234988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu; 1235988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1236988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 1237988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1238988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(mu1_); 1239988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int b_; 1240988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int *q PT_GUARDED_BY(mu); 1241988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu1_ ACQUIRED_AFTER(mu); 1242988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1243988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1244988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar b1, *b3; 1245988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint *p GUARDED_BY(mu) PT_GUARDED_BY(mu); 1246988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1247988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint res GUARDED_BY(mu) = 5; 1248988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1249988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint func(int i) 1250988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1251988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 1252988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b3->mu1_.Lock(); 125374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski res = b1.a_ + b3->b_; // expected-warning {{reading variable 'a_' requires locking 'mu1_'}} \ 125474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'res' requires locking 'mu' exclusively}} 125574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski *p = i; // expected-warning {{reading variable 'p' requires locking 'mu'}} \ 125674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'p' requires locking 'mu' exclusively}} 125774558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b1.a_ = res + b3->b_; // expected-warning {{reading variable 'res' requires locking 'mu'}} \ 125874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'a_' requires locking 'mu1_' exclusively}} 125974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b3->b_ = *b1.q; // expected-warning {{reading the value pointed to by 'q' requires locking 'mu'}} 1260988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b3->mu1_.Unlock(); 126174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b1.b_ = res; // expected-warning {{reading variable 'res' requires locking 'mu'}} 126274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski x = res; // expected-warning {{reading variable 'res' requires locking 'mu'}} 1263988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return x; 1264988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1265988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_21 1266988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1267988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_35_modified { 1268988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the analyzer's ability to distinguish the lock field of different 1269988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// objects. 1270988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1271988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1272988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex lock_; 1273988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(lock_); 1274988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1275988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1276988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void Func(Foo* child) LOCKS_EXCLUDED(lock_) { 1277988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *new_foo = new Foo; 1278988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1279988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski lock_.Lock(); 1280988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1281988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->Func(new_foo); // There shouldn't be any warning here as the 1282988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // acquired lock is not in child. 1283988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->bar(7); // expected-warning {{calling function 'bar' requires exclusive lock on 'lock_'}} 128474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski child->a_ = 5; // expected-warning {{writing variable 'a_' requires locking 'lock_' exclusively}} 1285988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski lock_.Unlock(); 1286988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1287988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1288988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void bar(int y) EXCLUSIVE_LOCKS_REQUIRED(lock_) { 1289988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a_ = y; 1290988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1291988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1292988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1293988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFoo *x; 1294988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1295988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 1296988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *child = new Foo; 1297988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x->Func(child); 1298988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1299988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_35_modified 1300988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1301988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_36_modified { 1302988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified to move the annotations to function defns. 1303988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the analyzer's ability to distinguish the lock field of different 1304988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// objects 1305988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1306988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1307988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex lock_; 1308988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(lock_); 1309988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1310988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1311988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void Func(Foo* child) LOCKS_EXCLUDED(lock_); 1312988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void bar(int y) EXCLUSIVE_LOCKS_REQUIRED(lock_); 1313988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1314988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1315988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid Foo::Func(Foo* child) { 1316988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *new_foo = new Foo; 1317988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1318988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski lock_.Lock(); 1319988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1320988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->lock_.Lock(); 132174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski child->Func(new_foo); // expected-warning {{cannot call function 'Func' while mutex 'lock_' is locked}} 1322988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->bar(7); 1323988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->a_ = 5; 1324988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->lock_.Unlock(); 1325988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1326988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski lock_.Unlock(); 1327988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1328988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1329988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid Foo::bar(int y) { 1330988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a_ = y; 1331988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1332988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1333988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1334988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFoo *x; 1335988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1336988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 1337988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *child = new Foo; 1338988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x->Func(child); 1339988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1340988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_36_modified 1341988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1342988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1343988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_42 { 1344988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test support of multiple lock attributes of the same kind on a decl. 1345988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1346988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1347988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu1, mu2, mu3; 1348988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x GUARDED_BY(mu1) GUARDED_BY(mu2); 1349988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int y GUARDED_BY(mu2); 1350988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1351988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void f2() LOCKS_EXCLUDED(mu1) LOCKS_EXCLUDED(mu2) LOCKS_EXCLUDED(mu3) { 1352988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Lock(); 1353988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski y = 2; 1354988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Unlock(); 1355988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1356988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1357988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1358988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void f1() EXCLUSIVE_LOCKS_REQUIRED(mu2) EXCLUSIVE_LOCKS_REQUIRED(mu1) { 1359988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x = 5; 136074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski f2(); // expected-warning {{cannot call function 'f2' while mutex 'mu1' is locked}} \ 136174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{cannot call function 'f2' while mutex 'mu2' is locked}} 1362988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1363988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1364988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1365988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFoo *foo; 1366988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1367988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid func() 1368988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1369988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->f1(); // expected-warning {{calling function 'f1' requires exclusive lock on 'mu2'}} \ 1370988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // expected-warning {{calling function 'f1' requires exclusive lock on 'mu1'}} 1371988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1372988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_42 1373988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1374988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_46 { 1375988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the support for annotations on virtual functions. 1376988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Base { 1377988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1378988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func1() EXCLUSIVE_LOCKS_REQUIRED(mu_); 1379988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func2() LOCKS_EXCLUDED(mu_); 1380988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 1381988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1382988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1383988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Child : public Base { 1384988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1385988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func1() EXCLUSIVE_LOCKS_REQUIRED(mu_); 1386988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func2() LOCKS_EXCLUDED(mu_); 1387988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1388988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1389988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 1390988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Child *c; 1391988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Base *b = c; 1392988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1393988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->func1(); // expected-warning {{calling function 'func1' requires exclusive lock on 'mu_'}} 1394988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->mu_.Lock(); 139574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b->func2(); // expected-warning {{cannot call function 'func2' while mutex 'mu_' is locked}} 1396988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->mu_.Unlock(); 1397988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1398988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->func1(); // expected-warning {{calling function 'func1' requires exclusive lock on 'mu_'}} 1399988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->mu_.Lock(); 140074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski c->func2(); // expected-warning {{cannot call function 'func2' while mutex 'mu_' is locked}} 1401988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->mu_.Unlock(); 1402988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1403988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_46 1404988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1405988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_67_modified { 1406988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: attributes on definitions moved to declarations 1407988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test annotations on out-of-line definitions of member functions where the 1408988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// annotations refer to locks that are also data members in the class. 1409988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu; 1410988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu3; 1411988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1412988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1413988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1414988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int method1(int i) SHARED_LOCKS_REQUIRED(mu1, mu, mu2, mu3); 1415988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int data GUARDED_BY(mu1); 1416988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu1; 1417988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu2; 1418988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1419988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1420988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Foo::method1(int i) { 1421988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return data + i; 1422988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1423988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1424988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1425988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1426988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo a; 1427988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.method1(1); // expected-warning {{calling function 'method1' requires shared lock on 'mu1'}} \ 1428988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // expected-warning {{calling function 'method1' requires shared lock on 'mu'}} \ 1429988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // expected-warning {{calling function 'method1' requires shared lock on 'mu2'}} \ 1430988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // expected-warning {{calling function 'method1' requires shared lock on 'mu3'}} 1431988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1432988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_67_modified 1433988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1434988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 14358121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchinsnamespace substitution_test { 14368121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins class MyData { 14378121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins public: 14388121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins Mutex mu; 14398121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14408121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void lockData() __attribute__((exclusive_lock_function(mu))) { } 14418121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void unlockData() __attribute__((unlock_function(mu))) { } 14428121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14438121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void doSomething() __attribute__((exclusive_locks_required(mu))) { } 14448121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins }; 14458121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14468121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14478121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins class DataLocker { 14488121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins public: 14498121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void lockData (MyData *d) __attribute__((exclusive_lock_function(d->mu))) { } 14508121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void unlockData(MyData *d) __attribute__((unlock_function(d->mu))) { } 14518121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins }; 14528121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14538121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14548121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins class Foo { 14558121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins public: 14568121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void foo(MyData* d) __attribute__((exclusive_locks_required(d->mu))) { } 14578121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14588121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void bar1(MyData* d) { 14598121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins d->lockData(); 14608121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins foo(d); 14618121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins d->unlockData(); 14628121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins } 14638121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14648121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void bar2(MyData* d) { 14658121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins DataLocker dlr; 14668121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.lockData(d); 14678121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins foo(d); 14688121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.unlockData(d); 14698121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins } 14708121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14718121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void bar3(MyData* d1, MyData* d2) { 14728121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins DataLocker dlr; 14738121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.lockData(d1); // \ 14748121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins // expected-warning {{mutex 'mu' is still locked at the end of function}} 14758121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.unlockData(d2); // \ 14768121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins // expected-warning {{unlocking 'mu' that was not locked}} 14778121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins } 14788121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14798121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void bar4(MyData* d1, MyData* d2) { 14808121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins DataLocker dlr; 14818121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.lockData(d1); 14828121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins foo(d2); // \ 14838121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins // expected-warning {{calling function 'foo' requires exclusive lock on 'mu'}} 14848121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.unlockData(d1); 14858121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins } 14868121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins }; 14878121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins} // end namespace substituation_test 14888121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 1489e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins 1490f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1491e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchinsnamespace constructor_destructor_tests { 1492e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins Mutex fooMu; 1493e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins int myVar GUARDED_BY(fooMu); 1494e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins 1495e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins class Foo { 1496e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins public: 1497e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins Foo() __attribute__((exclusive_lock_function(fooMu))) { } 1498e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins ~Foo() __attribute__((unlock_function(fooMu))) { } 1499e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins }; 1500e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins 1501e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins void fooTest() { 15026db51f707e93816364039a2a904d13d3968c7f05DeLesley Hutchins Foo foo; 1503e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins myVar = 0; 1504e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins } 1505e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins} 1506e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins 1507f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1508f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsnamespace invalid_lock_expression_test { 1509f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1510f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsclass LOCKABLE MyLockable { 1511f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinspublic: 1512f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins MyLockable() __attribute__((exclusive_lock_function)) { } 15136db51f707e93816364039a2a904d13d3968c7f05DeLesley Hutchins ~MyLockable() { } 1514f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins}; 1515f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1516f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins// create an empty lock expression 1517f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsvoid foo() { 1518f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins MyLockable lock; // \ 1519f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning {{cannot resolve lock expression}} 1520f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins} 1521f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1522f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins} // end namespace invalid_lock_expression_test 1523f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 152497f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smithnamespace template_member_test { 1525f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 152697f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith struct S { int n; }; 152797f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith struct T { 152897f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith Mutex m; 152997f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith S *s GUARDED_BY(this->m); 153097f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith }; 1531a01c71191c93691e592c030cc48764e52272eea5Richard Smith Mutex m; 1532a01c71191c93691e592c030cc48764e52272eea5Richard Smith struct U { 1533a01c71191c93691e592c030cc48764e52272eea5Richard Smith union { 1534a01c71191c93691e592c030cc48764e52272eea5Richard Smith int n; 1535a01c71191c93691e592c030cc48764e52272eea5Richard Smith }; 1536a01c71191c93691e592c030cc48764e52272eea5Richard Smith } *u GUARDED_BY(m); 153797f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith 153897f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith template<typename U> 153997f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith struct IndirectLock { 154097f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith int DoNaughtyThings(T *t) { 1541a01c71191c93691e592c030cc48764e52272eea5Richard Smith u->n = 0; // expected-warning {{reading variable 'u' requires locking 'm'}} 154297f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith return t->s->n; // expected-warning {{reading variable 's' requires locking 'm'}} 154397f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith } 154497f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith }; 154597f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith 1546f11e923433b62efb0fbaeb2573e8457f1c4a1b1eRichard Smith template struct IndirectLock<int>; // expected-note {{here}} 154797f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith 1548601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith struct V { 1549601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith void f(int); 1550601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith void f(double); 1551601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith 1552601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith Mutex m; 1553601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith V *p GUARDED_BY(this->m); 1554601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith }; 1555601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith template<typename U> struct W { 1556601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith V v; 1557601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith void f(U u) { 1558601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith v.p->f(u); // expected-warning {{reading variable 'p' requires locking 'm'}} 1559601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith } 1560601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith }; 1561601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith template struct W<int>; // expected-note {{here}} 1562601d2ee8dd783503f9d556e1ed3b107abf196a1eRichard Smith 156397f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith} 15641fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 15651fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchinsnamespace test_scoped_lockable { 15661fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 15671fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchinsstruct TestScopedLockable { 15681fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins Mutex mu1; 15691fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins Mutex mu2; 15701fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins int a __attribute__((guarded_by(mu1))); 15711fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins int b __attribute__((guarded_by(mu2))); 15721fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 15731fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins bool getBool(); 15741fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 15751fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins void foo1() { 15761fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins MutexLock mulock(&mu1); 15771fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins a = 5; 15781fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins } 15791fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 15801fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins void foo2() { 15811fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins ReaderMutexLock mulock1(&mu1); 15821fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins if (getBool()) { 15831fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins MutexLock mulock2a(&mu2); 15841fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins b = a + 1; 15851fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins } 15861fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins else { 15871fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins MutexLock mulock2b(&mu2); 15881fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins b = a + 2; 15891fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins } 15901fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins } 15911fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 15921fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins void foo3() { 15931fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins MutexLock mulock_a(&mu1); 15941fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins MutexLock mulock_b(&mu1); // \ 15951fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins // expected-warning {{locking 'mu1' that is already locked}} 15961fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins } // expected-warning {{unlocking 'mu1' that was not locked}} 15971fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 15981fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins void foo4() { 15991fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins MutexLock mulock1(&mu1), mulock2(&mu2); 16001fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins a = b+1; 16011fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins b = a+1; 16021fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins } 16031fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins}; 16041fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 16051fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins} // end namespace test_scoped_lockable 16061fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 16071fa3c0682a52c45c4ad0be3a82d0c85f26657072DeLesley Hutchins 1608df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchinsnamespace FunctionAttrTest { 1609df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins 1610df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchinsclass Foo { 1611df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchinspublic: 1612df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins Mutex mu_; 1613df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins int a GUARDED_BY(mu_); 1614df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins}; 1615df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins 1616df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley HutchinsFoo fooObj; 1617df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins 1618df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchinsvoid foo() EXCLUSIVE_LOCKS_REQUIRED(fooObj.mu_); 1619df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins 1620df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchinsvoid bar() { 1621df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins foo(); // expected-warning {{calling function 'foo' requires exclusive lock on 'mu_'}} 1622df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins fooObj.mu_.Lock(); 1623df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins foo(); 1624df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins fooObj.mu_.Unlock(); 1625df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins} 1626df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins 1627df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins}; // end namespace FunctionAttrTest 1628df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins 1629df49782c54802ca1a4c1d36d66186aa039f32aecDeLesley Hutchins 1630b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchinsstruct TestTryLock { 1631b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins Mutex mu; 1632b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins int a GUARDED_BY(mu); 1633b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool cond; 1634b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1635b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo1() { 1636b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (mu.TryLock()) { 1637b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 1; 1638b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1639b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1640b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1641b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1642b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo2() { 1643b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (!mu.TryLock()) return; 1644b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 2; 1645b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1646b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1647b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1648b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo3() { 1649b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b = mu.TryLock(); 1650b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (b) { 1651b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 3; 1652b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1653b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1654b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1655b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1656b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo4() { 1657b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b = mu.TryLock(); 1658b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (!b) return; 1659b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 4; 1660b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1661b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1662b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1663b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo5() { 1664b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins while (mu.TryLock()) { 1665b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = a + 1; 1666b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1667b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1668b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1669b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1670b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo6() { 1671b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b = mu.TryLock(); 1672b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins b = !b; 1673b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (b) return; 1674b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 6; 1675b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1676b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1677b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1678b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo7() { 1679b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b1 = mu.TryLock(); 1680b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b2 = !b1; 1681b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b3 = !b2; 1682b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (b3) { 1683b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 7; 1684b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1685b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1686b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1687b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1688b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins // Test use-def chains: join points 1689b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo8() { 1690b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b = mu.TryLock(); 1691b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b2 = b; 1692b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (cond) 1693b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins b = true; 1694b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (b) { // b should be unknown at this point, becuase of the join point 1695b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 8; // expected-warning {{writing variable 'a' requires locking 'mu' exclusively}} 1696b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1697b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (b2) { // b2 should be known at this point. 1698b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 8; 1699b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1700b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1701b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1702b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1703b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins // Test use-def-chains: back edges 1704b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo9() { 1705b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b = mu.TryLock(); 1706b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1707b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins for (int i = 0; i < 10; ++i); 1708b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1709b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (b) { // b is still known, because the loop doesn't alter it 1710b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 9; 1711b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins mu.Unlock(); 1712b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1713b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1714b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1715b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins // Test use-def chains: back edges 1716b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins void foo10() { 1717b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins bool b = mu.TryLock(); 1718b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1719b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins while (cond) { 1720b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins if (b) { // b should be uknown at this point b/c of the loop 1721b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins a = 10; // expected-warning {{writing variable 'a' requires locking 'mu' exclusively}} 1722b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1723b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins b = !b; 1724b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1725b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins } 1726b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins}; // end TestTrylock 1727b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 1728b4fa418a72759dfe34add850837965cbc00626e4DeLesley Hutchins 17297b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinsnamespace TestTemplateAttributeInstantiation { 17307b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17317b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinsclass Foo1 { 17327b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinspublic: 17337b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins Mutex mu_; 17347b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins int a GUARDED_BY(mu_); 17357b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins}; 17367b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17377b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinsclass Foo2 { 17387b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinspublic: 17397b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins int a GUARDED_BY(mu_); 17407b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins Mutex mu_; 17417b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins}; 17427b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17437b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17447b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinsclass Bar { 17457b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinspublic: 17467b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins // Test non-dependent expressions in attributes on template functions 17477b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins template <class T> 17487b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins void barND(Foo1 *foo, T *fooT) EXCLUSIVE_LOCKS_REQUIRED(foo->mu_) { 17497b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins foo->a = 0; 17507b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins } 17517b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17527b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins // Test dependent expressions in attributes on template functions 17537b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins template <class T> 17547b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins void barD(Foo1 *foo, T *fooT) EXCLUSIVE_LOCKS_REQUIRED(fooT->mu_) { 17557b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins fooT->a = 0; 17567b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins } 17577b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins}; 17587b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17597b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17607b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinstemplate <class T> 17617b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinsclass BarT { 17627b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinspublic: 17637b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins Foo1 fooBase; 17647b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins T fooBaseT; 17657b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17667b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins // Test non-dependent expression in ordinary method on template class 17677b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins void barND() EXCLUSIVE_LOCKS_REQUIRED(fooBase.mu_) { 17687b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins fooBase.a = 0; 17697b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins } 17707b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17717b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins // Test dependent expressions in ordinary methods on template class 17727b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins void barD() EXCLUSIVE_LOCKS_REQUIRED(fooBaseT.mu_) { 17737b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins fooBaseT.a = 0; 17747b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins } 17757b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17767b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins // Test dependent expressions in template method in template class 17777b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins template <class T2> 17787b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins void barTD(T2 *fooT) EXCLUSIVE_LOCKS_REQUIRED(fooBaseT.mu_, fooT->mu_) { 17797b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins fooBaseT.a = 0; 17807b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins fooT->a = 0; 17817b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins } 17827b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins}; 17837b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17847b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinstemplate <class T> 17857b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinsclass Cell { 17867b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinspublic: 17877b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins Mutex mu_; 17887b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins // Test dependent guarded_by 17897b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins T data GUARDED_BY(mu_); 17907b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 179123323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins void fooEx() EXCLUSIVE_LOCKS_REQUIRED(mu_) { 17927b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins data = 0; 17937b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins } 17947b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 17957b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins void foo() { 17967b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins mu_.Lock(); 17977b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins data = 0; 17987b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins mu_.Unlock(); 17997b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins } 18007b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins}; 18017b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 18027b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchinsvoid test() { 18037b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins Bar b; 18047b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins BarT<Foo2> bt; 18057b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins Foo1 f1; 18067b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins Foo2 f2; 18077b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 18087b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins f1.mu_.Lock(); 18097b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins f2.mu_.Lock(); 18107b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins bt.fooBase.mu_.Lock(); 18117b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins bt.fooBaseT.mu_.Lock(); 18127b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 18137b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins b.barND(&f1, &f2); 18147b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins b.barD(&f1, &f2); 18157b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins bt.barND(); 18167b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins bt.barD(); 18177b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins bt.barTD(&f2); 18187b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 18197b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins f1.mu_.Unlock(); 18207b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins bt.barTD(&f1); // \ 18217b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins // expected-warning {{calling function 'barTD' requires exclusive lock on 'mu_'}} 18227b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 18237b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins bt.fooBase.mu_.Unlock(); 18247b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins bt.fooBaseT.mu_.Unlock(); 18257b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins f2.mu_.Unlock(); 18267b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 18277b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins Cell<int> cell; 18287b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins cell.data = 0; // \ 18297b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins // expected-warning {{writing variable 'data' requires locking 'mu_' exclusively}} 18307b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins cell.foo(); 183123323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins cell.mu_.Lock(); 183223323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins cell.fooEx(); 183323323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins cell.mu_.Unlock(); 183423323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins} 183523323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 183623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 183723323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchinstemplate <class T> 183823323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchinsclass CellDelayed { 183923323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchinspublic: 184023323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins // Test dependent guarded_by 184123323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins T data GUARDED_BY(mu_); 184223323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 184323323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins void fooEx(CellDelayed<T> *other) EXCLUSIVE_LOCKS_REQUIRED(mu_, other->mu_) { 184423323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins this->data = other->data; 184523323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins } 184623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 184723323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins template <class T2> 184823323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins void fooExT(CellDelayed<T2> *otherT) EXCLUSIVE_LOCKS_REQUIRED(mu_, otherT->mu_) { 184923323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins this->data = otherT->data; 185023323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins } 18517b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 185223323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins void foo() { 185323323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins mu_.Lock(); 185423323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins data = 0; 185523323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins mu_.Unlock(); 185623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins } 185723323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 185823323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins Mutex mu_; 185923323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins}; 186023323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 186123323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchinsvoid testDelayed() { 186223323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins CellDelayed<int> celld; 186323323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins CellDelayed<int> celld2; 186423323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins celld.foo(); 186523323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins celld.mu_.Lock(); 186623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins celld2.mu_.Lock(); 186723323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 186823323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins celld.fooEx(&celld2); 186923323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins celld.fooExT(&celld2); 187023323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 187123323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins celld2.mu_.Unlock(); 187223323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins celld.mu_.Unlock(); 18737b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins} 18747b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 18757b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins}; // end namespace TestTemplateAttributeInstantiation 18767b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 18777b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 1878e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchinsnamespace FunctionDeclDefTest { 1879e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins 1880e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchinsclass Foo { 1881e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchinspublic: 1882e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins Mutex mu_; 1883e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins int a GUARDED_BY(mu_); 1884e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins 1885e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins virtual void foo1(Foo *f_declared) EXCLUSIVE_LOCKS_REQUIRED(f_declared->mu_); 1886e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins}; 1887e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins 1888e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins// EXCLUSIVE_LOCKS_REQUIRED should be applied, and rewritten to f_defined->mu_ 1889e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchinsvoid Foo::foo1(Foo *f_defined) { 1890e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins f_defined->a = 0; 1891e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins}; 1892e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins 1893e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchinsvoid test() { 1894e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins Foo myfoo; 1895e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins myfoo.foo1(&myfoo); // \ 1896e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins // expected-warning {{calling function 'foo1' requires exclusive lock on 'mu_'}} 1897e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins myfoo.mu_.Lock(); 1898e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins myfoo.foo1(&myfoo); 1899e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins myfoo.mu_.Unlock(); 1900e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins} 1901e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins 1902e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins}; 1903e03b2b3ca9032b18fd1c3d0fca7692e4d2551277DeLesley Hutchins 1904