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