warn-thread-safety-analysis.cpp revision a01c71191c93691e592c030cc48764e52272eea5
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 393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex sls_mu; 413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex sls_mu2 __attribute__((acquired_after(sls_mu))); 433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiint sls_guard_var __attribute__((guarded_var)) = 0; 443ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiint sls_guardby_var __attribute__((guarded_by(sls_mu))) = 0; 453ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskibool getBool(); 473ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass MutexWrapper { 493ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskipublic: 503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski Mutex mu; 51194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski int x __attribute__((guarded_by(mu))); 52194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski void MyLock() __attribute__((exclusive_lock_function(mu))); 533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}; 543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutexWrapper sls_mw; 563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 573ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_0() { 583ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mw.mu.Lock(); 59194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski sls_mw.x = 5; 603ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mw.mu.Unlock(); 613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_2() { 643ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski int x = sls_guard_var; 663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 693ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_3() { 703ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guard_var = 2; 723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 753ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_4() { 763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); 773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guard_var = 2; 783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Unlock(); 793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 813ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_5() { 823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 833ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski int x = sls_guardby_var; 843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 853ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 863ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 873ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_6() { 883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guardby_var = 2; 903ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 923ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_7() { 943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 953ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); 963ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Unlock(); 973ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 983ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 993ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1003ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_8() { 1013ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1023ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1033ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1043ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 1053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1063ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1073ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1083ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_9() { 1093ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 1123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1163ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_good_6() { 1173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1193ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_good_7() { 1313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1323ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski while (getBool()) { 1333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski continue; 1383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1443ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 145194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowskivoid sls_fun_good_8() { 146194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski sls_mw.MyLock(); 147194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski sls_mw.mu.Unlock(); 148194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski} 149194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 1503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_1() { 1513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 1528bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 1533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_2() { 1563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1573ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1588bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{locking 'sls_mu' that is already locked}} 1593ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1603ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_3() { 1633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 16474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of function 'sls_fun_bad_3'}} 1653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_4() { 1683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1693ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 17074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of its scope}} 1713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 1723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); // \ 17374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu2' is still locked at the end of its scope}} 1743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1753ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_5() { 1773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 17874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of its scope}} 1793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1813ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1833ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_6() { 1843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1853ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 18674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of its scope}} 1873ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1903ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1923ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 1958bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 1963ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1973ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1983ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_7() { 1994e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Lock(); // \ 20074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2014e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski while (getBool()) { 2023ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2033ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 2043ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 2053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski continue; 2063ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2073ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2083ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 20974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of its scope}} 2103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_8() { 2154e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Lock(); // \ 21674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski do { 2184e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Unlock(); 2193ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } while (getBool()); 2203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_9() { 2233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski do { 2243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 22574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } while (getBool()); 2273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_10() { 2313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 23274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still locked at the end of function 'sls_fun_bad_10'}} \ 23374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2344e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski while(getBool()) { 2353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_11() { 2403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski while (getBool()) { 2413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 24274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{expecting mutex 'sls_mu' to be locked at start of each loop}} 2433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2443ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 2458bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 2463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2473ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------// 2493ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// Handling lock expressions in attribute args 2503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// -------------------------------------------// 2513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2523ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex aa_mu; 2533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass GlobalLocker { 2553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskipublic: 2563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void globalLock() __attribute__((exclusive_lock_function(aa_mu))); 2573ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void globalUnlock() __attribute__((unlock_function(aa_mu))); 2583ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}; 2593ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2603ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiGlobalLocker glock; 2613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_1() { 2633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); 2643ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); 2653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_1() { 2683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); // \ 2698bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'aa_mu' that was not locked}} 2703ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_2() { 2733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); 2743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); // \ 2758bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{locking 'aa_mu' that is already locked}} 2763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); 2773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_3() { 2803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); // \ 28174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{mutex 'aa_mu' is still locked at the end of function 'aa_fun_bad_3'}} 2823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 283b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 284b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//--------------------------------------------------// 285b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Regression tests for unusual method names 286b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//--------------------------------------------------// 287b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 288b4d0a9678f8c592990593233e64c59247f40a74aCaitlin SadowskiMutex wmu; 289b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 290b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Test diagnostics for other method names. 291b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass WeirdMethods { 292b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski WeirdMethods() { 293b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 29474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'wmu' is still locked at the end of function 'WeirdMethods'}} 295b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 296b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ~WeirdMethods() { 297b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 29874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'wmu' is still locked at the end of function '~WeirdMethods'}} 299b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 300b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void operator++() { 301b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 30274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'wmu' is still locked at the end of function 'operator++'}} 303b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 304b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski operator int*() { 305b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 30674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'wmu' is still locked at the end of function 'operator int *'}} 307b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski return 0; 308b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 309b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 310b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 31105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski//-----------------------------------------------// 31205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski// Errors for guarded by or guarded var variables 31305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski// ----------------------------------------------// 31405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 31505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiint *pgb_gvar __attribute__((pt_guarded_var)); 31605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiint *pgb_var __attribute__((pt_guarded_by(sls_mu))); 31705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 31805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiclass PGBFoo { 31905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski public: 32005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x; 32105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int *pgb_field __attribute__((guarded_by(sls_mu2))) 32205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski __attribute__((pt_guarded_by(sls_mu))); 32305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski void testFoo() { 32405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski pgb_field = &x; // \ 32574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'pgb_field' requires locking 'sls_mu2' exclusively}} 32674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski *pgb_field = x; // expected-warning {{reading variable 'pgb_field' requires locking 'sls_mu2'}} \ 32774558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_field' requires locking 'sls_mu' exclusively}} 32874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski x = *pgb_field; // expected-warning {{reading variable 'pgb_field' requires locking 'sls_mu2'}} \ 32974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_field' requires locking 'sls_mu'}} 33074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski (*pgb_field)++; // expected-warning {{reading variable 'pgb_field' requires locking 'sls_mu2'}} \ 33174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_field' requires locking 'sls_mu' exclusively}} 33205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski } 33305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}; 33405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 33505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiclass GBFoo { 33605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski public: 33705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int gb_field __attribute__((guarded_by(sls_mu))); 33805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 33905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski void testFoo() { 34005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski gb_field = 0; // \ 34174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'gb_field' requires locking 'sls_mu' exclusively}} 34205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski } 343af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 344af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski void testNoAnal() __attribute__((no_thread_safety_analysis)) { 345af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski gb_field = 0; 346af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski } 34705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}; 34805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 34905b436ef550837e2141c55c590fb16010b8658d8Caitlin SadowskiGBFoo GlobalGBFoo __attribute__((guarded_by(sls_mu))); 35005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 35105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_0() { 35205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Lock(); 35305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_var; 35405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Unlock(); 35505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 35605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 35705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_1() { 35805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Lock(); 35905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_var = 2; 36005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Unlock(); 36105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 36205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 36305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_2() { 36405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x; 36505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski pgb_var = &x; 36605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 36705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 36805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_3() { 36905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int *x = pgb_var; 37005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 37105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 37205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_0() { 37305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var = 1; // \ 37474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 37505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 37605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 37705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_1() { 37805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = sls_guard_var; // \ 37974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{reading variable 'sls_guard_var' requires locking any mutex}} 38005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 38105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 38205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_2() { 38305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guardby_var = 1; // \ 38474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'sls_guardby_var' requires locking 'sls_mu' exclusively}} 38505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 38605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 38705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_3() { 38805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = sls_guardby_var; // \ 38974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading variable 'sls_guardby_var' requires locking 'sls_mu'}} 39005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 39105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 39205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_4() { 39305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_gvar = 1; // \ 39474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_gvar' requires locking any mutex exclusively}} 39505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 39605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 39705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_5() { 39805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_gvar; // \ 39974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_gvar' requires locking any mutex}} 40005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 40105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 40205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_6() { 40305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_var = 1; // \ 40474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_var' requires locking 'sls_mu' exclusively}} 40505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 40605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 40705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_7() { 40805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_var; // \ 40974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_var' requires locking 'sls_mu'}} 41005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 41105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 41205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_8() { 41305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski GBFoo G; 41405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski G.gb_field = 0; // \ 41574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'gb_field' requires locking 'sls_mu'}} 41605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 41705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 41805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_9() { 41905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var++; // \ 42074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 42105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var--; // \ 42274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 42305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski ++sls_guard_var; // \ 42474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 425a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski --sls_guard_var;// \ 42674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires locking any mutex exclusively}} 42705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 428b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 429eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//-----------------------------------------------// 430eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// Warnings on variables with late parsed attributes 431eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// ----------------------------------------------// 432eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 433eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass LateFoo { 434eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskipublic: 435eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int a __attribute__((guarded_by(mu))); 436eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int b; 437eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 438eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void foo() __attribute__((exclusive_locks_required(mu))) { } 439eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 440eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void test() { 441eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski a = 0; // \ 44274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 443eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski b = a; // \ 44474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{reading variable 'a' requires locking 'mu'}} 445eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski c = 0; // \ 44674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'c' requires locking 'mu' exclusively}} 447eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski } 448eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 449eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int c __attribute__((guarded_by(mu))); 450eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 451eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mutex mu; 452eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 453eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 45499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskiclass LateBar { 45599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski public: 45699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int a_ __attribute__((guarded_by(mu1_))); 45799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int b_; 45899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int *q __attribute__((pt_guarded_by(mu))); 45999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu1_; 46099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu; 46199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo Foo; 46299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo Foo2; 46399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo *FooPointer; 46499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}; 46599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 46699107ebc0a5aea953b736e12757e0919d5249d43Caitlin SadowskiLateBar b1, *b3; 46799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 46899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_0() { 46999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo FooA; 47099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo FooB; 47199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.mu.Lock(); 47299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.a = 5; 47399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.mu.Unlock(); 47499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 47599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 47699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_1() { 47799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 47899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Lock(); 47999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->a = 2; 48099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Unlock(); 48199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 48299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 48399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_0() { 48499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo fooA; 48599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo fooB; 48699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooA.mu.Lock(); 48799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooB.a = 5; // \ 48874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 48999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooA.mu.Unlock(); 49099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 49199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 49299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_1() { 49399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu; 49499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski mu.Lock(); 49599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.mu1_.Lock(); 49699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int res = b1.a_ + b3->b_; 49799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b3->b_ = *b1.q; // \ 49874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{reading the value pointed to by 'q' requires locking 'mu'}} 49999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.mu1_.Unlock(); 50099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.b_ = res; 50199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski mu.Unlock(); 50299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 50399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 50499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_2() { 50599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 50699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Lock(); 50799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.a = 2; // \ 50874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 50999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Unlock(); 51099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 51199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 51299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_3() { 51399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 51499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Lock(); 51599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->a = 2; // \ 51674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 51799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Unlock(); 51899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 51999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 52099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_4() { 52199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 52299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Lock(); 52399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo2.a = 2; // \ 52474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning{{writing variable 'a' requires locking 'mu' exclusively}} 52599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Unlock(); 52699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 52799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 528a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski//-----------------------------------------------// 529a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski// Extra warnings for shared vs. exclusive locks 530a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski// ----------------------------------------------// 531a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 532a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_0() { 533a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 534a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 535a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 536a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 537a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 538a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 539a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 540a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 541a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_1() { 5424e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.ReaderLock(); // \ 54374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 544a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 545a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 5464e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Lock(); // \ 5474e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 548a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 549a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 550a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 551a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 552a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_3() { 553a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 554a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 555a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 556a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 557a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 558a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 559a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 560a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 561a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_4() { 562a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 563a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); 564a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 565a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); 566a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski int x = sls_guardby_var; 567a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 568a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 569a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 570a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_8() { 571a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 572a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 57374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 574a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 575a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 5768bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 577a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 578a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 579a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 580a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_0() { 5814e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.Lock(); // \ 58274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 583a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 584a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 5854e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski sls_mu.ReaderLock(); // \ 5864e4bc75d3570835e13183c66ac08974cdc016007Caitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 587a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 588a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 589a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 590a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 591a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_1() { 592a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 593a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 59474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 595a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 596a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 5978bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 598a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 599a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 600a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 601a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 602a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_2() { 603a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 604a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 60574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{mutex 'sls_mu' is locked exclusively and shared in the same scope}} 606a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 607a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 6088bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 609a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 610a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 611a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 612978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 613978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski// FIXME: Add support for functions (not only methods) 614978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskiclass LRBar { 615978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski public: 616978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void aa_elr_fun() __attribute__((exclusive_locks_required(aa_mu))); 617978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void aa_elr_fun_s() __attribute__((shared_locks_required(aa_mu))); 618978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void le_fun() __attribute__((locks_excluded(sls_mu))); 619978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}; 620978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 621978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskiclass LRFoo { 622978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski public: 623978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void test() __attribute__((exclusive_locks_required(sls_mu))); 624978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void testShared() __attribute__((shared_locks_required(sls_mu2))); 625978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}; 626978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 627978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid elr_fun() __attribute__((exclusive_locks_required(sls_mu))); 628978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid elr_fun() {} 629978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 630978191e0906606e32965cebcf81627d8e8711b13Caitlin SadowskiLRFoo MyLRFoo; 631978191e0906606e32965cebcf81627d8e8711b13Caitlin SadowskiLRBar Bar; 632978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 633978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_0() { 634978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Lock(); 635978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); 636978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 637978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 638978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 639978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_1() { 640978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Lock(); 641978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); 642978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 643978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 644978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 645978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_2() { 646978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.ReaderLock(); 647978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); 648978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 649978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 650978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 651978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_3() { 652978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 653978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); 654978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 655978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 656978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 657978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_4() { 658978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Lock(); 659978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); 660978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Unlock(); 661978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 662978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 663978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_5() { 664978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.ReaderLock(); 665978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); 666978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Unlock(); 667978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 668978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 669978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_6() { 670978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); 671978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 672978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 673978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_7() { 674978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 675978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski elr_fun(); 676978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 677978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 678978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 679af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowskivoid es_fun_8() __attribute__((no_thread_safety_analysis)); 680af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 681af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowskivoid es_fun_8() { 682af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski Bar.aa_elr_fun_s(); 683af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski} 684af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 685cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowskivoid es_fun_9() __attribute__((shared_locks_required(aa_mu))); 686cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowskivoid es_fun_9() { 687cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski Bar.aa_elr_fun_s(); 688cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski} 689cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski 690cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowskivoid es_fun_10() __attribute__((exclusive_locks_required(aa_mu))); 691cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowskivoid es_fun_10() { 692cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski Bar.aa_elr_fun_s(); 693cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski} 694cb96751b25a934b22402c1e4e0805db7608a5f2bCaitlin Sadowski 695978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_0() { 696978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); // \ 6978bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock on 'aa_mu'}} 698978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 699978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 700978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_1() { 701978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.ReaderLock(); 702978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); // \ 7038bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock on 'aa_mu'}} 704978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 705978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 706978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 707978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_2() { 708978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); // \ 7098bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun_s' requires shared lock on 'aa_mu'}} 710978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 711978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 712978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_3() { 713978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); // \ 7148bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'test' requires exclusive lock on 'sls_mu'}} 715978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 716978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 717978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_4() { 718978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); // \ 7198bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'testShared' requires shared lock on 'sls_mu2'}} 720978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 721978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 722978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_5() { 723978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.ReaderLock(); 724978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); // \ 7258bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'test' requires exclusive lock on 'sls_mu'}} 726978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 727978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 728978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 729978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_6() { 730978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 731978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); // \ 73274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{cannot call function 'le_fun' while mutex 'sls_mu' is locked}} 733978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 734978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 735978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 736978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_7() { 737978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.ReaderLock(); 738978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); // \ 73974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{cannot call function 'le_fun' while mutex 'sls_mu' is locked}} 740978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 741978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 742194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 7438121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 744194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski//-----------------------------------------------// 745194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski// Unparseable lock expressions 746194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski// ----------------------------------------------// 747194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 748194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin SadowskiMutex UPmu; 749194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski// FIXME: add support for lock expressions involving arrays. 750194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin SadowskiMutex mua[5]; 751194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 752f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsint x __attribute__((guarded_by(UPmu = sls_mu))); 753f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsint y __attribute__((guarded_by(mua[0]))); 754194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 755194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 756194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowskivoid testUnparse() { 757f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins x = 5; // \ 758f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning{{cannot resolve lock expression}} 759f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins y = 5; // \ 760f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning{{cannot resolve lock expression}} 761194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski} 762194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 763194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowskivoid testUnparse2() { 764194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski mua[0].Lock(); // \ 765f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning{{cannot resolve lock expression}} 766194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski (&(mua[0]) + 4)->Lock(); // \ 767f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning{{cannot resolve lock expression}} 768194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski} 769194418f1db5f5f78bc3e614d1e10a863455d882cCaitlin Sadowski 770988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 771988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//----------------------------------------------------------------------------// 772988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// The following test cases are ported from the gcc thread safety implementation 773988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// They are each wrapped inside a namespace with the test number of the gcc test 774988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// 775988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// FIXME: add all the gcc tests, once this analysis passes them. 776988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//----------------------------------------------------------------------------// 777988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 778988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//-----------------------------------------// 779988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Good testcases (no errors) 780988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//-----------------------------------------// 781988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 782988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_20 { 783988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 784988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 785988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski static int func1() EXCLUSIVE_LOCKS_REQUIRED(mu1_); 786988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski static int b_ GUARDED_BY(mu1_); 787988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski static Mutex mu1_; 788988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski static int a_ GUARDED_BY(mu1_); 789988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 790988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 791988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar b1; 792988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 793988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Bar::func1() 794988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 795988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int res = 5; 796988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 797988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski if (a_ == 4) 798988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski res = b_; 799988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return res; 800988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 801988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_20 802988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 803988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_22 { 804988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test various usage of GUARDED_BY and PT_GUARDED_BY annotations, especially 805988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// uses in class definitions. 806988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu; 807988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 808988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 809988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 810988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(mu1_); 811988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int b_; 812988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int *q PT_GUARDED_BY(mu); 813988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu1_ ACQUIRED_AFTER(mu); 814988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 815988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 816988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar b1, *b3; 817988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint *p GUARDED_BY(mu) PT_GUARDED_BY(mu); 818988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint res GUARDED_BY(mu) = 5; 819988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 820988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint func(int i) 821988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 822988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 823988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Lock(); 824988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1.mu1_.Lock(); 825988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski res = b1.a_ + b3->b_; 826988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski *p = i; 827988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1.a_ = res + b3->b_; 828988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b3->b_ = *b1.q; 829988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1.mu1_.Unlock(); 830988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1.b_ = res; 831988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x = res; 832988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Unlock(); 833988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return x; 834988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 835988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_22 836988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 837988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_27_modified { 838988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// test lock annotations applied to function definitions 839988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: applied annotations only to function declarations 840988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu1; 841988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu2 ACQUIRED_AFTER(mu1); 842988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 843988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 844988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 845988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int method1(int i) SHARED_LOCKS_REQUIRED(mu2) EXCLUSIVE_LOCKS_REQUIRED(mu1); 846988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 847988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 848988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Foo::method1(int i) { 849988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return i; 850988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 851988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 852988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 853988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint foo(int i) EXCLUSIVE_LOCKS_REQUIRED(mu2) SHARED_LOCKS_REQUIRED(mu1); 854988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint foo(int i) { 855988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return i; 856988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 857988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 858988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskistatic int bar(int i) EXCLUSIVE_LOCKS_REQUIRED(mu1); 859988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskistatic int bar(int i) { 860988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return i; 861988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 862988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 863988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 864988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo a; 865988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 866988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu1.Lock(); 867988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Lock(); 868988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.method1(1); 869988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo(2); 870988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Unlock(); 871988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar(3); 872988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu1.Unlock(); 873988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 874988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_27_modified 875988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 876988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 877988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_38 { 878988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the case where a template member function is annotated with lock 879988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// attributes in a non-template class. 880988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 881988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 882988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void func1(int y) LOCKS_EXCLUDED(mu_); 883988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski template <typename T> void func2(T x) LOCKS_EXCLUDED(mu_); 884988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 885988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 886988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 887988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 888988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFoo *foo; 889988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 890988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 891988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 892988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->func1(5); 893988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->func2(5); 894988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 895988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_38 896988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 897988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_43 { 898988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Tests lock canonicalization 899988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 900988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 901988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu_; 902988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 903988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 904988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass FooBar { 905988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 906988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *foo_; 907988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int GetA() EXCLUSIVE_LOCKS_REQUIRED(foo_->mu_) { return a_; } 908988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(foo_->mu_); 909988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 910988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 911988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFooBar *fb; 912988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 913988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 914988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 915988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 916988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski fb->foo_->mu_->Lock(); 917988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x = fb->GetA(); 918988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski fb->foo_->mu_->Unlock(); 919988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 920988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_43 921988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 922988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_49 { 923988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the support for use of lock expression in the annotations 924988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 925988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 926988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex foo_mu_; 927988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 928988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 929988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 930988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 931988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *foo; 932988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex bar_mu_ ACQUIRED_AFTER(foo->foo_mu_); 933988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 934988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 935988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void Test1() { 936988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->foo_mu_.Lock(); 937988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar_mu_.Lock(); 938988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar_mu_.Unlock(); 939988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->foo_mu_.Unlock(); 940988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 941988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 942988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 943988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 944988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Bar bar; 945988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar.Test1(); 946988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 947988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_49 948988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 949988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_61_modified { 950988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // Modified to fix the compiler errors 951988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // Test the fix for a bug introduced by the support of pass-by-reference 952988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // paramters. 953988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski struct Foo { Foo &operator<< (bool) {return *this;} }; 954988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo &getFoo(); 955988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski struct Bar { Foo &func () {return getFoo();} }; 956988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski struct Bas { void operator& (Foo &) {} }; 957988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void mumble() 958988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski { 959988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Bas() & Bar().func() << "" << ""; 960988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Bas() & Bar().func() << ""; 961988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 962988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_61_modified 963988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 964988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 965988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_65 { 966988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the fix for a bug in the support of allowing reader locks for 967988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// non-const, non-modifying overload functions. (We didn't handle the builtin 968988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// properly.) 969988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskienum MyFlags { 970988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Zero, 971988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski One, 972988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Two, 973988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Three, 974988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Four, 975988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Five, 976988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Six, 977988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Seven, 978988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Eight, 979988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Nine 980988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 981988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 982988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiinline MyFlags 983988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskioperator|(MyFlags a, MyFlags b) 984988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 985988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return MyFlags(static_cast<int>(a) | static_cast<int>(b)); 986988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 987988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 988988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiinline MyFlags& 989988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskioperator|=(MyFlags& a, MyFlags b) 990988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 991988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return a = a | b; 992988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 993988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_65 994988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 995988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_66_modified { 996988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: Moved annotation to function defn 997988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test annotations on out-of-line definitions of member functions where the 998988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// annotations refer to locks that are also data members in the class. 999988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu; 1000988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1001988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1002988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1003988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int method1(int i) SHARED_LOCKS_REQUIRED(mu1, mu, mu2); 1004988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int data GUARDED_BY(mu1); 1005988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu1; 1006988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu2; 1007988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1008988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1009988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Foo::method1(int i) 1010988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1011988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return data + i; 1012988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1013988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1014988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1015988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1016988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo a; 1017988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1018988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.mu2->Lock(); 1019988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.mu1->Lock(); 1020988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Lock(); 1021988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.method1(1); 1022988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Unlock(); 1023988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.mu1->Unlock(); 1024988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.mu2->Unlock(); 1025988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1026988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_66_modified 1027988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1028988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_68_modified { 1029988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test a fix to a bug in the delayed name binding with nested template 1030988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// instantiation. We use a stack to make sure a name is not resolved to an 1031988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// inner context. 1032988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskitemplate <typename T> 1033988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 1034988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 1035988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1036988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1037988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskitemplate <typename T> 1038988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1039988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1040988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void func(T x) { 1041988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu_.Lock(); 1042988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski count_ = x; 1043988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu_.Unlock(); 1044988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1045988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1046988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1047988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski T count_ GUARDED_BY(mu_); 1048988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Bar<T> bar_; 1049988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 1050988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1051988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1052988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1053988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1054988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo<int> *foo; 1055988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->func(5); 1056988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1057988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_68_modified 1058988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1059988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_30_modified { 1060988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test delay parsing of lock attribute arguments with nested classes. 1061988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: trylocks replaced with exclusive_lock_fun 1062988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint a = 0; 1063988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1064988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 1065988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski struct Foo; 1066988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1067988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1068988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void MyLock() EXCLUSIVE_LOCK_FUNCTION(mu); 1069988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1070988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int func() { 1071988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski MyLock(); 1072988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// if (foo == 0) { 1073988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// return 0; 1074988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// } 1075988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a = 5; 1076988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu.Unlock(); 1077988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return 1; 1078988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1079988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1080988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski class FooBar { 1081988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 1082988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int y; 1083988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski }; 1084988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1085988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1086988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu; 1087988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1088988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1089988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar *bar; 1090988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1091988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1092988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1093988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bar->func(); 1094988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1095988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_30_modified 1096988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1097988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_47 { 1098988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the support for annotations on virtual functions. 1099988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// This is a good test case. (i.e. There should be no warning emitted by the 1100988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// compiler.) 1101988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Base { 1102988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1103988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func1() EXCLUSIVE_LOCKS_REQUIRED(mu_); 1104988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func2() LOCKS_EXCLUDED(mu_); 1105988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 1106988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1107988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1108988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Child : public Base { 1109988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1110988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func1() EXCLUSIVE_LOCKS_REQUIRED(mu_); 1111988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func2() LOCKS_EXCLUDED(mu_); 1112988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1113988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1114988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 1115988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Child *c; 1116988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Base *b = c; 1117988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1118988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->mu_.Lock(); 1119988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->func1(); 1120988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->mu_.Unlock(); 1121988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->func2(); 1122988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1123988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->mu_.Lock(); 1124988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->func1(); 1125988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->mu_.Unlock(); 1126988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->func2(); 1127988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1128988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_47 1129988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1130988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//-----------------------------------------// 1131988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Tests which produce errors 1132988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski//-----------------------------------------// 1133988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1134988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_13 { 1135988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu1; 1136988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu2; 1137988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1138988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint g GUARDED_BY(mu1); 1139988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint w GUARDED_BY(mu2); 1140988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1141988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1142988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1143988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void bar() LOCKS_EXCLUDED(mu_, mu1); 1144988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int foo() SHARED_LOCKS_REQUIRED(mu_) EXCLUSIVE_LOCKS_REQUIRED(mu2); 1145988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1146988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1147988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(mu_); 1148988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1149988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_ ACQUIRED_AFTER(mu1); 1150988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1151988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1152988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Foo::foo() 1153988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1154988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int res; 1155988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski w = 5.2; 1156988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski res = a_ + 5; 1157988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return res; 1158988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1159988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1160988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid Foo::bar() 1161988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1162988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 1163988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu_.Lock(); 1164988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x = foo(); // expected-warning {{calling function 'foo' requires exclusive lock on 'mu2'}} 1165988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a_ = x + 1; 1166988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu_.Unlock(); 1167988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski if (x > 5) { 1168988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu1.Lock(); 1169988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski g = 2.3; 1170988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu1.Unlock(); 1171988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1172988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1173988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1174988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1175988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1176988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo f1, *f2; 1177988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f1.mu_.Lock(); 117874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski f1.bar(); // expected-warning {{cannot call function 'bar' while mutex 'mu_' is locked}} 1179988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Lock(); 1180988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f1.foo(); 1181988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Unlock(); 1182988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f1.mu_.Unlock(); 1183988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f2->mu_.Lock(); 118474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski f2->bar(); // expected-warning {{cannot call function 'bar' while mutex 'mu_' is locked}} 1185988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski f2->mu_.Unlock(); 1186988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Lock(); 1187988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski w = 2.5; 1188988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Unlock(); 1189988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1190988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_13 1191988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1192988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_18_modified { 1193988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: Trylocks removed 1194988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the ability to distnguish between the same lock field of 1195988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// different objects of a class. 1196988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski class Bar { 1197988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1198988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski bool MyLock() EXCLUSIVE_LOCK_FUNCTION(mu1_); 1199988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void MyUnlock() UNLOCK_FUNCTION(mu1_); 1200988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(mu1_); 1201988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1202988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1203988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu1_; 1204988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1205988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1206988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar *b1, *b2; 1207988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1208988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid func() 1209988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1210988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1->MyLock(); 1211988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1->a_ = 5; 121274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b2->a_ = 3; // expected-warning {{writing variable 'a_' requires locking 'mu1_' exclusively}} 1213988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b2->MyLock(); 1214988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b2->MyUnlock(); 1215988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b1->MyUnlock(); 1216988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1217988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_18_modified 1218988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1219988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_21 { 1220988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test various usage of GUARDED_BY and PT_GUARDED_BY annotations, especially 1221988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// uses in class definitions. 1222988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu; 1223988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1224988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Bar { 1225988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1226988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(mu1_); 1227988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int b_; 1228988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int *q PT_GUARDED_BY(mu); 1229988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu1_ ACQUIRED_AFTER(mu); 1230988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1231988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1232988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiBar b1, *b3; 1233988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint *p GUARDED_BY(mu) PT_GUARDED_BY(mu); 1234988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1235988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint res GUARDED_BY(mu) = 5; 1236988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1237988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint func(int i) 1238988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1239988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x; 1240988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b3->mu1_.Lock(); 124174558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski res = b1.a_ + b3->b_; // expected-warning {{reading variable 'a_' requires locking 'mu1_'}} \ 124274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'res' requires locking 'mu' exclusively}} 124374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski *p = i; // expected-warning {{reading variable 'p' requires locking 'mu'}} \ 124474558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing the value pointed to by 'p' requires locking 'mu' exclusively}} 124574558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b1.a_ = res + b3->b_; // expected-warning {{reading variable 'res' requires locking 'mu'}} \ 124674558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{writing variable 'a_' requires locking 'mu1_' exclusively}} 124774558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b3->b_ = *b1.q; // expected-warning {{reading the value pointed to by 'q' requires locking 'mu'}} 1248988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b3->mu1_.Unlock(); 124974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b1.b_ = res; // expected-warning {{reading variable 'res' requires locking 'mu'}} 125074558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski x = res; // expected-warning {{reading variable 'res' requires locking 'mu'}} 1251988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return x; 1252988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1253988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_21 1254988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1255988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_35_modified { 1256988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the analyzer's ability to distinguish the lock field of different 1257988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// objects. 1258988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1259988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1260988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex lock_; 1261988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(lock_); 1262988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1263988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1264988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void Func(Foo* child) LOCKS_EXCLUDED(lock_) { 1265988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *new_foo = new Foo; 1266988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1267988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski lock_.Lock(); 1268988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1269988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->Func(new_foo); // There shouldn't be any warning here as the 1270988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // acquired lock is not in child. 1271988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->bar(7); // expected-warning {{calling function 'bar' requires exclusive lock on 'lock_'}} 127274558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski child->a_ = 5; // expected-warning {{writing variable 'a_' requires locking 'lock_' exclusively}} 1273988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski lock_.Unlock(); 1274988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1275988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1276988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void bar(int y) EXCLUSIVE_LOCKS_REQUIRED(lock_) { 1277988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a_ = y; 1278988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1279988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1280988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1281988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFoo *x; 1282988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1283988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 1284988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *child = new Foo; 1285988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x->Func(child); 1286988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1287988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_35_modified 1288988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1289988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_36_modified { 1290988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified to move the annotations to function defns. 1291988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the analyzer's ability to distinguish the lock field of different 1292988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// objects 1293988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1294988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1295988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex lock_; 1296988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int a_ GUARDED_BY(lock_); 1297988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1298988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1299988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void Func(Foo* child) LOCKS_EXCLUDED(lock_); 1300988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void bar(int y) EXCLUSIVE_LOCKS_REQUIRED(lock_); 1301988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1302988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1303988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid Foo::Func(Foo* child) { 1304988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *new_foo = new Foo; 1305988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1306988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski lock_.Lock(); 1307988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1308988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->lock_.Lock(); 130974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski child->Func(new_foo); // expected-warning {{cannot call function 'Func' while mutex 'lock_' is locked}} 1310988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->bar(7); 1311988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->a_ = 5; 1312988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski child->lock_.Unlock(); 1313988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1314988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski lock_.Unlock(); 1315988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1316988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1317988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid Foo::bar(int y) { 1318988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a_ = y; 1319988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1320988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1321988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1322988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFoo *x; 1323988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1324988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 1325988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo *child = new Foo; 1326988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x->Func(child); 1327988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1328988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_36_modified 1329988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1330988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1331988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_42 { 1332988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test support of multiple lock attributes of the same kind on a decl. 1333988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1334988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski private: 1335988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu1, mu2, mu3; 1336988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int x GUARDED_BY(mu1) GUARDED_BY(mu2); 1337988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int y GUARDED_BY(mu2); 1338988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1339988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void f2() LOCKS_EXCLUDED(mu1) LOCKS_EXCLUDED(mu2) LOCKS_EXCLUDED(mu3) { 1340988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Lock(); 1341988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski y = 2; 1342988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski mu2.Unlock(); 1343988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1344988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1345988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1346988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski void f1() EXCLUSIVE_LOCKS_REQUIRED(mu2) EXCLUSIVE_LOCKS_REQUIRED(mu1) { 1347988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski x = 5; 134874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski f2(); // expected-warning {{cannot call function 'f2' while mutex 'mu1' is locked}} \ 134974558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski // expected-warning {{cannot call function 'f2' while mutex 'mu2' is locked}} 1350988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski } 1351988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1352988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1353988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiFoo *foo; 1354988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1355988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid func() 1356988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1357988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski foo->f1(); // expected-warning {{calling function 'f1' requires exclusive lock on 'mu2'}} \ 1358988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // expected-warning {{calling function 'f1' requires exclusive lock on 'mu1'}} 1359988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1360988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_42 1361988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1362988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_46 { 1363988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test the support for annotations on virtual functions. 1364988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Base { 1365988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1366988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func1() EXCLUSIVE_LOCKS_REQUIRED(mu_); 1367988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func2() LOCKS_EXCLUDED(mu_); 1368988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex mu_; 1369988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1370988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1371988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Child : public Base { 1372988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1373988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func1() EXCLUSIVE_LOCKS_REQUIRED(mu_); 1374988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski virtual void func2() LOCKS_EXCLUDED(mu_); 1375988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1376988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1377988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() { 1378988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Child *c; 1379988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Base *b = c; 1380988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1381988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->func1(); // expected-warning {{calling function 'func1' requires exclusive lock on 'mu_'}} 1382988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->mu_.Lock(); 138374558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski b->func2(); // expected-warning {{cannot call function 'func2' while mutex 'mu_' is locked}} 1384988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski b->mu_.Unlock(); 1385988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1386988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->func1(); // expected-warning {{calling function 'func1' requires exclusive lock on 'mu_'}} 1387988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->mu_.Lock(); 138874558b4c2f4136b0d89bbaa974df1070593b355aCaitlin Sadowski c->func2(); // expected-warning {{cannot call function 'func2' while mutex 'mu_' is locked}} 1389988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski c->mu_.Unlock(); 1390988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1391988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_46 1392988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1393988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskinamespace thread_annot_lock_67_modified { 1394988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Modified: attributes on definitions moved to declarations 1395988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// Test annotations on out-of-line definitions of member functions where the 1396988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski// annotations refer to locks that are also data members in the class. 1397988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu; 1398988b5ae14c2157cef36cc5850b294130846c578eCaitlin SadowskiMutex mu3; 1399988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1400988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiclass Foo { 1401988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski public: 1402988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int method1(int i) SHARED_LOCKS_REQUIRED(mu1, mu, mu2, mu3); 1403988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski int data GUARDED_BY(mu1); 1404988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu1; 1405988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Mutex *mu2; 1406988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski}; 1407988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1408988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskiint Foo::method1(int i) { 1409988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski return data + i; 1410988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1411988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1412988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowskivoid main() 1413988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski{ 1414988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski Foo a; 1415988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski a.method1(1); // expected-warning {{calling function 'method1' requires shared lock on 'mu1'}} \ 1416988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // expected-warning {{calling function 'method1' requires shared lock on 'mu'}} \ 1417988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // expected-warning {{calling function 'method1' requires shared lock on 'mu2'}} \ 1418988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski // expected-warning {{calling function 'method1' requires shared lock on 'mu3'}} 1419988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} 1420988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski} // end namespace thread_annot_lock_67_modified 1421988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 1422988b5ae14c2157cef36cc5850b294130846c578eCaitlin Sadowski 14238121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchinsnamespace substitution_test { 14248121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins class MyData { 14258121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins public: 14268121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins Mutex mu; 14278121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14288121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void lockData() __attribute__((exclusive_lock_function(mu))) { } 14298121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void unlockData() __attribute__((unlock_function(mu))) { } 14308121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14318121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void doSomething() __attribute__((exclusive_locks_required(mu))) { } 14328121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins }; 14338121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14348121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14358121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins class DataLocker { 14368121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins public: 14378121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void lockData (MyData *d) __attribute__((exclusive_lock_function(d->mu))) { } 14388121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void unlockData(MyData *d) __attribute__((unlock_function(d->mu))) { } 14398121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins }; 14408121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14418121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14428121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins class Foo { 14438121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins public: 14448121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void foo(MyData* d) __attribute__((exclusive_locks_required(d->mu))) { } 14458121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14468121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void bar1(MyData* d) { 14478121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins d->lockData(); 14488121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins foo(d); 14498121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins d->unlockData(); 14508121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins } 14518121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14528121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void bar2(MyData* d) { 14538121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins DataLocker dlr; 14548121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.lockData(d); 14558121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins foo(d); 14568121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.unlockData(d); 14578121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins } 14588121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14598121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void bar3(MyData* d1, MyData* d2) { 14608121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins DataLocker dlr; 14618121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.lockData(d1); // \ 14628121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins // expected-warning {{mutex 'mu' is still locked at the end of function}} 14638121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.unlockData(d2); // \ 14648121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins // expected-warning {{unlocking 'mu' that was not locked}} 14658121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins } 14668121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 14678121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins void bar4(MyData* d1, MyData* d2) { 14688121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins DataLocker dlr; 14698121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.lockData(d1); 14708121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins foo(d2); // \ 14718121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins // expected-warning {{calling function 'foo' requires exclusive lock on 'mu'}} 14728121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins dlr.unlockData(d1); 14738121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins } 14748121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins }; 14758121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins} // end namespace substituation_test 14768121639910129a2b59aa85fc597e47cacad8b978DeLesley Hutchins 1477e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins 1478f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1479e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchinsnamespace constructor_destructor_tests { 1480e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins Mutex fooMu; 1481e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins int myVar GUARDED_BY(fooMu); 1482e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins 1483e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins class Foo { 1484e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins public: 1485e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins Foo() __attribute__((exclusive_lock_function(fooMu))) { } 1486e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins ~Foo() __attribute__((unlock_function(fooMu))) { } 1487e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins }; 1488e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins 1489e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins void fooTest() { 14906db51f707e93816364039a2a904d13d3968c7f05DeLesley Hutchins Foo foo; 1491e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins myVar = 0; 1492e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins } 1493e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins} 1494e0eaa8531f8fd9189710aac3b6f3aadb62bb14d1DeLesley Hutchins 1495f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1496f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsnamespace invalid_lock_expression_test { 1497f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1498f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsclass LOCKABLE MyLockable { 1499f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinspublic: 1500f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins MyLockable() __attribute__((exclusive_lock_function)) { } 15016db51f707e93816364039a2a904d13d3968c7f05DeLesley Hutchins ~MyLockable() { } 1502f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins}; 1503f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1504f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins// create an empty lock expression 1505f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchinsvoid foo() { 1506f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins MyLockable lock; // \ 1507f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins // expected-warning {{cannot resolve lock expression}} 1508f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins} 1509f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 1510f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins} // end namespace invalid_lock_expression_test 1511f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 151297f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smithnamespace template_member_test { 1513f1ac63702143d84db778d32eb185a77fc97db5f5DeLesley Hutchins 151497f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith struct S { int n; }; 151597f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith struct T { 151697f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith Mutex m; 151797f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith S *s GUARDED_BY(this->m); 151897f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith }; 1519a01c71191c93691e592c030cc48764e52272eea5Richard Smith Mutex m; 1520a01c71191c93691e592c030cc48764e52272eea5Richard Smith struct U { 1521a01c71191c93691e592c030cc48764e52272eea5Richard Smith union { 1522a01c71191c93691e592c030cc48764e52272eea5Richard Smith int n; 1523a01c71191c93691e592c030cc48764e52272eea5Richard Smith }; 1524a01c71191c93691e592c030cc48764e52272eea5Richard Smith } *u GUARDED_BY(m); 152597f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith 152697f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith template<typename U> 152797f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith struct IndirectLock { 152897f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith int DoNaughtyThings(T *t) { 1529a01c71191c93691e592c030cc48764e52272eea5Richard Smith u->n = 0; // expected-warning {{reading variable 'u' requires locking 'm'}} 153097f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith return t->s->n; // expected-warning {{reading variable 's' requires locking 'm'}} 153197f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith } 153297f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith }; 153397f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith 1534f11e923433b62efb0fbaeb2573e8457f1c4a1b1eRichard Smith template struct IndirectLock<int>; // expected-note {{here}} 153597f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith 153697f9fe06e7acd55d7d9075a41e33f54855c75eaeRichard Smith} 1537