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