1b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety %s 2fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 3cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define LOCKABLE __attribute__ ((lockable)) 4cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define SCOPED_LOCKABLE __attribute__ ((scoped_lockable)) 5cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define GUARDED_BY(x) __attribute__ ((guarded_by(x))) 6cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define GUARDED_VAR __attribute__ ((guarded_var)) 7cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define PT_GUARDED_BY(x) __attribute__ ((pt_guarded_by(x))) 8cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define PT_GUARDED_VAR __attribute__ ((pt_guarded_var)) 9cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define ACQUIRED_AFTER(...) __attribute__ ((acquired_after(__VA_ARGS__))) 10cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define ACQUIRED_BEFORE(...) __attribute__ ((acquired_before(__VA_ARGS__))) 115c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins#define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__ ((exclusive_lock_function(__VA_ARGS__))) 125c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins#define SHARED_LOCK_FUNCTION(...) __attribute__ ((shared_lock_function(__VA_ARGS__))) 135c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins#define ASSERT_EXCLUSIVE_LOCK(...) __attribute__ ((assert_exclusive_lock(__VA_ARGS__))) 145c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins#define ASSERT_SHARED_LOCK(...) __attribute__ ((assert_shared_lock(__VA_ARGS__))) 15cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__ ((exclusive_trylock_function(__VA_ARGS__))) 16cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define SHARED_TRYLOCK_FUNCTION(...) __attribute__ ((shared_trylock_function(__VA_ARGS__))) 17cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define UNLOCK_FUNCTION(...) __attribute__ ((unlock_function(__VA_ARGS__))) 18cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define LOCK_RETURNED(x) __attribute__ ((lock_returned(x))) 19cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define LOCKS_EXCLUDED(...) __attribute__ ((locks_excluded(__VA_ARGS__))) 20cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define EXCLUSIVE_LOCKS_REQUIRED(...) \ 21cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins __attribute__ ((exclusive_locks_required(__VA_ARGS__))) 22cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define SHARED_LOCKS_REQUIRED(...) \ 23cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins __attribute__ ((shared_locks_required(__VA_ARGS__))) 24cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define NO_THREAD_SAFETY_ANALYSIS __attribute__ ((no_thread_safety_analysis)) 25db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 26db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 2764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass LOCKABLE Mutex { 28eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski public: 295c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins void Lock() EXCLUSIVE_LOCK_FUNCTION(); 305c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins void ReaderLock() SHARED_LOCK_FUNCTION(); 315c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins void Unlock() UNLOCK_FUNCTION(); 325c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins 335c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins bool TryLock() EXCLUSIVE_TRYLOCK_FUNCTION(true); 345c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins bool ReaderTryLock() SHARED_TRYLOCK_FUNCTION(true); 355c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins 365c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins void AssertHeld() ASSERT_EXCLUSIVE_LOCK(); 375c6134fd09bc5b738dafdd1c774edde13d95cb20DeLesley Hutchins void AssertReaderHeld() ASSERT_SHARED_LOCK(); 38db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 39db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 40b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass UnlockableMu{ 41b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 42b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 43b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass MuWrapper { 44b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski public: 4564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex mu; 4664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex getMu() { 47b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return mu; 48b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 4964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex * getMuPointer() { 50b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return μ 51b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 52b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 53b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 54b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 55b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass MuDoubleWrapper { 56b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski public: 57b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski MuWrapper* muWrapper; 58b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski MuWrapper* getWrapper() { 59b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return muWrapper; 60b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 61b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 62b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 6364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex mu1; 64b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiUnlockableMu umu; 6564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex mu2; 66b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMuWrapper muWrapper; 67b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMuDoubleWrapper muDoubleWrapper; 6864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex* muPointer; 6964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex** muDoublePointer = & muPointer; 7064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex& muRef = mu1; 71db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 72eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//---------------------------------------// 73eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// Scoping tests 74eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//--------------------------------------// 75eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 76eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Foo { 7764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex foomu; 7864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void needLock() EXCLUSIVE_LOCK_FUNCTION(foomu); 79eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 80eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 81eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Foo2 { 8264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void needLock() EXCLUSIVE_LOCK_FUNCTION(foomu); 8364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex foomu; 84eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 85eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 86eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Bar { 8764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex barmu; 8864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex barmu2 ACQUIRED_AFTER(barmu); 89eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 90eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 91eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 92b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 93b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// No Thread Safety Analysis (noanal) // 94b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 95fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 96fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski// FIXME: Right now we cannot parse attributes put on function definitions 97fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski// We would like to patch this at some point. 98fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 99fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(no_thread_safety_analysis) 100fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support no_thread_safety_analysis attribute" 101fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 102fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 10364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid noanal_fun() NO_THREAD_SAFETY_ANALYSIS; 104fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 1053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid noanal_fun_args() __attribute__((no_thread_safety_analysis(1))); // \ 106baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'no_thread_safety_analysis' attribute takes no arguments}} 107fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 10864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint noanal_testfn(int y) NO_THREAD_SAFETY_ANALYSIS; 109fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 110fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint noanal_testfn(int y) { 11164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x NO_THREAD_SAFETY_ANALYSIS = y; // \ 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions}} 113fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 114fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 115fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 11664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint noanal_test_var NO_THREAD_SAFETY_ANALYSIS; // \ 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions}} 118fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 119fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass NoanalFoo { 120fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 12164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field NO_THREAD_SAFETY_ANALYSIS; // \ 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions}} 12364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() NO_THREAD_SAFETY_ANALYSIS; 124fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 125fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 12664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass NO_THREAD_SAFETY_ANALYSIS NoanalTestClass { // \ 1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions}} 128fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 129fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 13064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid noanal_fun_params(int lvar NO_THREAD_SAFETY_ANALYSIS); // \ 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions}} 132fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 133fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 134b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 135b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Guarded Var Attribute (gv) 136b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 137fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 138fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(guarded_var) 139fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support guarded_var attribute" 140fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 141fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 14264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gv_var_noargs GUARDED_VAR; 143fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 144fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint gv_var_args __attribute__((guarded_var(1))); // \ 145baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'guarded_var' attribute takes no arguments}} 146fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 147fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass GVFoo { 148fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 14964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int gv_field_noargs GUARDED_VAR; 150fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int gv_field_args __attribute__((guarded_var(1))); // \ 151baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'guarded_var' attribute takes no arguments}} 152fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 153fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 15464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass GUARDED_VAR GV { // \ 1553bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 156fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 157fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 15864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid gv_function() GUARDED_VAR; // \ 1593bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 160fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 16164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid gv_function_params(int gv_lvar GUARDED_VAR); // \ 1623bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 163fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 164fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint gv_testfn(int y){ 16564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x GUARDED_VAR = y; // \ 1663bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 167fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 168fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 169fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 170b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 171b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Pt Guarded Var Attribute (pgv) 172b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 173fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 174fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski//FIXME: add support for boost::scoped_ptr<int> fancyptr and references 175fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 176fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(pt_guarded_var) 177fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support pt_guarded_var attribute" 178fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 179fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 18064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint *pgv_pt_var_noargs PT_GUARDED_VAR; 181fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 18264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint pgv_var_noargs PT_GUARDED_VAR; // \ 1833bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' only applies to pointer types; type here is 'int'}} 184fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 185fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass PGVFoo { 186fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 18764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int *pt_field_noargs PT_GUARDED_VAR; 18864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int field_noargs PT_GUARDED_VAR; // \ 1893bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' only applies to pointer types; type here is 'int'}} 190fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int *gv_field_args __attribute__((pt_guarded_var(1))); // \ 191baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'pt_guarded_var' attribute takes no arguments}} 192fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 193fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 19464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass PT_GUARDED_VAR PGV { // \ 1953bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 196fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 197fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 198fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint *pgv_var_args __attribute__((pt_guarded_var(1))); // \ 199baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'pt_guarded_var' attribute takes no arguments}} 200fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 201fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 20264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid pgv_function() PT_GUARDED_VAR; // \ 2033bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 204fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 20564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid pgv_function_params(int *gv_lvar PT_GUARDED_VAR); // \ 2063bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 207fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 208fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid pgv_testfn(int y){ 20964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int *x PT_GUARDED_VAR = new int(0); // \ 2103bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 211fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski delete x; 212fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 213fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 214b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 215b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Lockable Attribute (l) 216b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 217fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 218fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski//FIXME: In future we may want to add support for structs, ObjC classes, etc. 219fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 220fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(lockable) 221fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support lockable attribute" 222fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 223fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 22464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass LOCKABLE LTestClass { 225fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 226fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 227fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((lockable (1))) LTestClass_args { // \ 228baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'lockable' attribute takes no arguments}} 229fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 230fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 23164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid l_test_function() LOCKABLE; // \ 232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lockable' attribute only applies to struct, union or class}} 233fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 234fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint l_testfn(int y) { 23564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x LOCKABLE = y; // \ 236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lockable' attribute only applies to struct, union or class}} 237fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 238fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 239fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 24064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint l_test_var LOCKABLE; // \ 241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lockable' attribute only applies to struct, union or class}} 242fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 243fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass LFoo { 244fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 24564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field LOCKABLE; // \ 246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lockable' attribute only applies to struct, union or class}} 24764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() LOCKABLE; // \ 248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lockable' attribute only applies to struct, union or class}} 249fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 250fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 251fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 25264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid l_function_params(int lvar LOCKABLE); // \ 253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lockable' attribute only applies to struct, union or class}} 254fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 255fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 256b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 257b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Scoped Lockable Attribute (sl) 258b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 259fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 260fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(scoped_lockable) 261fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support scoped_lockable attribute" 262fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 263fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 26464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass SCOPED_LOCKABLE SLTestClass { 265fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 266fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 267fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((scoped_lockable (1))) SLTestClass_args { // \ 268baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'scoped_lockable' attribute takes no arguments}} 269fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 270fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 27164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid sl_test_function() SCOPED_LOCKABLE; // \ 272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'scoped_lockable' attribute only applies to struct, union or class}} 273fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 274fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint sl_testfn(int y) { 27564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x SCOPED_LOCKABLE = y; // \ 276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'scoped_lockable' attribute only applies to struct, union or class}} 277fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 278fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 279fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 28064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint sl_test_var SCOPED_LOCKABLE; // \ 281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'scoped_lockable' attribute only applies to struct, union or class}} 282fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 283fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass SLFoo { 284fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 28564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field SCOPED_LOCKABLE; // \ 286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'scoped_lockable' attribute only applies to struct, union or class}} 28764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() SCOPED_LOCKABLE; // \ 288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'scoped_lockable' attribute only applies to struct, union or class}} 289fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 290fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 291fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 29264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid sl_function_params(int lvar SCOPED_LOCKABLE); // \ 293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'scoped_lockable' attribute only applies to struct, union or class}} 294db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 295db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 296b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 297b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Guarded By Attribute (gb) 298b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 299db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 300b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// FIXME: Eventually, would we like this attribute to take more than 1 arg? 301db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 302db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(guarded_by) 303db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support guarded_by attribute" 304db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 305db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 306db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//1. Check applied to the right types & argument number 307db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 30864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg GUARDED_BY(mu1); 309db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 310f37e4f24c39d0fd3c7f954d2321c4590421907afBenjamin Kramerint gb_non_ascii GUARDED_BY(L"wide"); // expected-warning {{ignoring 'guarded_by' attribute because its argument is invalid}} 311f37e4f24c39d0fd3c7f954d2321c4590421907afBenjamin Kramer 312db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_var_args __attribute__((guarded_by(mu1, mu2))); // \ 313baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'guarded_by' attribute takes one argument}} 314db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 315db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_var_noargs __attribute__((guarded_by)); // \ 316baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'guarded_by' attribute takes one argument}} 317db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 318db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass GBFoo { 319db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 320db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int gb_field_noargs __attribute__((guarded_by)); // \ 321baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'guarded_by' attribute takes one argument}} 32264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int gb_field_args GUARDED_BY(mu1); 323db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 324db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 32564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass GUARDED_BY(mu1) GB { // \ 3263bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 327db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 328db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 32964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid gb_function() GUARDED_BY(mu1); // \ 3303bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 331db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 33264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid gb_function_params(int gv_lvar GUARDED_BY(mu1)); // \ 3333bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 334db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 335db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_testfn(int y){ 33664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x GUARDED_BY(mu1) = y; // \ 3373bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 338db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 339db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 340db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 341b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//2. Check argument parsing. 342b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 343b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 34464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_1 GUARDED_BY(muWrapper.mu); 34564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_2 GUARDED_BY(muDoubleWrapper.muWrapper->mu); 34664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_3 GUARDED_BY(muWrapper.getMu()); 34764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_4 GUARDED_BY(*muWrapper.getMuPointer()); 34864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_5 GUARDED_BY(&mu1); 34964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_6 GUARDED_BY(muRef); 35064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_7 GUARDED_BY(muDoubleWrapper.getWrapper()->getMu()); 35164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_8 GUARDED_BY(muPointer); 352b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 353b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 354b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 35564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_bad_1 GUARDED_BY(1); // \ 356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'guarded_by' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}} 35764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_bad_2 GUARDED_BY("mu"); // \ 358ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'guarded_by' attribute because its argument is invalid}} 35964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_bad_3 GUARDED_BY(muDoublePointer); // \ 360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'guarded_by' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 36164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint gb_var_arg_bad_4 GUARDED_BY(umu); // \ 362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'guarded_by' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'UnlockableMu'}} 363db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 364db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//3. 365db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// Thread Safety analysis tests 366db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 367db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 368b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 369b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Pt Guarded By Attribute (pgb) 370b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 371db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 372db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(pt_guarded_by) 373db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support pt_guarded_by attribute" 374db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 375db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 376db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//1. Check applied to the right types & argument number 377db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 378db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint *pgb_var_noargs __attribute__((pt_guarded_by)); // \ 379baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'pt_guarded_by' attribute takes one argument}} 380db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 38164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint *pgb_ptr_var_arg PT_GUARDED_BY(mu1); 382db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 38364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint *pgb_ptr_var_args __attribute__((pt_guarded_by(mu1, mu2))); // \ 384baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'pt_guarded_by' attribute takes one argument}} 385db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 38664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint pgb_var_args PT_GUARDED_BY(mu1); // \ 3873bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' only applies to pointer types; type here is 'int'}} 388db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 389db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass PGBFoo { 390db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 391db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int *pgb_field_noargs __attribute__((pt_guarded_by)); // \ 392baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'pt_guarded_by' attribute takes one argument}} 39364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int *pgb_field_args PT_GUARDED_BY(mu1); 394db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 395db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 39664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass PT_GUARDED_BY(mu1) PGB { // \ 3973bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 398db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 399db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 40064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid pgb_function() PT_GUARDED_BY(mu1); // \ 4013bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 402db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 40364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid pgb_function_params(int gv_lvar PT_GUARDED_BY(mu1)); // \ 4043bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 405db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 406db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid pgb_testfn(int y){ 40764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int *x PT_GUARDED_BY(mu1) = new int(0); // \ 4083bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 409db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski delete x; 410db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 411db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 412b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//2. Check argument parsing. 413b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 414b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 41564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_1 PT_GUARDED_BY(muWrapper.mu); 41664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_2 PT_GUARDED_BY(muDoubleWrapper.muWrapper->mu); 41764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_3 PT_GUARDED_BY(muWrapper.getMu()); 41864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_4 PT_GUARDED_BY(*muWrapper.getMuPointer()); 41964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_5 PT_GUARDED_BY(&mu1); 42064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_6 PT_GUARDED_BY(muRef); 42164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_7 PT_GUARDED_BY(muDoubleWrapper.getWrapper()->getMu()); 42264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_8 PT_GUARDED_BY(muPointer); 423b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 424b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 425b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 42664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_bad_1 PT_GUARDED_BY(1); // \ 427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'pt_guarded_by' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}} 42864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_bad_2 PT_GUARDED_BY("mu"); // \ 429ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'pt_guarded_by' attribute because its argument is invalid}} 43064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_bad_3 PT_GUARDED_BY(muDoublePointer); // \ 431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'pt_guarded_by' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 43264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint * pgb_var_arg_bad_4 PT_GUARDED_BY(umu); // \ 433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'pt_guarded_by' attribute requires arguments whose type is annotated with 'capability' attribute}} 434b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 435b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 436b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 437b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Acquired After (aa) 438b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 439db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 440db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// FIXME: Would we like this attribute to take more than 1 arg? 441db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 442db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(acquired_after) 443db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support acquired_after attribute" 444db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 445db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 44664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex mu_aa ACQUIRED_AFTER(mu1); 447db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 44864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_noargs __attribute__((acquired_after)); // \ 449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'acquired_after' attribute takes at least 1 argument}} 450db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 451db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass AAFoo { 452db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 45364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex aa_field_noargs __attribute__((acquired_after)); // \ 454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'acquired_after' attribute takes at least 1 argument}} 45564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex aa_field_args ACQUIRED_AFTER(mu1); 456db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 457db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 45864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass ACQUIRED_AFTER(mu1) AA { // \ 4593bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 460db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 461db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 46264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid aa_function() ACQUIRED_AFTER(mu1); // \ 4633bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 464db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 46564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid aa_function_params(int gv_lvar ACQUIRED_AFTER(mu1)); // \ 4663bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 467db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 468db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid aa_testfn(int y){ 46964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex x ACQUIRED_AFTER(mu1) = Mutex(); // \ 4703bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 471db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 472db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 473b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//Check argument parsing. 474b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 475b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 47664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_1 ACQUIRED_AFTER(muWrapper.mu); 47764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_2 ACQUIRED_AFTER(muDoubleWrapper.muWrapper->mu); 47864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_3 ACQUIRED_AFTER(muWrapper.getMu()); 47964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_4 ACQUIRED_AFTER(*muWrapper.getMuPointer()); 48064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_5 ACQUIRED_AFTER(&mu1); 48164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_6 ACQUIRED_AFTER(muRef); 48264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_7 ACQUIRED_AFTER(muDoubleWrapper.getWrapper()->getMu()); 48364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_8 ACQUIRED_AFTER(muPointer); 484b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 485b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 486b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 48764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_bad_1 ACQUIRED_AFTER(1); // \ 488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'acquired_after' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}} 48964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_bad_2 ACQUIRED_AFTER("mu"); // \ 490ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'acquired_after' attribute because its argument is invalid}} 49164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_bad_3 ACQUIRED_AFTER(muDoublePointer); // \ 492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'acquired_after' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 49364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex aa_var_arg_bad_4 ACQUIRED_AFTER(umu); // \ 494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'acquired_after' attribute requires arguments whose type is annotated with 'capability' attribute}} 49564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsUnlockableMu aa_var_arg_bad_5 ACQUIRED_AFTER(mu_aa); // \ 496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'acquired_after' attribute can only be applied in a context annotated with 'capability("mutex")' attribute}} 497b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 498b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 499b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Acquired Before (ab) 500b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 501db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 502db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(acquired_before) 503db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support acquired_before attribute" 504db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 505db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 50664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex mu_ab ACQUIRED_BEFORE(mu1); 507db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 50864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_noargs __attribute__((acquired_before)); // \ 509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'acquired_before' attribute takes at least 1 argument}} 510db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 511db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ABFoo { 512db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 51364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex ab_field_noargs __attribute__((acquired_before)); // \ 514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'acquired_before' attribute takes at least 1 argument}} 51564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex ab_field_args ACQUIRED_BEFORE(mu1); 516db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 517db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 51864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass ACQUIRED_BEFORE(mu1) AB { // \ 5193bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 520db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 521db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 52264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid ab_function() ACQUIRED_BEFORE(mu1); // \ 5233bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 524db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 52564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid ab_function_params(int gv_lvar ACQUIRED_BEFORE(mu1)); // \ 5263bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 527db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 528db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid ab_testfn(int y){ 52964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex x ACQUIRED_BEFORE(mu1) = Mutex(); // \ 5303bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 531db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 532db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 53364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins// Note: illegal int ab_int ACQUIRED_BEFORE(mu1) will 534db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// be taken care of by warnings that ab__int is not lockable. 535db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 536b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//Check argument parsing. 537b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 538b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 53964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_1 ACQUIRED_BEFORE(muWrapper.mu); 54064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_2 ACQUIRED_BEFORE(muDoubleWrapper.muWrapper->mu); 54164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_3 ACQUIRED_BEFORE(muWrapper.getMu()); 54264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_4 ACQUIRED_BEFORE(*muWrapper.getMuPointer()); 54364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_5 ACQUIRED_BEFORE(&mu1); 54464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_6 ACQUIRED_BEFORE(muRef); 54564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_7 ACQUIRED_BEFORE(muDoubleWrapper.getWrapper()->getMu()); 54664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_8 ACQUIRED_BEFORE(muPointer); 547b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 548b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 549b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 55064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_bad_1 ACQUIRED_BEFORE(1); // \ 551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'acquired_before' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}} 55264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_bad_2 ACQUIRED_BEFORE("mu"); // \ 553ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'acquired_before' attribute because its argument is invalid}} 55464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_bad_3 ACQUIRED_BEFORE(muDoublePointer); // \ 555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'acquired_before' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 55664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex ab_var_arg_bad_4 ACQUIRED_BEFORE(umu); // \ 557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'acquired_before' attribute requires arguments whose type is annotated with 'capability' attribute}} 55864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsUnlockableMu ab_var_arg_bad_5 ACQUIRED_BEFORE(mu_ab); // \ 559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'acquired_before' attribute can only be applied in a context annotated with 'capability("mutex")' attribute}} 560b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 561b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 562b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 563b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive Lock Function (elf) 564b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 565db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 566db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_lock_function) 567db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_lock_function attribute" 568db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 569db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 570db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 571db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 57264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid elf_function() EXCLUSIVE_LOCK_FUNCTION(); 573db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 57464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid elf_function_args() EXCLUSIVE_LOCK_FUNCTION(mu1, mu2); 575db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 57664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_testfn(int y) EXCLUSIVE_LOCK_FUNCTION(); 577db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 578db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elf_testfn(int y) { 57964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x EXCLUSIVE_LOCK_FUNCTION() = y; // \ 5806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_lock_function' attribute only applies to functions}} 581db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 582db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 583db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 58464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_test_var EXCLUSIVE_LOCK_FUNCTION(); // \ 5856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_lock_function' attribute only applies to functions}} 586db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 587db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ElfFoo { 588db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 58964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field EXCLUSIVE_LOCK_FUNCTION(); // \ 5906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_lock_function' attribute only applies to functions}} 59164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() EXCLUSIVE_LOCK_FUNCTION(); 592db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 593db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 59464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass EXCLUSIVE_LOCK_FUNCTION() ElfTestClass { // \ 5956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_lock_function' attribute only applies to functions}} 596db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 597db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 59864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid elf_fun_params(int lvar EXCLUSIVE_LOCK_FUNCTION()); // \ 5996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_lock_function' attribute only applies to functions}} 600db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 601b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 602b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 603b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 60464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_1() EXCLUSIVE_LOCK_FUNCTION(muWrapper.mu); 60564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_2() EXCLUSIVE_LOCK_FUNCTION(muDoubleWrapper.muWrapper->mu); 60664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_3() EXCLUSIVE_LOCK_FUNCTION(muWrapper.getMu()); 60764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_4() EXCLUSIVE_LOCK_FUNCTION(*muWrapper.getMuPointer()); 60864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_5() EXCLUSIVE_LOCK_FUNCTION(&mu1); 60964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_6() EXCLUSIVE_LOCK_FUNCTION(muRef); 61064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_7() EXCLUSIVE_LOCK_FUNCTION(muDoubleWrapper.getWrapper()->getMu()); 61164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_8() EXCLUSIVE_LOCK_FUNCTION(muPointer); 61264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_9(Mutex x) EXCLUSIVE_LOCK_FUNCTION(1); 61364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_9(Mutex x, Mutex y) EXCLUSIVE_LOCK_FUNCTION(1,2); 614b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 615b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 616b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 61764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_bad_2() EXCLUSIVE_LOCK_FUNCTION("mu"); // \ 618ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'exclusive_lock_function' attribute because its argument is invalid}} 61964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_bad_3() EXCLUSIVE_LOCK_FUNCTION(muDoublePointer); // \ 620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'exclusive_lock_function' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 62164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_bad_4() EXCLUSIVE_LOCK_FUNCTION(umu); // \ 622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'exclusive_lock_function' attribute requires arguments whose type is annotated with 'capability' attribute}} 623b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 62464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_bad_1() EXCLUSIVE_LOCK_FUNCTION(1); // \ 6253bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 62664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_bad_5(Mutex x) EXCLUSIVE_LOCK_FUNCTION(0); // \ 6273bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 62864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_bad_6(Mutex x, Mutex y) EXCLUSIVE_LOCK_FUNCTION(0); // \ 6293bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 63064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elf_function_bad_7() EXCLUSIVE_LOCK_FUNCTION(0); // \ 6313bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 632b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 633b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 634b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 635b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared Lock Function (slf) 636b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 637db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 638db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_lock_function) 639db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_lock_function attribute" 640db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 641db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 642db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 643db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 64464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid slf_function() SHARED_LOCK_FUNCTION(); 645db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 64664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid slf_function_args() SHARED_LOCK_FUNCTION(mu1, mu2); 647db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 64864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_testfn(int y) SHARED_LOCK_FUNCTION(); 649db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 650db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slf_testfn(int y) { 65164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x SHARED_LOCK_FUNCTION() = y; // \ 6526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_lock_function' attribute only applies to functions}} 653db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 654db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 655db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 65664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_test_var SHARED_LOCK_FUNCTION(); // \ 6576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_lock_function' attribute only applies to functions}} 658db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 65964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid slf_fun_params(int lvar SHARED_LOCK_FUNCTION()); // \ 6606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_lock_function' attribute only applies to functions}} 661db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 662db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass SlfFoo { 663db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 66464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field SHARED_LOCK_FUNCTION(); // \ 6656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_lock_function' attribute only applies to functions}} 66664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() SHARED_LOCK_FUNCTION(); 667db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 668db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 66964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass SHARED_LOCK_FUNCTION() SlfTestClass { // \ 6706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_lock_function' attribute only applies to functions}} 671db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 672db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 673b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 674b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 675b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 67664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_1() SHARED_LOCK_FUNCTION(muWrapper.mu); 67764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_2() SHARED_LOCK_FUNCTION(muDoubleWrapper.muWrapper->mu); 67864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_3() SHARED_LOCK_FUNCTION(muWrapper.getMu()); 67964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_4() SHARED_LOCK_FUNCTION(*muWrapper.getMuPointer()); 68064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_5() SHARED_LOCK_FUNCTION(&mu1); 68164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_6() SHARED_LOCK_FUNCTION(muRef); 68264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_7() SHARED_LOCK_FUNCTION(muDoubleWrapper.getWrapper()->getMu()); 68364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_8() SHARED_LOCK_FUNCTION(muPointer); 68464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_9(Mutex x) SHARED_LOCK_FUNCTION(1); 68564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_9(Mutex x, Mutex y) SHARED_LOCK_FUNCTION(1,2); 686b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 687b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 688b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 68964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_bad_2() SHARED_LOCK_FUNCTION("mu"); // \ 690ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'shared_lock_function' attribute because its argument is invalid}} 69164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_bad_3() SHARED_LOCK_FUNCTION(muDoublePointer); // \ 692651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'shared_lock_function' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 69364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_bad_4() SHARED_LOCK_FUNCTION(umu); // \ 694651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'shared_lock_function' attribute requires arguments whose type is annotated with 'capability' attribute}} 695b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 69664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_bad_1() SHARED_LOCK_FUNCTION(1); // \ 6973bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 69864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_bad_5(Mutex x) SHARED_LOCK_FUNCTION(0); // \ 6993bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 70064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_bad_6(Mutex x, Mutex y) SHARED_LOCK_FUNCTION(0); // \ 7013bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 70264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slf_function_bad_7() SHARED_LOCK_FUNCTION(0); // \ 7033bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 704b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 705b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 706b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 707b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive TryLock Function (etf) 708b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 709db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 710db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_trylock_function) 711db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_trylock_function attribute" 712db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 713db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 714db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes a mandatory boolean or integer argument specifying the retval 715db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// plus an optional list of locks (vars/fields) 716db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 717db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_function() __attribute__((exclusive_trylock_function)); // \ 718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'exclusive_trylock_function' attribute takes at least 1 argument}} 719db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 72064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid etf_function_args() EXCLUSIVE_TRYLOCK_FUNCTION(1, mu2); 721db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 72264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid etf_function_arg() EXCLUSIVE_TRYLOCK_FUNCTION(1); 723db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 72464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_testfn(int y) EXCLUSIVE_TRYLOCK_FUNCTION(1); 725db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 726db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint etf_testfn(int y) { 72764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x EXCLUSIVE_TRYLOCK_FUNCTION(1) = y; // \ 7286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_trylock_function' attribute only applies to functions}} 729db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 730db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 731db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 73264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_test_var EXCLUSIVE_TRYLOCK_FUNCTION(1); // \ 7336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_trylock_function' attribute only applies to functions}} 734db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 735db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass EtfFoo { 736db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 73764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field EXCLUSIVE_TRYLOCK_FUNCTION(1); // \ 7386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_trylock_function' attribute only applies to functions}} 73964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() EXCLUSIVE_TRYLOCK_FUNCTION(1); 740db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 741db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 74264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass EXCLUSIVE_TRYLOCK_FUNCTION(1) EtfTestClass { // \ 7436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_trylock_function' attribute only applies to functions}} 744db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 745db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 74664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid etf_fun_params(int lvar EXCLUSIVE_TRYLOCK_FUNCTION(1)); // \ 7476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_trylock_function' attribute only applies to functions}} 748db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 749b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 750b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 751b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 75264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_1() EXCLUSIVE_TRYLOCK_FUNCTION(1, muWrapper.mu); 75364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_2() EXCLUSIVE_TRYLOCK_FUNCTION(1, muDoubleWrapper.muWrapper->mu); 75464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_3() EXCLUSIVE_TRYLOCK_FUNCTION(1, muWrapper.getMu()); 75564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_4() EXCLUSIVE_TRYLOCK_FUNCTION(1, *muWrapper.getMuPointer()); 75664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_5() EXCLUSIVE_TRYLOCK_FUNCTION(1, &mu1); 75764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_6() EXCLUSIVE_TRYLOCK_FUNCTION(1, muRef); 75864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_7() EXCLUSIVE_TRYLOCK_FUNCTION(1, muDoubleWrapper.getWrapper()->getMu()); 75964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_functetfn_8() EXCLUSIVE_TRYLOCK_FUNCTION(1, muPointer); 76064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_9() EXCLUSIVE_TRYLOCK_FUNCTION(true); 761b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 762b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 763b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 76464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_bad_1() EXCLUSIVE_TRYLOCK_FUNCTION(mu1); // \ 765437d43fa2c8e338de3285f4028f0578ddd1b8f80Aaron Ballman // expected-error {{'exclusive_trylock_function' attribute requires parameter 1 to be int or bool}} 76664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_bad_2() EXCLUSIVE_TRYLOCK_FUNCTION("mu"); // \ 767437d43fa2c8e338de3285f4028f0578ddd1b8f80Aaron Ballman // expected-error {{'exclusive_trylock_function' attribute requires parameter 1 to be int or bool}} 76864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_bad_3() EXCLUSIVE_TRYLOCK_FUNCTION(muDoublePointer); // \ 769437d43fa2c8e338de3285f4028f0578ddd1b8f80Aaron Ballman // expected-error {{'exclusive_trylock_function' attribute requires parameter 1 to be int or bool}} 770db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 77164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_bad_4() EXCLUSIVE_TRYLOCK_FUNCTION(1, "mu"); // \ 772ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'exclusive_trylock_function' attribute because its argument is invalid}} 77364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_bad_5() EXCLUSIVE_TRYLOCK_FUNCTION(1, muDoublePointer); // \ 774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'exclusive_trylock_function' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 77564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint etf_function_bad_6() EXCLUSIVE_TRYLOCK_FUNCTION(1, umu); // \ 776651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'exclusive_trylock_function' attribute requires arguments whose type is annotated with 'capability' attribute}} 777db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 778b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 779b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 780b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared TryLock Function (stf) 781b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 782db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 783db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_trylock_function) 784db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_trylock_function attribute" 785db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 786db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 787db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes a mandatory boolean or integer argument specifying the retval 788db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// plus an optional list of locks (vars/fields) 789db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 790db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_function() __attribute__((shared_trylock_function)); // \ 791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'shared_trylock_function' attribute takes at least 1 argument}} 792db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 79364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid stf_function_args() SHARED_TRYLOCK_FUNCTION(1, mu2); 794db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 79564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid stf_function_arg() SHARED_TRYLOCK_FUNCTION(1); 796db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 79764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_testfn(int y) SHARED_TRYLOCK_FUNCTION(1); 798db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 799db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint stf_testfn(int y) { 80064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x SHARED_TRYLOCK_FUNCTION(1) = y; // \ 8016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_trylock_function' attribute only applies to functions}} 802db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 803db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 804db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 80564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_test_var SHARED_TRYLOCK_FUNCTION(1); // \ 8066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_trylock_function' attribute only applies to functions}} 807db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 80864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid stf_fun_params(int lvar SHARED_TRYLOCK_FUNCTION(1)); // \ 8096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_trylock_function' attribute only applies to functions}} 810db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 811db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 812db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass StfFoo { 813db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 81464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field SHARED_TRYLOCK_FUNCTION(1); // \ 8156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_trylock_function' attribute only applies to functions}} 81664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() SHARED_TRYLOCK_FUNCTION(1); 817db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 818db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 81964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass SHARED_TRYLOCK_FUNCTION(1) StfTestClass { // \ 8206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_trylock_function' attribute only applies to functions}} 821db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 822db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 823b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 824b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 825b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 82664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_1() SHARED_TRYLOCK_FUNCTION(1, muWrapper.mu); 82764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_2() SHARED_TRYLOCK_FUNCTION(1, muDoubleWrapper.muWrapper->mu); 82864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_3() SHARED_TRYLOCK_FUNCTION(1, muWrapper.getMu()); 82964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_4() SHARED_TRYLOCK_FUNCTION(1, *muWrapper.getMuPointer()); 83064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_5() SHARED_TRYLOCK_FUNCTION(1, &mu1); 83164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_6() SHARED_TRYLOCK_FUNCTION(1, muRef); 83264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_7() SHARED_TRYLOCK_FUNCTION(1, muDoubleWrapper.getWrapper()->getMu()); 83364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_8() SHARED_TRYLOCK_FUNCTION(1, muPointer); 83464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_9() SHARED_TRYLOCK_FUNCTION(true); 835b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 836b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 837b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 83864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_bad_1() SHARED_TRYLOCK_FUNCTION(mu1); // \ 839437d43fa2c8e338de3285f4028f0578ddd1b8f80Aaron Ballman // expected-error {{'shared_trylock_function' attribute requires parameter 1 to be int or bool}} 84064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_bad_2() SHARED_TRYLOCK_FUNCTION("mu"); // \ 841437d43fa2c8e338de3285f4028f0578ddd1b8f80Aaron Ballman // expected-error {{'shared_trylock_function' attribute requires parameter 1 to be int or bool}} 84264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_bad_3() SHARED_TRYLOCK_FUNCTION(muDoublePointer); // \ 843437d43fa2c8e338de3285f4028f0578ddd1b8f80Aaron Ballman // expected-error {{'shared_trylock_function' attribute requires parameter 1 to be int or bool}} 844db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 84564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_bad_4() SHARED_TRYLOCK_FUNCTION(1, "mu"); // \ 846ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'shared_trylock_function' attribute because its argument is invalid}} 84764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_bad_5() SHARED_TRYLOCK_FUNCTION(1, muDoublePointer); // \ 848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'shared_trylock_function' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 84964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint stf_function_bad_6() SHARED_TRYLOCK_FUNCTION(1, umu); // \ 850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'shared_trylock_function' attribute requires arguments whose type is annotated with 'capability' attribute}} 851b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 852b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 853b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 854b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Unlock Function (uf) 855b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 856db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 857db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(unlock_function) 858db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support unlock_function attribute" 859db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 860db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 861db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 862db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 86364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid uf_function() UNLOCK_FUNCTION(); 864db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 86564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid uf_function_args() UNLOCK_FUNCTION(mu1, mu2); 866db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 86764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_testfn(int y) UNLOCK_FUNCTION(); 868db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 869db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint uf_testfn(int y) { 87064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x UNLOCK_FUNCTION() = y; // \ 8716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'unlock_function' attribute only applies to functions}} 872db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 873db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 874db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 87564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_test_var UNLOCK_FUNCTION(); // \ 8766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'unlock_function' attribute only applies to functions}} 877db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 878db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass UfFoo { 879db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 88064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field UNLOCK_FUNCTION(); // \ 8816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'unlock_function' attribute only applies to functions}} 88264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() UNLOCK_FUNCTION(); 883db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 884db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 88564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass NO_THREAD_SAFETY_ANALYSIS UfTestClass { // \ 8866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions}} 887db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 888db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 88964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid uf_fun_params(int lvar UNLOCK_FUNCTION()); // \ 8906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'unlock_function' attribute only applies to functions}} 891db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 892b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 893b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 894b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 89564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_1() UNLOCK_FUNCTION(muWrapper.mu); 89664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_2() UNLOCK_FUNCTION(muDoubleWrapper.muWrapper->mu); 89764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_3() UNLOCK_FUNCTION(muWrapper.getMu()); 89864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_4() UNLOCK_FUNCTION(*muWrapper.getMuPointer()); 89964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_5() UNLOCK_FUNCTION(&mu1); 90064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_6() UNLOCK_FUNCTION(muRef); 90164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_7() UNLOCK_FUNCTION(muDoubleWrapper.getWrapper()->getMu()); 90264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_8() UNLOCK_FUNCTION(muPointer); 90364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_9(Mutex x) UNLOCK_FUNCTION(1); 90464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_9(Mutex x, Mutex y) UNLOCK_FUNCTION(1,2); 905b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 906b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 907b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 90864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_bad_2() UNLOCK_FUNCTION("mu"); // \ 909ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'unlock_function' attribute because its argument is invalid}} 91064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_bad_3() UNLOCK_FUNCTION(muDoublePointer); // \ 911651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'unlock_function' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 91264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_bad_4() UNLOCK_FUNCTION(umu); // \ 913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'unlock_function' attribute requires arguments whose type is annotated with 'capability' attribute}} 914b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 91564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_bad_1() UNLOCK_FUNCTION(1); // \ 9163bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 91764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_bad_5(Mutex x) UNLOCK_FUNCTION(0); // \ 9183bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 91964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_bad_6(Mutex x, Mutex y) UNLOCK_FUNCTION(0); // \ 9203bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 92164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint uf_function_bad_7() UNLOCK_FUNCTION(0); // \ 9223bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 923b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 924b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 925b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 926b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Lock Returned (lr) 927b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 928db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 929db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(lock_returned) 930db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support lock_returned attribute" 931db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 932db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 933db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// Takes exactly one argument, a var/field 934db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 935db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_function() __attribute__((lock_returned)); // \ 936baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'lock_returned' attribute takes one argument}} 937db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 93864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid lr_function_arg() LOCK_RETURNED(mu1); 939db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 940db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_function_args() __attribute__((lock_returned(mu1, mu2))); // \ 941baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman // expected-error {{'lock_returned' attribute takes one argument}} 942db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 94364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_testfn(int y) LOCK_RETURNED(mu1); 944db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 945db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint lr_testfn(int y) { 94664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x LOCK_RETURNED(mu1) = y; // \ 9476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'lock_returned' attribute only applies to functions}} 948db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 949db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 950db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 95164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_test_var LOCK_RETURNED(mu1); // \ 9526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'lock_returned' attribute only applies to functions}} 953db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 95464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid lr_fun_params(int lvar LOCK_RETURNED(mu1)); // \ 9556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'lock_returned' attribute only applies to functions}} 956db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 957db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass LrFoo { 958db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 95964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field LOCK_RETURNED(mu1); // \ 9606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'lock_returned' attribute only applies to functions}} 96164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() LOCK_RETURNED(mu1); 962db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 963db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 96464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass LOCK_RETURNED(mu1) LrTestClass { // \ 9656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'lock_returned' attribute only applies to functions}} 966db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 967db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 968b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 969b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 970b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 97164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_1() LOCK_RETURNED(muWrapper.mu); 97264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_2() LOCK_RETURNED(muDoubleWrapper.muWrapper->mu); 97364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_3() LOCK_RETURNED(muWrapper.getMu()); 97464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_4() LOCK_RETURNED(*muWrapper.getMuPointer()); 97564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_5() LOCK_RETURNED(&mu1); 97664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_6() LOCK_RETURNED(muRef); 97764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_7() LOCK_RETURNED(muDoubleWrapper.getWrapper()->getMu()); 97864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_8() LOCK_RETURNED(muPointer); 979b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 980b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 981b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 98264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_bad_1() LOCK_RETURNED(1); // \ 983651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lock_returned' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}} 98464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_bad_2() LOCK_RETURNED("mu"); // \ 985f26efd79d1bd139641d0bb40842f908c67f041c2DeLesley Hutchins // expected-warning {{ignoring 'lock_returned' attribute because its argument is invalid}} 98664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_bad_3() LOCK_RETURNED(muDoublePointer); // \ 987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lock_returned' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 98864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint lr_function_bad_4() LOCK_RETURNED(umu); // \ 989651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'lock_returned' attribute requires arguments whose type is annotated with 'capability' attribute}} 990b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 991b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 992b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 993b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 994b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Locks Excluded (le) 995b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 996db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 997db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(locks_excluded) 998db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support locks_excluded attribute" 999db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 1000db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1001db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 1002db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1003db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_function() __attribute__((locks_excluded)); // \ 1004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'locks_excluded' attribute takes at least 1 argument}} 1005db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 100664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid le_function_arg() LOCKS_EXCLUDED(mu1); 1007db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 100864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid le_function_args() LOCKS_EXCLUDED(mu1, mu2); 1009db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 101064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_testfn(int y) LOCKS_EXCLUDED(mu1); 1011db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1012db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint le_testfn(int y) { 101364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x LOCKS_EXCLUDED(mu1) = y; // \ 10146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'locks_excluded' attribute only applies to functions}} 1015db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 1016db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1017db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 101864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_test_var LOCKS_EXCLUDED(mu1); // \ 10196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'locks_excluded' attribute only applies to functions}} 1020db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 102164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid le_fun_params(int lvar LOCKS_EXCLUDED(mu1)); // \ 10226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'locks_excluded' attribute only applies to functions}} 1023db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1024db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass LeFoo { 1025db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 102664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field LOCKS_EXCLUDED(mu1); // \ 10276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'locks_excluded' attribute only applies to functions}} 102864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() LOCKS_EXCLUDED(mu1); 1029db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1030db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 103164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass LOCKS_EXCLUDED(mu1) LeTestClass { // \ 10326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'locks_excluded' attribute only applies to functions}} 1033db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1034db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1035b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1036b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1037b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 103864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_1() LOCKS_EXCLUDED(muWrapper.mu); 103964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_2() LOCKS_EXCLUDED(muDoubleWrapper.muWrapper->mu); 104064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_3() LOCKS_EXCLUDED(muWrapper.getMu()); 104164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_4() LOCKS_EXCLUDED(*muWrapper.getMuPointer()); 104264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_5() LOCKS_EXCLUDED(&mu1); 104364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_6() LOCKS_EXCLUDED(muRef); 104464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_7() LOCKS_EXCLUDED(muDoubleWrapper.getWrapper()->getMu()); 104564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_8() LOCKS_EXCLUDED(muPointer); 1046db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1047b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1048b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 104964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_bad_1() LOCKS_EXCLUDED(1); // \ 1050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'locks_excluded' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}} 105164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_bad_2() LOCKS_EXCLUDED("mu"); // \ 1052ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'locks_excluded' attribute because its argument is invalid}} 105364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_bad_3() LOCKS_EXCLUDED(muDoublePointer); // \ 1054651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'locks_excluded' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 105564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint le_function_bad_4() LOCKS_EXCLUDED(umu); // \ 1056651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'locks_excluded' attribute requires arguments whose type is annotated with 'capability' attribute}} 1057b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1058b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1059b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1060b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1061b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive Locks Required (elr) 1062b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1063db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1064db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_locks_required) 1065db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_locks_required attribute" 1066db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 1067db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1068db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 1069db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1070db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_function() __attribute__((exclusive_locks_required)); // \ 1071651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'exclusive_locks_required' attribute takes at least 1 argument}} 1072db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 107364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid elr_function_arg() EXCLUSIVE_LOCKS_REQUIRED(mu1); 1074db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 107564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid elr_function_args() EXCLUSIVE_LOCKS_REQUIRED(mu1, mu2); 1076db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 107764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_testfn(int y) EXCLUSIVE_LOCKS_REQUIRED(mu1); 1078db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1079db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elr_testfn(int y) { 108064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x EXCLUSIVE_LOCKS_REQUIRED(mu1) = y; // \ 10816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_locks_required' attribute only applies to functions}} 1082db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 1083db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1084db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 108564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_test_var EXCLUSIVE_LOCKS_REQUIRED(mu1); // \ 10866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_locks_required' attribute only applies to functions}} 1087db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 108864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid elr_fun_params(int lvar EXCLUSIVE_LOCKS_REQUIRED(mu1)); // \ 10896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_locks_required' attribute only applies to functions}} 1090db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1091db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ElrFoo { 1092db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 109364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field EXCLUSIVE_LOCKS_REQUIRED(mu1); // \ 10946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_locks_required' attribute only applies to functions}} 109564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() EXCLUSIVE_LOCKS_REQUIRED(mu1); 1096db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1097db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 109864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass EXCLUSIVE_LOCKS_REQUIRED(mu1) ElrTestClass { // \ 10996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'exclusive_locks_required' attribute only applies to functions}} 1100db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1101db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1102b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1103b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1104b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 110564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_1() EXCLUSIVE_LOCKS_REQUIRED(muWrapper.mu); 110664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_2() EXCLUSIVE_LOCKS_REQUIRED(muDoubleWrapper.muWrapper->mu); 110764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_3() EXCLUSIVE_LOCKS_REQUIRED(muWrapper.getMu()); 110864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_4() EXCLUSIVE_LOCKS_REQUIRED(*muWrapper.getMuPointer()); 110964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_5() EXCLUSIVE_LOCKS_REQUIRED(&mu1); 111064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_6() EXCLUSIVE_LOCKS_REQUIRED(muRef); 111164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_7() EXCLUSIVE_LOCKS_REQUIRED(muDoubleWrapper.getWrapper()->getMu()); 111264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_8() EXCLUSIVE_LOCKS_REQUIRED(muPointer); 1113b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1114b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1115b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 111664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_bad_1() EXCLUSIVE_LOCKS_REQUIRED(1); // \ 1117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'exclusive_locks_required' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}} 111864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_bad_2() EXCLUSIVE_LOCKS_REQUIRED("mu"); // \ 1119ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'exclusive_locks_required' attribute because its argument is invalid}} 112064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_bad_3() EXCLUSIVE_LOCKS_REQUIRED(muDoublePointer); // \ 1121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'exclusive_locks_required' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 112264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint elr_function_bad_4() EXCLUSIVE_LOCKS_REQUIRED(umu); // \ 1123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'exclusive_locks_required' attribute requires arguments whose type is annotated with 'capability' attribute}} 1124b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1125b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1126b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1127b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1128b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1129b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared Locks Required (slr) 1130b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1131db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1132db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_locks_required) 1133db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_locks_required attribute" 1134db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 1135db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1136db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 1137db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1138db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_function() __attribute__((shared_locks_required)); // \ 1139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error {{'shared_locks_required' attribute takes at least 1 argument}} 1140db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 114164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid slr_function_arg() SHARED_LOCKS_REQUIRED(mu1); 1142db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 114364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid slr_function_args() SHARED_LOCKS_REQUIRED(mu1, mu2); 1144db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 114564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_testfn(int y) SHARED_LOCKS_REQUIRED(mu1); 1146db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1147db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slr_testfn(int y) { 114864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int x SHARED_LOCKS_REQUIRED(mu1) = y; // \ 11496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_locks_required' attribute only applies to functions}} 1150db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 1151db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1152db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 115364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_test_var SHARED_LOCKS_REQUIRED(mu1); // \ 11546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_locks_required' attribute only applies to functions}} 1155db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 115664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid slr_fun_params(int lvar SHARED_LOCKS_REQUIRED(mu1)); // \ 11576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_locks_required' attribute only applies to functions}} 1158db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1159db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass SlrFoo { 1160db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 116164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int test_field SHARED_LOCKS_REQUIRED(mu1); // \ 11626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_locks_required' attribute only applies to functions}} 116364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void test_method() SHARED_LOCKS_REQUIRED(mu1); 1164db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1165db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 116664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass SHARED_LOCKS_REQUIRED(mu1) SlrTestClass { // \ 11676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-warning {{'shared_locks_required' attribute only applies to functions}} 1168db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1169b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1170b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1171b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1172b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 117364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_1() SHARED_LOCKS_REQUIRED(muWrapper.mu); 117464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_2() SHARED_LOCKS_REQUIRED(muDoubleWrapper.muWrapper->mu); 117564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_3() SHARED_LOCKS_REQUIRED(muWrapper.getMu()); 117664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_4() SHARED_LOCKS_REQUIRED(*muWrapper.getMuPointer()); 117764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_5() SHARED_LOCKS_REQUIRED(&mu1); 117864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_6() SHARED_LOCKS_REQUIRED(muRef); 117964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_7() SHARED_LOCKS_REQUIRED(muDoubleWrapper.getWrapper()->getMu()); 118064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_8() SHARED_LOCKS_REQUIRED(muPointer); 1181b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1182b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1183b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 118464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_bad_1() SHARED_LOCKS_REQUIRED(1); // \ 1185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'shared_locks_required' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}} 118664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_bad_2() SHARED_LOCKS_REQUIRED("mu"); // \ 1187ae519c42a1e0a023be6c07ba1dc10f28e29d6bc3DeLesley Hutchins // expected-warning {{ignoring 'shared_locks_required' attribute because its argument is invalid}} 118864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_bad_3() SHARED_LOCKS_REQUIRED(muDoublePointer); // \ 1189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'shared_locks_required' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'Mutex **'}} 119064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsint slr_function_bad_4() SHARED_LOCKS_REQUIRED(umu); // \ 1191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'shared_locks_required' attribute requires arguments whose type is annotated with 'capability' attribute}} 1192b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1193b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1194b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//-----------------------------------------// 1195b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Regression tests for unusual cases. 1196b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//-----------------------------------------// 1197b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1198b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiint trivially_false_edges(bool b) { 1199b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // Create NULL (never taken) edges in CFG 1200b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski if (false) return 1; 1201b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski else return 2; 1202b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1203b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1204b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Possible Clang bug -- method pointer in template parameter 1205b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass UnFoo { 1206b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskipublic: 1207b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void foo(); 1208b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1209b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1210b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskitemplate<void (UnFoo::*methptr)()> 1211b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass MCaller { 1212b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskipublic: 1213b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski static void call_method_ptr(UnFoo *f) { 1214b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // FIXME: Possible Clang bug: 1215b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // getCalleeDecl() returns NULL in the following case: 1216b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski (f->*methptr)(); 1217b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1218b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1219b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1220b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskivoid call_method_ptr_inst(UnFoo* f) { 1221b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski MCaller<&UnFoo::foo>::call_method_ptr(f); 1222b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1223b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1224b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiint temp; 1225b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskivoid empty_back_edge() { 1226b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // Create a back edge to a block with with no statements 1227b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski for (;;) { 1228b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ++temp; 1229b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski if (temp > 10) break; 1230b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1231b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1232b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1233b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskistruct Foomger { 1234b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void operator++(); 1235b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1236b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1237b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskistruct Foomgoper { 1238b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski Foomger f; 1239b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1240b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski bool done(); 1241b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void invalid_back_edge() { 1242b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski do { 1243b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // FIXME: Possible Clang bug: 1244b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // The first statement in this basic block has no source location 1245b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ++f; 1246b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } while (!done()); 1247b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1248b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1249b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1250b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1251ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski//----------------------------------------------------- 1252ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski// Parsing of member variables and function parameters 1253ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski//------------------------------------------------------ 1254ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 125564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley HutchinsMutex gmu; 1256ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1257ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskiclass StaticMu { 125864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins static Mutex statmu; 1259ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski}; 1260ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1261ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskiclass FooLate { 1262ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskipublic: 126364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void foo1() EXCLUSIVE_LOCKS_REQUIRED(gmu) { } 126464b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void foo2() EXCLUSIVE_LOCKS_REQUIRED(mu) { } 126564b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void foo3(Mutex *m) EXCLUSIVE_LOCKS_REQUIRED(m) { } 126664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void foo3(FooLate *f) EXCLUSIVE_LOCKS_REQUIRED(f->mu) { } 126764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void foo4(FooLate *f) EXCLUSIVE_LOCKS_REQUIRED(f->mu); 1268ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 126964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins static void foo5() EXCLUSIVE_LOCKS_REQUIRED(mu); // \ 1270d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins // expected-error {{invalid use of member 'mu' in static member function}} 1271ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1272ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski template <class T> 127364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void foo6() EXCLUSIVE_LOCKS_REQUIRED(T::statmu) { } 1274ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1275ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski template <class T> 127664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void foo7(T* f) EXCLUSIVE_LOCKS_REQUIRED(f->mu) { } 1277ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 127864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int a GUARDED_BY(gmu); 127964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int b GUARDED_BY(mu); 128064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int c GUARDED_BY(this->mu); 1281ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 128264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex mu; 1283ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski}; 1284ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 12854805f158203017bdf575003235473284134c1071DeLesley Hutchins//------------------------- 12864805f158203017bdf575003235473284134c1071DeLesley Hutchins// Empty argument lists 12874805f158203017bdf575003235473284134c1071DeLesley Hutchins//------------------------- 12884805f158203017bdf575003235473284134c1071DeLesley Hutchins 128964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsclass LOCKABLE EmptyArgListsTest { 129064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void lock() EXCLUSIVE_LOCK_FUNCTION() { } 129164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins void unlock() UNLOCK_FUNCTION() { } 12924805f158203017bdf575003235473284134c1071DeLesley Hutchins}; 12934805f158203017bdf575003235473284134c1071DeLesley Hutchins 1294c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1295c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsnamespace FunctionDefinitionParseTest { 1296c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins// Test parsing of attributes on function definitions. 1297c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1298c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsclass Foo { 1299c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinspublic: 130064b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex mu_; 1301c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins void foo1(); 1302c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins void foo2(Foo *f); 1303c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins}; 1304c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1305c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinstemplate <class T> 1306c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsclass Bar { 1307c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinspublic: 130864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex mu_; 1309c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins void bar(); 1310c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins}; 1311c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 131264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid Foo::foo1() EXCLUSIVE_LOCKS_REQUIRED(mu_) { } 131364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid Foo::foo2(Foo *f) EXCLUSIVE_LOCKS_REQUIRED(f->mu_) { } 1314c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1315c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinstemplate <class T> 131664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid Bar<T>::bar() EXCLUSIVE_LOCKS_REQUIRED(mu_) { } 1317c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 131864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchinsvoid baz(Foo *f) EXCLUSIVE_LOCKS_REQUIRED(f->mu_) { } 13192287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13202287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins} // end namespace 13212287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13222287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13232287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchinsnamespace TestMultiDecl { 13242287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13252287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchinsclass Foo { 13262287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchinspublic: 132764b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int GUARDED_BY(mu_) a; 132864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins int GUARDED_BY(mu_) b, c; 13292287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13302287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchinsprivate: 133164b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex mu_; 1332c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins}; 1333c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1334bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins} // end namespace TestMultiDecl 1335bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 13362287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 1337cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchinsnamespace NestedClassLateDecl { 1338cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1339cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchinsclass Foo { 1340cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins class Bar { 1341cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins int a GUARDED_BY(mu); 1342cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins int b GUARDED_BY(fooMuStatic); 1343cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1344cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins void bar() EXCLUSIVE_LOCKS_REQUIRED(mu) { a = 0; } 1345cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins void bar2(Bar* b) EXCLUSIVE_LOCKS_REQUIRED(b->mu) { b->a = 0; } 1346cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins void bar3(Foo* f) EXCLUSIVE_LOCKS_REQUIRED(f->fooMu) { f->a = 0; } 1347cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 134864b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex mu; 1349cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins }; 1350cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1351cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins int a GUARDED_BY(fooMu); 135264b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex fooMu; 135364b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins static Mutex fooMuStatic; 1354cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins}; 1355cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1356cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins} 1357cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 135879747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchinsnamespace PointerToMemberTest { 135979747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins 1360aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins// Empty string should be ignored. 1361aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchinsint testEmptyAttribute GUARDED_BY(""); 1362aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchinsvoid testEmptyAttributeFunction() EXCLUSIVE_LOCKS_REQUIRED(""); 1363aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 136479747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchinsclass Graph { 136579747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchinspublic: 136664b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex mu_; 1367f26efd79d1bd139641d0bb40842f908c67f041c2DeLesley Hutchins 1368f26efd79d1bd139641d0bb40842f908c67f041c2DeLesley Hutchins static Mutex* get_static_mu() LOCK_RETURNED(&Graph::mu_); 136979747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins}; 137079747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins 137179747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchinsclass Node { 137279747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchinspublic: 137379747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins void foo() EXCLUSIVE_LOCKS_REQUIRED(&Graph::mu_); 137479747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins int a GUARDED_BY(&Graph::mu_); 137579747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins}; 137679747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins 137779747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins} 137879747e00e9f6b13b56e91462982d2456d0d9128fDeLesley Hutchins 1379aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 1380aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchinsnamespace SmartPointerTest { 1381aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 1382aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchinstemplate<class T> 1383aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchinsclass smart_ptr { 1384aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins public: 1385aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins T* operator->() { return ptr_; } 1386aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins T& operator*() { return ptr_; } 1387aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 1388aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins private: 1389aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins T* ptr_; 1390aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins}; 1391aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 1392aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 139360f2024b7df091fb0d8b7e37334bc83ac66a5c39DeLesley HutchinsMutex gmu; 139460f2024b7df091fb0d8b7e37334bc83ac66a5c39DeLesley Hutchinssmart_ptr<int> gdat PT_GUARDED_BY(gmu); 139560f2024b7df091fb0d8b7e37334bc83ac66a5c39DeLesley Hutchins 139660f2024b7df091fb0d8b7e37334bc83ac66a5c39DeLesley Hutchins 1397aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchinsclass MyClass { 1398aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchinspublic: 139964b111e81d0d699825734e282e2ee71fb2a0ce19DeLesley Hutchins Mutex mu_; 140060f2024b7df091fb0d8b7e37334bc83ac66a5c39DeLesley Hutchins smart_ptr<Mutex> smu_; 140160f2024b7df091fb0d8b7e37334bc83ac66a5c39DeLesley Hutchins 1402aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 1403aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins smart_ptr<int> a PT_GUARDED_BY(mu_); 140460f2024b7df091fb0d8b7e37334bc83ac66a5c39DeLesley Hutchins int b GUARDED_BY(smu_); 1405aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins}; 1406aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 1407aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins} 1408aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 1409aed9ea398a3fd8d488120728e2df4ac81c3b0c4bDeLesley Hutchins 1410bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchinsnamespace InheritanceTest { 1411bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1412bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchinsclass LOCKABLE Base { 1413bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins public: 1414bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins void lock() EXCLUSIVE_LOCK_FUNCTION(); 1415bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins void unlock() UNLOCK_FUNCTION(); 1416bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins}; 1417bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1418bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchinsclass Base2 { }; 1419bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1420bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchinsclass Derived1 : public Base { }; 1421bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1422bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchinsclass Derived2 : public Base2, public Derived1 { }; 1423bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1424bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchinsclass Derived3 : public Base2 { }; 1425bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1426bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchinsclass Foo { 1427bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins Derived1 mu1_; 1428bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins Derived2 mu2_; 1429bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins Derived3 mu3_; 1430bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins int a GUARDED_BY(mu1_); 1431bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins int b GUARDED_BY(mu2_); 1432bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins int c GUARDED_BY(mu3_); // \ 1433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{'guarded_by' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'InheritanceTest::Derived3'}} 1434bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1435bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins void foo() EXCLUSIVE_LOCKS_REQUIRED(mu1_, mu2_) { 1436bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins a = 0; 1437bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins b = 0; 1438bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins } 1439bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins}; 1440bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1441bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins} 1442bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 1443bbba25fa8e388e82e04f66784c2fc9f89b901abeDeLesley Hutchins 144495526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchinsnamespace InvalidDeclTest { 144595526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchins 144695526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchinsclass Foo { }; 144795526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchinsnamespace { 144895526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchinsvoid Foo::bar(Mutex* mu) LOCKS_EXCLUDED(mu) { } // \ 144995526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchins // expected-error {{cannot define or redeclare 'bar' here because namespace '' does not enclose namespace 'Foo'}} \ 145095526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchins // expected-warning {{attribute locks_excluded ignored, because it is not attached to a declaration}} 145195526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchins} 145295526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchins 145395526a480f252514d63a00bb032a2cb205dbf021DeLesley Hutchins} // end namespace InvalidDeclTest 14542287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 1455d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1456d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchinsnamespace StaticScopeTest { 1457d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1458d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchinsclass FooStream; 1459d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1460d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchinsclass Foo { 1461d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins mutable Mutex mu; 1462d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins int a GUARDED_BY(mu); 1463d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1464d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins static int si GUARDED_BY(mu); // \ 1465d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins // expected-error {{invalid use of non-static data member 'mu'}} 1466d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1467d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins static void foo() EXCLUSIVE_LOCKS_REQUIRED(mu); // \ 1468d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins // expected-error {{invalid use of member 'mu' in static member function}} 1469d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1470d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins friend FooStream& operator<<(FooStream& s, const Foo& f) 1471d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins EXCLUSIVE_LOCKS_REQUIRED(mu); // \ 1472d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins // expected-error {{invalid use of non-static data member 'mu'}} 1473d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins}; 1474d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1475d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1476d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins} // end namespace StaticScopeTest 1477d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1478d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1479161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchinsnamespace FunctionAttributesInsideClass_ICE_Test { 1480161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins 1481161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchinsclass Foo { 1482161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchinspublic: 1483161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins /* Originally found when parsing foo() as an ordinary method after the 1484161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins * the following: 1485161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins 1486161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins template <class T> 1487161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins void syntaxErrorMethod(int i) { 1488161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins if (i) { 1489161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins foo( 1490161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins } 1491161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins } 1492161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins */ 1493161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins 1494161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins void method() { 1495161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins void foo() EXCLUSIVE_LOCKS_REQUIRED(mu); // \ 1496161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins // expected-error {{use of undeclared identifier 'mu'}} 1497161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins } 1498161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins}; 1499161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins 1500161db02a747e0c8e717f542674c0581c03fc3c93DeLesley Hutchins} // end namespace FunctionAttributesInsideClass_ICE_Test 1501d30fb9e2462d3cfe04d4f32cb40bf1edd9e3b383DeLesley Hutchins 1502