warn-thread-safety-analysis.cpp revision 99107ebc0a5aea953b736e12757e0919d5249d43
13ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety %s
23ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
33ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
43ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------//
53ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//  Helper fields
63ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------//
73ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
83ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
93ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass  __attribute__((lockable)) Mutex {
103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski public:
113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  void Lock() __attribute__((exclusive_lock_function));
123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  void ReaderLock() __attribute__((shared_lock_function));
133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  void Unlock() __attribute__((unlock_function));
143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  bool TryLock() __attribute__((exclusive_trylock_function(true)));
153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  bool ReaderTryLock() __attribute__((shared_trylock_function(true)));
163ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  void LockWhen(const int &cond) __attribute__((exclusive_lock_function));
173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski};
183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
193ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex sls_mu;
213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex sls_mu2 __attribute__((acquired_after(sls_mu)));
233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiint sls_guard_var __attribute__((guarded_var)) = 0;
243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiint sls_guardby_var __attribute__((guarded_by(sls_mu))) = 0;
253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskibool getBool();
273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass MutexWrapper {
293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskipublic:
303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski   Mutex mu;
313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski   // int x __attribute__((guarded_by(mu))); // FIXME: scoping error
323ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski};
333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutexWrapper sls_mw;
353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_0() {
373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mw.mu.Lock();
383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  // sls_mw.x = 5; // FIXME: turn mu into sls_mw.mu
393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mw.mu.Unlock();
403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_2() {
433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
443ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  int x = sls_guard_var;
453ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
473ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_3() {
493ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_guard_var = 2;
513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
523ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_4() {
553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu2.Lock();
563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_guard_var = 2;
573ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu2.Unlock();
583ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
593ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
603ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_5() {
613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  int x = sls_guardby_var;
633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
643ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_6() {
673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_guardby_var = 2;
693ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
703ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_7() {
733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu2.Lock();
753ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu2.Unlock();
763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_8() {
803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
813ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  if (getBool())
823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Unlock();
833ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  else
843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Unlock();
853ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
863ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
873ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_9() {
883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  if (getBool())
893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock();
903ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  else
913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock();
923ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
953ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_good_6() {
963ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  if (getBool()) {
973ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock();
983ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  } else {
993ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    if (getBool()) {
1003ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski      getBool(); // EMPTY
1013ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    } else {
1023ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski      getBool(); // EMPTY
1033ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    }
1043ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock();
1053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  }
1063ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
1073ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1083ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1093ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_good_7() {
1103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
1113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  while (getBool()) {
1123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Unlock();
1133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    if (getBool()) {
1143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski      if (getBool()) {
1153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski        sls_mu.Lock();
1163ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski        continue;
1173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski      }
1183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    }
1193ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock();
1203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  }
1213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
1223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_1() {
1253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock(); // \
1268bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{unlocking 'sls_mu' that was not locked}}
1273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_2() {
1303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
1313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock(); // \
1328bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{locking 'sls_mu' that is already locked}}
1333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
1343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_3() {
1373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock(); // \
1388bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{mutex 'sls_mu' is still held at the end of function 'sls_fun_bad_3'}}
1393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_4() {
1423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  if (getBool())
1433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock(); // \
1448bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}}
1453ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  else
1463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu2.Lock(); // \
1478bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{mutex 'sls_mu2' is still held at the end of its scope}}
1483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1493ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_5() {
1513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock(); // \
1528bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}}
1533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  if (getBool())
1543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Unlock();
1553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1573ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_6() {
1583ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  if (getBool()) {
1593ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock(); // \
1608bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}}
1613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  } else {
1623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    if (getBool()) {
1633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski      getBool(); // EMPTY
1643ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    } else {
1653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski      getBool(); // EMPTY
1663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    }
1673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  }
1683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock(); // \
1698bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{unlocking 'sls_mu' that was not locked}}
1703ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_7() {
1733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
1743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  while (getBool()) { // \
1758bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{expecting lock on 'sls_mu' to be held at start of each loop}}
1763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Unlock();
1773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    if (getBool()) {
1783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski      if (getBool()) {
1793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski        continue;
1803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski      }
1813ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    }
1823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock(); // \
1838bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}}
1843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  }
1853ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
1863ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1873ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_8() {
1893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock();
1903ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  do {
1913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Unlock();  // \
1928bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{expecting lock on 'sls_mu' to be held at start of each loop}}
1933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  } while (getBool());
1943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
1953ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
1963ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_9() {
1973ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  do {
1983ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock(); // \
1998bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}}
2003ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  } while (getBool());
2013ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock();
2023ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
2033ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2043ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_10() {
2053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Lock(); // \
2068bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{mutex 'sls_mu' is still held at the end of function 'sls_fun_bad_10'}}
2073ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  while(getBool()) { // \
2088bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{expecting lock on 'sls_mu' to be held at start of each loop}}
2093ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Unlock();
2103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  }
2113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
2123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_11() {
2143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  while (getBool()) {
2153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski    sls_mu.Lock(); // \
2168bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}}
2173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  }
2183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  sls_mu.Unlock(); // \
2198bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{unlocking 'sls_mu' that was not locked}}
2203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
2213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------//
2233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// Handling lock expressions in attribute args
2243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// -------------------------------------------//
2253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex aa_mu;
2273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass GlobalLocker {
2293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskipublic:
2303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  void globalLock() __attribute__((exclusive_lock_function(aa_mu)));
2313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  void globalUnlock() __attribute__((unlock_function(aa_mu)));
2323ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski};
2333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiGlobalLocker glock;
2353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_1() {
2373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  glock.globalLock();
2383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  glock.globalUnlock();
2393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
2403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_1() {
2423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  glock.globalUnlock(); // \
2438bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{unlocking 'aa_mu' that was not locked}}
2443ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
2453ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_2() {
2473ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  glock.globalLock();
2483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  glock.globalLock(); // \
2498bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{locking 'aa_mu' that is already locked}}
2503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  glock.globalUnlock();
2513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
2523ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski
2533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_3() {
2543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski  glock.globalLock(); // \
2558bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning{{mutex 'aa_mu' is still held at the end of function 'aa_fun_bad_3'}}
2563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}
257b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski
258b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//--------------------------------------------------//
259b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Regression tests for unusual method names
260b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//--------------------------------------------------//
261b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski
262b4d0a9678f8c592990593233e64c59247f40a74aCaitlin SadowskiMutex wmu;
263b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski
264b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Test diagnostics for other method names.
265b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass WeirdMethods {
266b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski  WeirdMethods() {
267b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski    wmu.Lock(); // \
2688bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{mutex 'wmu' is still held at the end of function 'WeirdMethods'}}
269b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski  }
270b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski  ~WeirdMethods() {
271b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski    wmu.Lock(); // \
2728bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{mutex 'wmu' is still held at the end of function '~WeirdMethods'}}
273b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski  }
274b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski  void operator++() {
275b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski    wmu.Lock(); // \
2768bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{mutex 'wmu' is still held at the end of function 'operator++'}}
277b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski  }
278b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski  operator int*() {
279b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski    wmu.Lock(); // \
2808bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{mutex 'wmu' is still held at the end of function 'operator int *'}}
281b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski    return 0;
282b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski  }
283b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski};
284b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski
28505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski//-----------------------------------------------//
28605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski// Errors for guarded by or guarded var variables
28705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski// ----------------------------------------------//
28805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
28905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiint *pgb_gvar __attribute__((pt_guarded_var));
29005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiint *pgb_var __attribute__((pt_guarded_by(sls_mu)));
29105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
29205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiclass PGBFoo {
29305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski public:
29405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int x;
29505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int *pgb_field __attribute__((guarded_by(sls_mu2)))
29605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski                 __attribute__((pt_guarded_by(sls_mu)));
29705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  void testFoo() {
29805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski    pgb_field = &x; // \
2998bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{writing variable 'pgb_field' requires lock on 'sls_mu2' to be held exclusively}}
3008bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    *pgb_field = x; // expected-warning {{reading variable 'pgb_field' requires lock on 'sls_mu2' to be held}} \
3018bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{writing the value pointed to by 'pgb_field' requires lock on 'sls_mu' to be held exclusively}}
3028bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    x = *pgb_field; // expected-warning {{reading variable 'pgb_field' requires lock on 'sls_mu2' to be held}} \
3038bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{reading the value pointed to by 'pgb_field' requires lock on 'sls_mu' to be held}}
3048bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    (*pgb_field)++; // expected-warning {{reading variable 'pgb_field' requires lock on 'sls_mu2' to be held}} \
3058bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{writing the value pointed to by 'pgb_field' requires lock on 'sls_mu' to be held exclusively}}
30605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  }
30705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski};
30805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
30905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiclass GBFoo {
31005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski public:
31105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int gb_field __attribute__((guarded_by(sls_mu)));
31205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
31305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  void testFoo() {
31405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski    gb_field = 0; // \
3158bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{writing variable 'gb_field' requires lock on 'sls_mu' to be held exclusively}}
31605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  }
317af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski
318af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski  void testNoAnal() __attribute__((no_thread_safety_analysis)) {
319af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski    gb_field = 0;
320af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski  }
32105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski};
32205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
32305b436ef550837e2141c55c590fb16010b8658d8Caitlin SadowskiGBFoo GlobalGBFoo __attribute__((guarded_by(sls_mu)));
32405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
32505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_0() {
32605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  sls_mu.Lock();
32705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int x = *pgb_var;
32805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  sls_mu.Unlock();
32905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
33005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
33105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_1() {
33205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  sls_mu.Lock();
33305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  *pgb_var = 2;
33405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  sls_mu.Unlock();
33505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
33605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
33705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_2() {
33805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int x;
33905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  pgb_var = &x;
34005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
34105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
34205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_3() {
34305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int *x = pgb_var;
34405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
34505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
34605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_0() {
34705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  sls_guard_var = 1; // \
348a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski    // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}}
34905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
35005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
35105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_1() {
35205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int x = sls_guard_var; // \
353a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski    // expected-warning{{reading variable 'sls_guard_var' requires lock on 'any mutex' to be held}}
35405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
35505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
35605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_2() {
35705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  sls_guardby_var = 1; // \
3588bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{writing variable 'sls_guardby_var' requires lock on 'sls_mu' to be held exclusively}}
35905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
36005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
36105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_3() {
36205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int x = sls_guardby_var; // \
3638bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{reading variable 'sls_guardby_var' requires lock on 'sls_mu' to be held}}
36405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
36505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
36605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_4() {
36705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  *pgb_gvar = 1; // \
368a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski    // expected-warning {{writing the value pointed to by 'pgb_gvar' requires lock on 'any mutex' to be held exclusively}}
36905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
37005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
37105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_5() {
37205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int x = *pgb_gvar; // \
373a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski    // expected-warning {{reading the value pointed to by 'pgb_gvar' requires lock on 'any mutex' to be held}}
37405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
37505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
37605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_6() {
37705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  *pgb_var = 1; // \
3788bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{writing the value pointed to by 'pgb_var' requires lock on 'sls_mu' to be held exclusively}}
37905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
38005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
38105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_7() {
38205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  int x = *pgb_var; // \
3838bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{reading the value pointed to by 'pgb_var' requires lock on 'sls_mu' to be held}}
38405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
38505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
38605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_8() {
38705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  GBFoo G;
38805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  G.gb_field = 0; // \
3898bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{writing variable 'gb_field' requires lock on 'sls_mu'}}
39005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
39105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski
39205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_9() {
39305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  sls_guard_var++; // \
394a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski    // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}}
39505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  sls_guard_var--; // \
396a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski    // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}}
39705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski  ++sls_guard_var; // \
398a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski    // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}}
399a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski  --sls_guard_var;// \
400a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski    // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}}
40105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}
402b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski
403eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//-----------------------------------------------//
404eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// Warnings on variables with late parsed attributes
405eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// ----------------------------------------------//
406eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski
407eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass LateFoo {
408eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskipublic:
409eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski  int a __attribute__((guarded_by(mu)));
410eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski  int b;
411eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski
412eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski  void foo() __attribute__((exclusive_locks_required(mu))) { }
413eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski
414eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski  void test() {
415eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski    a = 0; // \
4168bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}}
417eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski    b = a; // \
4188bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{reading variable 'a' requires lock on 'mu' to be held}}
419eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski    c = 0; // \
4208bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{writing variable 'c' requires lock on 'mu' to be held exclusively}}
421eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski  }
422eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski
423eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski  int c __attribute__((guarded_by(mu)));
424eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski
425eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski  Mutex mu;
426eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski};
427eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski
42899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskiclass LateBar {
42999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski public:
43099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  int a_ __attribute__((guarded_by(mu1_)));
43199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  int b_;
43299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  int *q __attribute__((pt_guarded_by(mu)));
43399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  Mutex mu1_;
43499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  Mutex mu;
43599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateFoo Foo;
43699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateFoo Foo2;
43799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateFoo *FooPointer;
43899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski};
43999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
44099107ebc0a5aea953b736e12757e0919d5249d43Caitlin SadowskiLateBar b1, *b3;
44199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
44299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_0() {
44399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateFoo FooA;
44499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateFoo FooB;
44599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  FooA.mu.Lock();
44699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  FooA.a = 5;
44799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  FooA.mu.Unlock();
44899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}
44999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
45099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_1() {
45199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateBar BarA;
45299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.FooPointer->mu.Lock();
45399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.FooPointer->a = 2;
45499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.FooPointer->mu.Unlock();
45599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}
45699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
45799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_0() {
45899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateFoo fooA;
45999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateFoo fooB;
46099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  fooA.mu.Lock();
46199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  fooB.a = 5; // \
46299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski    // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}}
46399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  fooA.mu.Unlock();
46499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}
46599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
46699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_1() {
46799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  Mutex mu;
46899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  mu.Lock();
46999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  b1.mu1_.Lock();
47099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  int res = b1.a_ + b3->b_;
47199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  b3->b_ = *b1.q; // \
47299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski    // expected-warning{{reading the value pointed to by 'q' requires lock on 'mu' to be held}}
47399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  b1.mu1_.Unlock();
47499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  b1.b_ = res;
47599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  mu.Unlock();
47699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}
47799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
47899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_2() {
47999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateBar BarA;
48099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.FooPointer->mu.Lock();
48199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.Foo.a = 2; // \
48299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski    // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}}
48399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.FooPointer->mu.Unlock();
48499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}
48599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
48699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_3() {
48799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateBar BarA;
48899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.Foo.mu.Lock();
48999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.FooPointer->a = 2; // \
49099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski    // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}}
49199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.Foo.mu.Unlock();
49299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}
49399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
49499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_4() {
49599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  LateBar BarA;
49699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.Foo.mu.Lock();
49799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.Foo2.a = 2; // \
49899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski    // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}}
49999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  BarA.Foo.mu.Unlock();
50099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}
50199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski
502a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski//-----------------------------------------------//
503a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski// Extra warnings for shared vs. exclusive locks
504a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski// ----------------------------------------------//
505a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski
506a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_0() {
507a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Lock();
508a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  do {
509a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Unlock();
510a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Lock();
511a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  } while (getBool());
512a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Unlock();
513a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski}
514a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski
515a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_1() {
516a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.ReaderLock();
517a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  do {
518a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Unlock();
519a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Lock(); // \
5208bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}}
521a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  } while (getBool());
522a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Unlock();
523a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski}
524a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski
525a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_3() {
526a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  if (getBool())
527a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Lock();
528a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  else
529a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Lock();
530a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  *pgb_var = 1;
531a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Unlock();
532a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski}
533a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski
534a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_4() {
535a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  if (getBool())
536a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.ReaderLock();
537a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  else
538a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.ReaderLock();
539a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  int x = sls_guardby_var;
540a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Unlock();
541a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski}
542a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski
543a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_8() {
544a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  if (getBool())
545a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Lock(); // \
5468bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}}
547a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  else
548a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.ReaderLock(); // \
5498bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-note {{the other lock of mutex 'sls_mu' is here}}
550a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Unlock();
551a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski}
552a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski
553a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_0() {
554a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Lock();
555a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  do {
556a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Unlock();
557a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.ReaderLock(); // \
5588bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}}
559a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  } while (getBool());
560a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Unlock();
561a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski}
562a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski
563a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_1() {
564a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  if (getBool())
565a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Lock(); // \
5668bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}}
567a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  else
568a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.ReaderLock(); // \
5698bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-note {{the other lock of mutex 'sls_mu' is here}}
570a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  *pgb_var = 1;
571a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Unlock();
572a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski}
573a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski
574a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_2() {
575a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  if (getBool())
576a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.ReaderLock(); // \
5778bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}}
578a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  else
579a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski    sls_mu.Lock(); // \
5808bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski      // expected-note {{the other lock of mutex 'sls_mu' is here}}
581a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  *pgb_var = 1;
582a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski  sls_mu.Unlock();
583a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski}
584978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
585978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski// FIXME: Add support for functions (not only methods)
586978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskiclass LRBar {
587978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski public:
588978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  void aa_elr_fun() __attribute__((exclusive_locks_required(aa_mu)));
589978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  void aa_elr_fun_s() __attribute__((shared_locks_required(aa_mu)));
590978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  void le_fun() __attribute__((locks_excluded(sls_mu)));
591978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski};
592978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
593978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskiclass LRFoo {
594978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski public:
595978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  void test() __attribute__((exclusive_locks_required(sls_mu)));
596978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  void testShared() __attribute__((shared_locks_required(sls_mu2)));
597978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski};
598978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
599978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid elr_fun() __attribute__((exclusive_locks_required(sls_mu)));
600978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid elr_fun() {}
601978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
602978191e0906606e32965cebcf81627d8e8711b13Caitlin SadowskiLRFoo MyLRFoo;
603978191e0906606e32965cebcf81627d8e8711b13Caitlin SadowskiLRBar Bar;
604978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
605978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_0() {
606978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  aa_mu.Lock();
607978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.aa_elr_fun();
608978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  aa_mu.Unlock();
609978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
610978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
611978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_1() {
612978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  aa_mu.Lock();
613978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.aa_elr_fun_s();
614978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  aa_mu.Unlock();
615978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
616978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
617978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_2() {
618978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  aa_mu.ReaderLock();
619978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.aa_elr_fun_s();
620978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  aa_mu.Unlock();
621978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
622978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
623978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_3() {
624978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.Lock();
625978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  MyLRFoo.test();
626978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.Unlock();
627978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
628978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
629978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_4() {
630978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu2.Lock();
631978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  MyLRFoo.testShared();
632978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu2.Unlock();
633978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
634978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
635978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_5() {
636978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu2.ReaderLock();
637978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  MyLRFoo.testShared();
638978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu2.Unlock();
639978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
640978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
641978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_6() {
642978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.le_fun();
643978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
644978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
645978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_7() {
646978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.Lock();
647978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  elr_fun();
648978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.Unlock();
649978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
650978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
651af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowskivoid es_fun_8() __attribute__((no_thread_safety_analysis));
652af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski
653af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowskivoid es_fun_8() {
654af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski  Bar.aa_elr_fun_s();
655af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski}
656af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski
657978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_0() {
658978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.aa_elr_fun(); // \
6598bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock on 'aa_mu'}}
660978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
661978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
662978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_1() {
663978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  aa_mu.ReaderLock();
664978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.aa_elr_fun(); // \
6658bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock on 'aa_mu'}}
666978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  aa_mu.Unlock();
667978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
668978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
669978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_2() {
670978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.aa_elr_fun_s(); // \
6718bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{calling function 'aa_elr_fun_s' requires shared lock on 'aa_mu'}}
672978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
673978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
674978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_3() {
675978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  MyLRFoo.test(); // \
6768bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{calling function 'test' requires exclusive lock on 'sls_mu'}}
677978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
678978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
679978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_4() {
680978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  MyLRFoo.testShared(); // \
6818bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{calling function 'testShared' requires shared lock on 'sls_mu2'}}
682978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
683978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
684978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_5() {
685978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.ReaderLock();
686978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  MyLRFoo.test(); // \
6878bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{calling function 'test' requires exclusive lock on 'sls_mu'}}
688978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.Unlock();
689978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
690978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
691978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_6() {
692978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.Lock();
693978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.le_fun(); // \
6948bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{cannot call function 'le_fun' while holding mutex 'sls_mu'}}
695978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.Unlock();
696978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
697978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski
698978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_7() {
699978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.ReaderLock();
700978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  Bar.le_fun(); // \
7018bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski    // expected-warning {{cannot call function 'le_fun' while holding mutex 'sls_mu'}}
702978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski  sls_mu.Unlock();
703978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}
704