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__))) 11cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__ ((exclusive_lock_function(__VA_ARGS__))) 12cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define SHARED_LOCK_FUNCTION(...) __attribute__ ((shared_lock_function(__VA_ARGS__))) 13cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__ ((exclusive_trylock_function(__VA_ARGS__))) 14cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define SHARED_TRYLOCK_FUNCTION(...) __attribute__ ((shared_trylock_function(__VA_ARGS__))) 15cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define UNLOCK_FUNCTION(...) __attribute__ ((unlock_function(__VA_ARGS__))) 16cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define LOCK_RETURNED(x) __attribute__ ((lock_returned(x))) 17cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define LOCKS_EXCLUDED(...) __attribute__ ((locks_excluded(__VA_ARGS__))) 18cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define EXCLUSIVE_LOCKS_REQUIRED(...) \ 19cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins __attribute__ ((exclusive_locks_required(__VA_ARGS__))) 20cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define SHARED_LOCKS_REQUIRED(...) \ 21cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins __attribute__ ((shared_locks_required(__VA_ARGS__))) 22cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins#define NO_THREAD_SAFETY_ANALYSIS __attribute__ ((no_thread_safety_analysis)) 23db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 24db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 25db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((lockable)) Mu { 26eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski public: 27eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void Lock(); 28db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 29db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 30b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass UnlockableMu{ 31b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 32b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 33b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass MuWrapper { 34b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski public: 35b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski Mu mu; 36b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski Mu getMu() { 37b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return mu; 38b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 39b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski Mu * getMuPointer() { 40b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return μ 41b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 42b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 43b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 44b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 45b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass MuDoubleWrapper { 46b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski public: 47b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski MuWrapper* muWrapper; 48b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski MuWrapper* getWrapper() { 49b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return muWrapper; 50b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 51b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 52b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 53db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu mu1; 54b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiUnlockableMu umu; 55db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu mu2; 56b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMuWrapper muWrapper; 57b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMuDoubleWrapper muDoubleWrapper; 58b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu* muPointer; 59b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ** muDoublePointer = & muPointer; 60b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu& muRef = mu1; 61db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 62eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//---------------------------------------// 63eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// Scoping tests 64eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//--------------------------------------// 65eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 66eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Foo { 67eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mu foomu; 68eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void needLock() __attribute__((exclusive_lock_function(foomu))); 69eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 70eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 71eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Foo2 { 72eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void needLock() __attribute__((exclusive_lock_function(foomu))); 73eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mu foomu; 74eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 75eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 76eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Bar { 77eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mu barmu; 78eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mu barmu2 __attribute__((acquired_after(barmu))); 79eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 80eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 81eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 82b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 83b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// No Thread Safety Analysis (noanal) // 84b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 85fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 86fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski// FIXME: Right now we cannot parse attributes put on function definitions 87fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski// We would like to patch this at some point. 88fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 89fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(no_thread_safety_analysis) 90fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support no_thread_safety_analysis attribute" 91fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 92fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid noanal_fun() __attribute__((no_thread_safety_analysis)); 94fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 953ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid noanal_fun_args() __attribute__((no_thread_safety_analysis(1))); // \ 963bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 97fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 98fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint noanal_testfn(int y) __attribute__((no_thread_safety_analysis)); 99fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 100fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint noanal_testfn(int y) { 101fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int x __attribute__((no_thread_safety_analysis)) = y; // \ 1023bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 103fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 104fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 105fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 106fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint noanal_test_var __attribute__((no_thread_safety_analysis)); // \ 1073bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 108fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 109fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass NoanalFoo { 110fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 111fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int test_field __attribute__((no_thread_safety_analysis)); // \ 1123bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 113fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski void test_method() __attribute__((no_thread_safety_analysis)); 114fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 115fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 116fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((no_thread_safety_analysis)) NoanalTestClass { // \ 1173bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 118fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 119fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 120fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid noanal_fun_params(int lvar __attribute__((no_thread_safety_analysis))); // \ 1213bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 122fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 123fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 124b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 125b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Guarded Var Attribute (gv) 126b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 127fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 128fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(guarded_var) 129fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support guarded_var attribute" 130fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 131fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 132fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint gv_var_noargs __attribute__((guarded_var)); 133fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 134fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint gv_var_args __attribute__((guarded_var(1))); // \ 1353bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 136fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 137fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass GVFoo { 138fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 139fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int gv_field_noargs __attribute__((guarded_var)); 140fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int gv_field_args __attribute__((guarded_var(1))); // \ 1413bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 142fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 143fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 144fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((guarded_var)) GV { // \ 1453bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 146fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 147fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 148fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid gv_function() __attribute__((guarded_var)); // \ 1493bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 150fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 151fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid gv_function_params(int gv_lvar __attribute__((guarded_var))); // \ 1523bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 153fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 154fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint gv_testfn(int y){ 155fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int x __attribute__((guarded_var)) = y; // \ 1563bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 157fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 158fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 159fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 160b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 161b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Pt Guarded Var Attribute (pgv) 162b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 163fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 164fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski//FIXME: add support for boost::scoped_ptr<int> fancyptr and references 165fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 166fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(pt_guarded_var) 167fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support pt_guarded_var attribute" 168fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 169fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 170fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint *pgv_pt_var_noargs __attribute__((pt_guarded_var)); 171fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 172fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint pgv_var_noargs __attribute__((pt_guarded_var)); // \ 1733bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' only applies to pointer types; type here is 'int'}} 174fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 175fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass PGVFoo { 176fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 177fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int *pt_field_noargs __attribute__((pt_guarded_var)); 178fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int field_noargs __attribute__((pt_guarded_var)); // \ 1793bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' only applies to pointer types; type here is 'int'}} 180fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int *gv_field_args __attribute__((pt_guarded_var(1))); // \ 1813bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 182fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 183fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 184fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((pt_guarded_var)) PGV { // \ 1853bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 186fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 187fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 188fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint *pgv_var_args __attribute__((pt_guarded_var(1))); // \ 1893bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 190fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 191fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 192fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid pgv_function() __attribute__((pt_guarded_var)); // \ 1933bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 194fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 195fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid pgv_function_params(int *gv_lvar __attribute__((pt_guarded_var))); // \ 1963bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 197fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 198fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid pgv_testfn(int y){ 199fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int *x __attribute__((pt_guarded_var)) = new int(0); // \ 2003bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 201fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski delete x; 202fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 203fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 204b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 205b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Lockable Attribute (l) 206b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 207fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 208fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski//FIXME: In future we may want to add support for structs, ObjC classes, etc. 209fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 210fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(lockable) 211fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support lockable attribute" 212fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 213fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 214fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((lockable)) LTestClass { 215fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 216fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 217fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((lockable (1))) LTestClass_args { // \ 2183bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 219fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 220fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 221fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid l_test_function() __attribute__((lockable)); // \ 2223bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 223fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 224fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint l_testfn(int y) { 225fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int x __attribute__((lockable)) = y; // \ 2263bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 227fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 228fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 229fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 230fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint l_test_var __attribute__((lockable)); // \ 2313bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 232fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 233fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass LFoo { 234fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 235fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int test_field __attribute__((lockable)); // \ 2363bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 237fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski void test_method() __attribute__((lockable)); // \ 2383bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 239fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 240fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 241fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 242fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid l_function_params(int lvar __attribute__((lockable))); // \ 2433bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 244fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 245fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 246b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 247b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Scoped Lockable Attribute (sl) 248b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 249fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 250fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(scoped_lockable) 251fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support scoped_lockable attribute" 252fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 253fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 254fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((scoped_lockable)) SLTestClass { 255fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 256fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 257fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((scoped_lockable (1))) SLTestClass_args { // \ 2583bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 259fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 260fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 261fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid sl_test_function() __attribute__((scoped_lockable)); // \ 2623bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 263fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 264fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint sl_testfn(int y) { 265fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int x __attribute__((scoped_lockable)) = y; // \ 2663bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 267fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 268fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 269fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 270fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint sl_test_var __attribute__((scoped_lockable)); // \ 2713bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 272fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 273fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass SLFoo { 274fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 275fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int test_field __attribute__((scoped_lockable)); // \ 2763bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 277fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski void test_method() __attribute__((scoped_lockable)); // \ 2783bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 279fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 280fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 281fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 282fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid sl_function_params(int lvar __attribute__((scoped_lockable))); // \ 2833bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 284db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 285db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 286b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 287b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Guarded By Attribute (gb) 288b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 289db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 290b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// FIXME: Eventually, would we like this attribute to take more than 1 arg? 291db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 292db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(guarded_by) 293db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support guarded_by attribute" 294db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 295db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 296db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//1. Check applied to the right types & argument number 297db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 298db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_var_arg __attribute__((guarded_by(mu1))); 299db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 300db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_var_args __attribute__((guarded_by(mu1, mu2))); // \ 3013bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 302db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 303db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_var_noargs __attribute__((guarded_by)); // \ 3043bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 305db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 306db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass GBFoo { 307db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 308db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int gb_field_noargs __attribute__((guarded_by)); // \ 3093bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 310db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int gb_field_args __attribute__((guarded_by(mu1))); 311db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 312db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 313db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((guarded_by(mu1))) GB { // \ 3143bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 315db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 316db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 317db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid gb_function() __attribute__((guarded_by(mu1))); // \ 3183bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 319db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 320db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid gb_function_params(int gv_lvar __attribute__((guarded_by(mu1)))); // \ 3213bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 322db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 323db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_testfn(int y){ 324db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((guarded_by(mu1))) = y; // \ 3253bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 326db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 327db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 328db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 329b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//2. Check argument parsing. 330b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 331b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 332b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_1 __attribute__((guarded_by(muWrapper.mu))); 333b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_2 __attribute__((guarded_by(muDoubleWrapper.muWrapper->mu))); 334b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_3 __attribute__((guarded_by(muWrapper.getMu()))); 335b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_4 __attribute__((guarded_by(*muWrapper.getMuPointer()))); 336b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_5 __attribute__((guarded_by(&mu1))); 337b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_6 __attribute__((guarded_by(muRef))); 338b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_7 __attribute__((guarded_by(muDoubleWrapper.getWrapper()->getMu()))); 339b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_8 __attribute__((guarded_by(muPointer))); 340b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 341b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 342b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 343b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_bad_1 __attribute__((guarded_by(1))); // \ 34483cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'guarded_by' attribute requires arguments that are class type or point to class type; type here is 'int'}} 345b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_bad_2 __attribute__((guarded_by("mu"))); // \ 34683cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'guarded_by' attribute requires arguments that are class type or point to class type; type here is 'const char [3]'}} 347b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_bad_3 __attribute__((guarded_by(muDoublePointer))); // \ 34883cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'guarded_by' attribute requires arguments that are class type or point to class type; type here is 'class Mu **'}} 349b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_bad_4 __attribute__((guarded_by(umu))); // \ 35083cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'guarded_by' attribute requires arguments whose type is annotated with 'lockable' attribute; type here is 'class UnlockableMu'}} 351db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 352db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//3. 353db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// Thread Safety analysis tests 354db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 355db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 356b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 357b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Pt Guarded By Attribute (pgb) 358b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 359db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 360db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(pt_guarded_by) 361db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support pt_guarded_by attribute" 362db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 363db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 364db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//1. Check applied to the right types & argument number 365db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 366db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint *pgb_var_noargs __attribute__((pt_guarded_by)); // \ 3673bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 368db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 369db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint *pgb_ptr_var_arg __attribute__((pt_guarded_by(mu1))); 370db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 371db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint *pgb_ptr_var_args __attribute__((guarded_by(mu1, mu2))); // \ 3723bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 373db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 374db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint pgb_var_args __attribute__((pt_guarded_by(mu1))); // \ 3753bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' only applies to pointer types; type here is 'int'}} 376db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 377db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass PGBFoo { 378db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 379db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int *pgb_field_noargs __attribute__((pt_guarded_by)); // \ 3803bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 381db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int *pgb_field_args __attribute__((pt_guarded_by(mu1))); 382db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 383db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 384db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((pt_guarded_by(mu1))) PGB { // \ 3853bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 386db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 387db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 388db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid pgb_function() __attribute__((pt_guarded_by(mu1))); // \ 3893bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 390db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 391db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid pgb_function_params(int gv_lvar __attribute__((pt_guarded_by(mu1)))); // \ 3923bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 393db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 394db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid pgb_testfn(int y){ 395db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int *x __attribute__((pt_guarded_by(mu1))) = new int(0); // \ 3963bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 397db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski delete x; 398db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 399db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 400b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//2. Check argument parsing. 401b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 402b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 403b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_1 __attribute__((pt_guarded_by(muWrapper.mu))); 404b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_2 __attribute__((pt_guarded_by(muDoubleWrapper.muWrapper->mu))); 405b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_3 __attribute__((pt_guarded_by(muWrapper.getMu()))); 406b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_4 __attribute__((pt_guarded_by(*muWrapper.getMuPointer()))); 407b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_5 __attribute__((pt_guarded_by(&mu1))); 408b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_6 __attribute__((pt_guarded_by(muRef))); 409b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_7 __attribute__((pt_guarded_by(muDoubleWrapper.getWrapper()->getMu()))); 410b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_8 __attribute__((pt_guarded_by(muPointer))); 411b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 412b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 413b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 414b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_bad_1 __attribute__((pt_guarded_by(1))); // \ 41583cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'pt_guarded_by' attribute requires arguments that are class type or point to class type}} 416b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_bad_2 __attribute__((pt_guarded_by("mu"))); // \ 41783cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'pt_guarded_by' attribute requires arguments that are class type or point to class type}} 418b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_bad_3 __attribute__((pt_guarded_by(muDoublePointer))); // \ 41983cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'pt_guarded_by' attribute requires arguments that are class type or point to class type}} 420b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_bad_4 __attribute__((pt_guarded_by(umu))); // \ 42183cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'pt_guarded_by' attribute requires arguments whose type is annotated with 'lockable' attribute}} 422b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 423b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 424b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 425b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Acquired After (aa) 426b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 427db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 428db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// FIXME: Would we like this attribute to take more than 1 arg? 429db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 430db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(acquired_after) 431db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support acquired_after attribute" 432db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 433db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 434db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu mu_aa __attribute__((acquired_after(mu1))); 435db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 436db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu aa_var_noargs __attribute__((acquired_after)); // \ 4373bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 438db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 439db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass AAFoo { 440db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 441db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu aa_field_noargs __attribute__((acquired_after)); // \ 4423bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 443db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu aa_field_args __attribute__((acquired_after(mu1))); 444db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 445db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 446db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((acquired_after(mu1))) AA { // \ 4473bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 448db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 449db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 450db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid aa_function() __attribute__((acquired_after(mu1))); // \ 4513bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 452db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 453db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid aa_function_params(int gv_lvar __attribute__((acquired_after(mu1)))); // \ 4543bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 455db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 456db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid aa_testfn(int y){ 457db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu x __attribute__((acquired_after(mu1))) = Mu(); // \ 4583bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 459db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 460db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 461b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//Check argument parsing. 462b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 463b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 464b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_1 __attribute__((acquired_after(muWrapper.mu))); 465b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_2 __attribute__((acquired_after(muDoubleWrapper.muWrapper->mu))); 466b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_3 __attribute__((acquired_after(muWrapper.getMu()))); 467b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_4 __attribute__((acquired_after(*muWrapper.getMuPointer()))); 468b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_5 __attribute__((acquired_after(&mu1))); 469b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_6 __attribute__((acquired_after(muRef))); 470b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_7 __attribute__((acquired_after(muDoubleWrapper.getWrapper()->getMu()))); 471b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_8 __attribute__((acquired_after(muPointer))); 472b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 473b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 474b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 475b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_bad_1 __attribute__((acquired_after(1))); // \ 47683cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_after' attribute requires arguments that are class type or point to class type}} 477b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_bad_2 __attribute__((acquired_after("mu"))); // \ 47883cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_after' attribute requires arguments that are class type or point to class type}} 479b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_bad_3 __attribute__((acquired_after(muDoublePointer))); // \ 48083cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_after' attribute requires arguments that are class type or point to class type}} 481b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_bad_4 __attribute__((acquired_after(umu))); // \ 48283cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_after' attribute requires arguments whose type is annotated with 'lockable' attribute}} 483b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiUnlockableMu aa_var_arg_bad_5 __attribute__((acquired_after(mu_aa))); // \ 48483cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_after' attribute can only be applied in a context annotated with 'lockable' attribute}} 485b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 486b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 487b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Acquired Before (ab) 488b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 489db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 490db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(acquired_before) 491db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support acquired_before attribute" 492db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 493db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 494db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu mu_ab __attribute__((acquired_before(mu1))); 495db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 496db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu ab_var_noargs __attribute__((acquired_before)); // \ 4973bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 498db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 499db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ABFoo { 500db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 501db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu ab_field_noargs __attribute__((acquired_before)); // \ 5023bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 503db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu ab_field_args __attribute__((acquired_before(mu1))); 504db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 505db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 506db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((acquired_before(mu1))) AB { // \ 5073bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 508db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 509db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 510db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid ab_function() __attribute__((acquired_before(mu1))); // \ 5113bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 512db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 513db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid ab_function_params(int gv_lvar __attribute__((acquired_before(mu1)))); // \ 5143bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 515db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 516db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid ab_testfn(int y){ 517db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu x __attribute__((acquired_before(mu1))) = Mu(); // \ 5183bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 519db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 520db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 521db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// Note: illegal int ab_int __attribute__((acquired_before(mu1))) will 522db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// be taken care of by warnings that ab__int is not lockable. 523db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 524b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//Check argument parsing. 525b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 526b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 527b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_1 __attribute__((acquired_before(muWrapper.mu))); 528b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_2 __attribute__((acquired_before(muDoubleWrapper.muWrapper->mu))); 529b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_3 __attribute__((acquired_before(muWrapper.getMu()))); 530b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_4 __attribute__((acquired_before(*muWrapper.getMuPointer()))); 531b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_5 __attribute__((acquired_before(&mu1))); 532b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_6 __attribute__((acquired_before(muRef))); 533b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_7 __attribute__((acquired_before(muDoubleWrapper.getWrapper()->getMu()))); 534b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_8 __attribute__((acquired_before(muPointer))); 535b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 536b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 537b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 538b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_bad_1 __attribute__((acquired_before(1))); // \ 53983cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_before' attribute requires arguments that are class type or point to class type}} 540b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_bad_2 __attribute__((acquired_before("mu"))); // \ 54183cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_before' attribute requires arguments that are class type or point to class type}} 542b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_bad_3 __attribute__((acquired_before(muDoublePointer))); // \ 54383cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_before' attribute requires arguments that are class type or point to class type}} 544b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_bad_4 __attribute__((acquired_before(umu))); // \ 54583cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_before' attribute requires arguments whose type is annotated with 'lockable' attribute}} 546b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiUnlockableMu ab_var_arg_bad_5 __attribute__((acquired_before(mu_ab))); // \ 54783cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'acquired_before' attribute can only be applied in a context annotated with 'lockable' attribute}} 548b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 549b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 550b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 551b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive Lock Function (elf) 552b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 553db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 554db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_lock_function) 555db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_lock_function attribute" 556db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 557db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 558db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 559db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 560db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elf_function() __attribute__((exclusive_lock_function)); 561db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 562db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elf_function_args() __attribute__((exclusive_lock_function(mu1, mu2))); 563db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 564db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elf_testfn(int y) __attribute__((exclusive_lock_function)); 565db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 566db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elf_testfn(int y) { 567db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((exclusive_lock_function)) = y; // \ 5683bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 569db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 570db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 571db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 572db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elf_test_var __attribute__((exclusive_lock_function)); // \ 5733bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 574db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 575db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ElfFoo { 576db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 577db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((exclusive_lock_function)); // \ 5783bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 579db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((exclusive_lock_function)); 580db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 581db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 582db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((exclusive_lock_function)) ElfTestClass { // \ 5833bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 584db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 585db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 586db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elf_fun_params(int lvar __attribute__((exclusive_lock_function))); // \ 5873bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 588db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 589b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 590b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 591b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 592b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_1() __attribute__((exclusive_lock_function(muWrapper.mu))); 593b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_2() __attribute__((exclusive_lock_function(muDoubleWrapper.muWrapper->mu))); 594b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_3() __attribute__((exclusive_lock_function(muWrapper.getMu()))); 595b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_4() __attribute__((exclusive_lock_function(*muWrapper.getMuPointer()))); 596b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_5() __attribute__((exclusive_lock_function(&mu1))); 597b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_6() __attribute__((exclusive_lock_function(muRef))); 598b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_7() __attribute__((exclusive_lock_function(muDoubleWrapper.getWrapper()->getMu()))); 599b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_8() __attribute__((exclusive_lock_function(muPointer))); 600b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_9(Mu x) __attribute__((exclusive_lock_function(1))); 601b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_9(Mu x, Mu y) __attribute__((exclusive_lock_function(1,2))); 602b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 603b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 604b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 605b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_2() __attribute__((exclusive_lock_function("mu"))); // \ 60683cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_lock_function' attribute requires arguments that are class type or point to class type}} 607b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_3() __attribute__((exclusive_lock_function(muDoublePointer))); // \ 60883cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_lock_function' attribute requires arguments that are class type or point to class type}} 609b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_4() __attribute__((exclusive_lock_function(umu))); // \ 61083cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_lock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 611b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 612b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_1() __attribute__((exclusive_lock_function(1))); // \ 6133bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 614b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_5(Mu x) __attribute__((exclusive_lock_function(0))); // \ 6153bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 616b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_6(Mu x, Mu y) __attribute__((exclusive_lock_function(0))); // \ 6173bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 618b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_7() __attribute__((exclusive_lock_function(0))); // \ 6193bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 620b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 621b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 622b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 623b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared Lock Function (slf) 624b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 625db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 626db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_lock_function) 627db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_lock_function attribute" 628db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 629db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 630db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 631db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 632db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slf_function() __attribute__((shared_lock_function)); 633db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 634db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slf_function_args() __attribute__((shared_lock_function(mu1, mu2))); 635db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 636db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slf_testfn(int y) __attribute__((shared_lock_function)); 637db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 638db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slf_testfn(int y) { 639db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((shared_lock_function)) = y; // \ 6403bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 641db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 642db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 643db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 644db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slf_test_var __attribute__((shared_lock_function)); // \ 6453bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 646db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 647db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slf_fun_params(int lvar __attribute__((shared_lock_function))); // \ 6483bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 649db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 650db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass SlfFoo { 651db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 652db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((shared_lock_function)); // \ 6533bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 654db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((shared_lock_function)); 655db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 656db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 657db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((shared_lock_function)) SlfTestClass { // \ 6583bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 659db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 660db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 661b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 662b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 663b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 664b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_1() __attribute__((shared_lock_function(muWrapper.mu))); 665b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_2() __attribute__((shared_lock_function(muDoubleWrapper.muWrapper->mu))); 666b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_3() __attribute__((shared_lock_function(muWrapper.getMu()))); 667b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_4() __attribute__((shared_lock_function(*muWrapper.getMuPointer()))); 668b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_5() __attribute__((shared_lock_function(&mu1))); 669b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_6() __attribute__((shared_lock_function(muRef))); 670b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_7() __attribute__((shared_lock_function(muDoubleWrapper.getWrapper()->getMu()))); 671b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_8() __attribute__((shared_lock_function(muPointer))); 672b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_9(Mu x) __attribute__((shared_lock_function(1))); 673b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_9(Mu x, Mu y) __attribute__((shared_lock_function(1,2))); 674b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 675b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 676b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 677b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_2() __attribute__((shared_lock_function("mu"))); // \ 67883cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_lock_function' attribute requires arguments that are class type or point to class type}} 679b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_3() __attribute__((shared_lock_function(muDoublePointer))); // \ 68083cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_lock_function' attribute requires arguments that are class type or point to class type}} 681b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_4() __attribute__((shared_lock_function(umu))); // \ 68283cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_lock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 683b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 684b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_1() __attribute__((shared_lock_function(1))); // \ 6853bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 686b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_5(Mu x) __attribute__((shared_lock_function(0))); // \ 6873bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 688b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_6(Mu x, Mu y) __attribute__((shared_lock_function(0))); // \ 6893bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 690b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_7() __attribute__((shared_lock_function(0))); // \ 6913bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 692b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 693b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 694b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 695b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive TryLock Function (etf) 696b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 697db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 698db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_trylock_function) 699db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_trylock_function attribute" 700db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 701db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 702db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes a mandatory boolean or integer argument specifying the retval 703db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// plus an optional list of locks (vars/fields) 704db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 705db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_function() __attribute__((exclusive_trylock_function)); // \ 7062fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-error {{attribute takes at least 1 argument}} 707db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 708db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_function_args() __attribute__((exclusive_trylock_function(1, mu2))); 709db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 710db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_function_arg() __attribute__((exclusive_trylock_function(1))); 711db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 712db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint etf_testfn(int y) __attribute__((exclusive_trylock_function(1))); 713db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 714db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint etf_testfn(int y) { 715db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((exclusive_trylock_function(1))) = y; // \ 7163bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 717db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 718db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 719db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 720db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint etf_test_var __attribute__((exclusive_trylock_function(1))); // \ 7213bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 722db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 723db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass EtfFoo { 724db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 725db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((exclusive_trylock_function(1))); // \ 7263bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 727db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((exclusive_trylock_function(1))); 728db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 729db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 730db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((exclusive_trylock_function(1))) EtfTestClass { // \ 7313bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 732db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 733db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 734db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_fun_params(int lvar __attribute__((exclusive_trylock_function(1)))); // \ 7353bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 736db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 737b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 738b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 739b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 740b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_1() __attribute__((exclusive_trylock_function(1, muWrapper.mu))); 741b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_2() __attribute__((exclusive_trylock_function(1, muDoubleWrapper.muWrapper->mu))); 742b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_3() __attribute__((exclusive_trylock_function(1, muWrapper.getMu()))); 743b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_4() __attribute__((exclusive_trylock_function(1, *muWrapper.getMuPointer()))); 744b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_5() __attribute__((exclusive_trylock_function(1, &mu1))); 745b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_6() __attribute__((exclusive_trylock_function(1, muRef))); 746b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_7() __attribute__((exclusive_trylock_function(1, muDoubleWrapper.getWrapper()->getMu()))); 747b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_functetfn_8() __attribute__((exclusive_trylock_function(1, muPointer))); 748b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_9() __attribute__((exclusive_trylock_function(true))); 749b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 750b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 751b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 752b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_1() __attribute__((exclusive_trylock_function(mu1))); // \ 7533bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute first argument must be of int or bool type}} 754b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_2() __attribute__((exclusive_trylock_function("mu"))); // \ 7553bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute first argument must be of int or bool type}} 756b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_3() __attribute__((exclusive_trylock_function(muDoublePointer))); // \ 7573bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute first argument must be of int or bool type}} 758db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 759b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_4() __attribute__((exclusive_trylock_function(1, "mu"))); // \ 76083cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_trylock_function' attribute requires arguments that are class type or point to class type}} 761b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_5() __attribute__((exclusive_trylock_function(1, muDoublePointer))); // \ 76283cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_trylock_function' attribute requires arguments that are class type or point to class type}} 763b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_6() __attribute__((exclusive_trylock_function(1, umu))); // \ 76483cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_trylock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 765db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 766b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 767b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 768b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared TryLock Function (stf) 769b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 770db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 771db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_trylock_function) 772db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_trylock_function attribute" 773db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 774db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 775db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes a mandatory boolean or integer argument specifying the retval 776db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// plus an optional list of locks (vars/fields) 777db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 778db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_function() __attribute__((shared_trylock_function)); // \ 7793bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 780db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 781db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_function_args() __attribute__((shared_trylock_function(1, mu2))); 782db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 783db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_function_arg() __attribute__((shared_trylock_function(1))); 784db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 785db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint stf_testfn(int y) __attribute__((shared_trylock_function(1))); 786db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 787db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint stf_testfn(int y) { 788db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((shared_trylock_function(1))) = y; // \ 7893bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 790db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 791db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 792db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 793db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint stf_test_var __attribute__((shared_trylock_function(1))); // \ 7943bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 795db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 796db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_fun_params(int lvar __attribute__((shared_trylock_function(1)))); // \ 7973bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 798db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 799db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 800db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass StfFoo { 801db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 802db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((shared_trylock_function(1))); // \ 8033bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 804db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((shared_trylock_function(1))); 805db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 806db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 807db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((shared_trylock_function(1))) StfTestClass { // \ 8083bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 809db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 810db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 811b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 812b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 813b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 814b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_1() __attribute__((shared_trylock_function(1, muWrapper.mu))); 815b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_2() __attribute__((shared_trylock_function(1, muDoubleWrapper.muWrapper->mu))); 816b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_3() __attribute__((shared_trylock_function(1, muWrapper.getMu()))); 817b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_4() __attribute__((shared_trylock_function(1, *muWrapper.getMuPointer()))); 818b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_5() __attribute__((shared_trylock_function(1, &mu1))); 819b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_6() __attribute__((shared_trylock_function(1, muRef))); 820b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_7() __attribute__((shared_trylock_function(1, muDoubleWrapper.getWrapper()->getMu()))); 821b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_8() __attribute__((shared_trylock_function(1, muPointer))); 822b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_9() __attribute__((shared_trylock_function(true))); 823b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 824b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 825b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 826b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_1() __attribute__((shared_trylock_function(mu1))); // \ 8273bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute first argument must be of int or bool type}} 828b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_2() __attribute__((shared_trylock_function("mu"))); // \ 8293bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute first argument must be of int or bool type}} 830b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_3() __attribute__((shared_trylock_function(muDoublePointer))); // \ 8313bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute first argument must be of int or bool type}} 832db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 833b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_4() __attribute__((shared_trylock_function(1, "mu"))); // \ 83483cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_trylock_function' attribute requires arguments that are class type or point to class type}} 835b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_5() __attribute__((shared_trylock_function(1, muDoublePointer))); // \ 83683cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_trylock_function' attribute requires arguments that are class type or point to class type}} 837b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_6() __attribute__((shared_trylock_function(1, umu))); // \ 83883cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_trylock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 839b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 840b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 841b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 842b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Unlock Function (uf) 843b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 844db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 845db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(unlock_function) 846db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support unlock_function attribute" 847db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 848db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 849db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 850db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 851db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid uf_function() __attribute__((unlock_function)); 852db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 853db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid uf_function_args() __attribute__((unlock_function(mu1, mu2))); 854db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 855db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint uf_testfn(int y) __attribute__((unlock_function)); 856db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 857db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint uf_testfn(int y) { 858db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((unlock_function)) = y; // \ 8593bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'unlock_function' attribute only applies to functions and methods}} 860db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 861db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 862db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 863db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint uf_test_var __attribute__((unlock_function)); // \ 8643bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'unlock_function' attribute only applies to functions and methods}} 865db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 866db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass UfFoo { 867db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 868db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((unlock_function)); // \ 8693bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'unlock_function' attribute only applies to functions and methods}} 870db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((unlock_function)); 871db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 872db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 873db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((no_thread_safety_analysis)) UfTestClass { // \ 8743bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 875db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 876db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 877db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid uf_fun_params(int lvar __attribute__((unlock_function))); // \ 8783bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'unlock_function' attribute only applies to functions and methods}} 879db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 880b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 881b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 882b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 883b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_1() __attribute__((unlock_function(muWrapper.mu))); 884b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_2() __attribute__((unlock_function(muDoubleWrapper.muWrapper->mu))); 885b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_3() __attribute__((unlock_function(muWrapper.getMu()))); 886b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_4() __attribute__((unlock_function(*muWrapper.getMuPointer()))); 887b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_5() __attribute__((unlock_function(&mu1))); 888b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_6() __attribute__((unlock_function(muRef))); 889b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_7() __attribute__((unlock_function(muDoubleWrapper.getWrapper()->getMu()))); 890b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_8() __attribute__((unlock_function(muPointer))); 891b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_9(Mu x) __attribute__((unlock_function(1))); 892b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_9(Mu x, Mu y) __attribute__((unlock_function(1,2))); 893b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 894b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 895b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 896b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_2() __attribute__((unlock_function("mu"))); // \ 89783cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'unlock_function' attribute requires arguments that are class type or point to class type}} 898b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_3() __attribute__((unlock_function(muDoublePointer))); // \ 89983cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'unlock_function' attribute requires arguments that are class type or point to class type}} 900b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_4() __attribute__((unlock_function(umu))); // \ 90183cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'unlock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 902b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 903b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_1() __attribute__((unlock_function(1))); // \ 9043bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 905b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_5(Mu x) __attribute__((unlock_function(0))); // \ 9063bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 907b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_6(Mu x, Mu y) __attribute__((unlock_function(0))); // \ 9083bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 909b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_7() __attribute__((unlock_function(0))); // \ 9103bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 911b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 912b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 913b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 914b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Lock Returned (lr) 915b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 916db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 917db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(lock_returned) 918db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support lock_returned attribute" 919db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 920db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 921db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// Takes exactly one argument, a var/field 922db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 923db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_function() __attribute__((lock_returned)); // \ 9243bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 925db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 926db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_function_arg() __attribute__((lock_returned(mu1))); 927db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 928db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_function_args() __attribute__((lock_returned(mu1, mu2))); // \ 9293bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 930db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 931db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint lr_testfn(int y) __attribute__((lock_returned(mu1))); 932db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 933db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint lr_testfn(int y) { 934db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((lock_returned(mu1))) = y; // \ 9353bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 936db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 937db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 938db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 939db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint lr_test_var __attribute__((lock_returned(mu1))); // \ 9403bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 941db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 942db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_fun_params(int lvar __attribute__((lock_returned(mu1)))); // \ 9433bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 944db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 945db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass LrFoo { 946db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 947db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((lock_returned(mu1))); // \ 9483bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 949db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((lock_returned(mu1))); 950db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 951db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 952db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((lock_returned(mu1))) LrTestClass { // \ 9533bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 954db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 955db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 956b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 957b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 958b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 959b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_1() __attribute__((lock_returned(muWrapper.mu))); 960b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_2() __attribute__((lock_returned(muDoubleWrapper.muWrapper->mu))); 961b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_3() __attribute__((lock_returned(muWrapper.getMu()))); 962b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_4() __attribute__((lock_returned(*muWrapper.getMuPointer()))); 963b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_5() __attribute__((lock_returned(&mu1))); 964b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_6() __attribute__((lock_returned(muRef))); 965b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_7() __attribute__((lock_returned(muDoubleWrapper.getWrapper()->getMu()))); 966b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_8() __attribute__((lock_returned(muPointer))); 967b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 968b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 969b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 970b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_bad_1() __attribute__((lock_returned(1))); // \ 97183cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'lock_returned' attribute requires arguments that are class type or point to class type}} 972b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_bad_2() __attribute__((lock_returned("mu"))); // \ 97383cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'lock_returned' attribute requires arguments that are class type or point to class type}} 974b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_bad_3() __attribute__((lock_returned(muDoublePointer))); // \ 97583cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'lock_returned' attribute requires arguments that are class type or point to class type}} 976b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_bad_4() __attribute__((lock_returned(umu))); // \ 97783cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'lock_returned' attribute requires arguments whose type is annotated with 'lockable' attribute}} 978b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 979b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 980b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 981b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 982b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Locks Excluded (le) 983b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 984db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 985db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(locks_excluded) 986db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support locks_excluded attribute" 987db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 988db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 989db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 990db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 991db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_function() __attribute__((locks_excluded)); // \ 9923bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 993db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 994db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_function_arg() __attribute__((locks_excluded(mu1))); 995db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 996db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_function_args() __attribute__((locks_excluded(mu1, mu2))); 997db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 998db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint le_testfn(int y) __attribute__((locks_excluded(mu1))); 999db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1000db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint le_testfn(int y) { 1001db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((locks_excluded(mu1))) = y; // \ 10023bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 1003db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 1004db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1005db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1006db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint le_test_var __attribute__((locks_excluded(mu1))); // \ 10073bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 1008db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1009db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_fun_params(int lvar __attribute__((locks_excluded(mu1)))); // \ 10103bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 1011db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1012db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass LeFoo { 1013db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 1014db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((locks_excluded(mu1))); // \ 10153bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 1016db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((locks_excluded(mu1))); 1017db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1018db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1019db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((locks_excluded(mu1))) LeTestClass { // \ 10203bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 1021db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1022db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1023b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1024b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1025b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 1026b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_1() __attribute__((locks_excluded(muWrapper.mu))); 1027b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_2() __attribute__((locks_excluded(muDoubleWrapper.muWrapper->mu))); 1028b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_3() __attribute__((locks_excluded(muWrapper.getMu()))); 1029b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_4() __attribute__((locks_excluded(*muWrapper.getMuPointer()))); 1030b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_5() __attribute__((locks_excluded(&mu1))); 1031b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_6() __attribute__((locks_excluded(muRef))); 1032b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_7() __attribute__((locks_excluded(muDoubleWrapper.getWrapper()->getMu()))); 1033b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_8() __attribute__((locks_excluded(muPointer))); 1034db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1035b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1036b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 1037b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_bad_1() __attribute__((locks_excluded(1))); // \ 103883cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'locks_excluded' attribute requires arguments that are class type or point to class type}} 1039b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_bad_2() __attribute__((locks_excluded("mu"))); // \ 104083cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'locks_excluded' attribute requires arguments that are class type or point to class type}} 1041b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_bad_3() __attribute__((locks_excluded(muDoublePointer))); // \ 104283cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'locks_excluded' attribute requires arguments that are class type or point to class type}} 1043b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_bad_4() __attribute__((locks_excluded(umu))); // \ 104483cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'locks_excluded' attribute requires arguments whose type is annotated with 'lockable' attribute}} 1045b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1046b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1047b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1048b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1049b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive Locks Required (elr) 1050b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1051db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1052db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_locks_required) 1053db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_locks_required attribute" 1054db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 1055db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1056db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 1057db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1058db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_function() __attribute__((exclusive_locks_required)); // \ 10593bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 1060db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1061db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_function_arg() __attribute__((exclusive_locks_required(mu1))); 1062db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1063db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_function_args() __attribute__((exclusive_locks_required(mu1, mu2))); 1064db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1065db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elr_testfn(int y) __attribute__((exclusive_locks_required(mu1))); 1066db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1067db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elr_testfn(int y) { 1068db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((exclusive_locks_required(mu1))) = y; // \ 10693bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1070db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 1071db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1072db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1073db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elr_test_var __attribute__((exclusive_locks_required(mu1))); // \ 10743bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1075db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1076db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_fun_params(int lvar __attribute__((exclusive_locks_required(mu1)))); // \ 10773bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1078db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1079db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ElrFoo { 1080db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 1081db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((exclusive_locks_required(mu1))); // \ 10823bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1083db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((exclusive_locks_required(mu1))); 1084db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1085db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1086db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((exclusive_locks_required(mu1))) ElrTestClass { // \ 10873bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1088db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1089db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1090b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1091b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1092b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 1093b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_1() __attribute__((exclusive_locks_required(muWrapper.mu))); 1094b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_2() __attribute__((exclusive_locks_required(muDoubleWrapper.muWrapper->mu))); 1095b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_3() __attribute__((exclusive_locks_required(muWrapper.getMu()))); 1096b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_4() __attribute__((exclusive_locks_required(*muWrapper.getMuPointer()))); 1097b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_5() __attribute__((exclusive_locks_required(&mu1))); 1098b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_6() __attribute__((exclusive_locks_required(muRef))); 1099b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_7() __attribute__((exclusive_locks_required(muDoubleWrapper.getWrapper()->getMu()))); 1100b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_8() __attribute__((exclusive_locks_required(muPointer))); 1101b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1102b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1103b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 1104b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_bad_1() __attribute__((exclusive_locks_required(1))); // \ 110583cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_locks_required' attribute requires arguments that are class type or point to class type}} 1106b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_bad_2() __attribute__((exclusive_locks_required("mu"))); // \ 110783cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_locks_required' attribute requires arguments that are class type or point to class type}} 1108b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_bad_3() __attribute__((exclusive_locks_required(muDoublePointer))); // \ 110983cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_locks_required' attribute requires arguments that are class type or point to class type}} 1110b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_bad_4() __attribute__((exclusive_locks_required(umu))); // \ 111183cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'exclusive_locks_required' attribute requires arguments whose type is annotated with 'lockable' attribute}} 1112b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1113b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1114b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1115b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1116b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1117b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared Locks Required (slr) 1118b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1119db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1120db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_locks_required) 1121db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_locks_required attribute" 1122db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 1123db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1124db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 1125db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1126db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_function() __attribute__((shared_locks_required)); // \ 11273bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 1128db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1129db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_function_arg() __attribute__((shared_locks_required(mu1))); 1130db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1131db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_function_args() __attribute__((shared_locks_required(mu1, mu2))); 1132db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1133db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slr_testfn(int y) __attribute__((shared_locks_required(mu1))); 1134db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1135db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slr_testfn(int y) { 1136db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((shared_locks_required(mu1))) = y; // \ 11373bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1138db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 1139db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1140db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1141db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slr_test_var __attribute__((shared_locks_required(mu1))); // \ 11423bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1143db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1144db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_fun_params(int lvar __attribute__((shared_locks_required(mu1)))); // \ 11453bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1146db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1147db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass SlrFoo { 1148db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 1149db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((shared_locks_required(mu1))); // \ 11503bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1151db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((shared_locks_required(mu1))); 1152db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1153db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1154db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((shared_locks_required(mu1))) SlrTestClass { // \ 11553bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1156db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1157b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1158b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1159b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1160b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 1161b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_1() __attribute__((shared_locks_required(muWrapper.mu))); 1162b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_2() __attribute__((shared_locks_required(muDoubleWrapper.muWrapper->mu))); 1163b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_3() __attribute__((shared_locks_required(muWrapper.getMu()))); 1164b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_4() __attribute__((shared_locks_required(*muWrapper.getMuPointer()))); 1165b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_5() __attribute__((shared_locks_required(&mu1))); 1166b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_6() __attribute__((shared_locks_required(muRef))); 1167b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_7() __attribute__((shared_locks_required(muDoubleWrapper.getWrapper()->getMu()))); 1168b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_8() __attribute__((shared_locks_required(muPointer))); 1169b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1170b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1171b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 1172b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_bad_1() __attribute__((shared_locks_required(1))); // \ 117383cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_locks_required' attribute requires arguments that are class type or point to class type}} 1174b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_bad_2() __attribute__((shared_locks_required("mu"))); // \ 117583cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_locks_required' attribute requires arguments that are class type or point to class type}} 1176b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_bad_3() __attribute__((shared_locks_required(muDoublePointer))); // \ 117783cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_locks_required' attribute requires arguments that are class type or point to class type}} 1178b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_bad_4() __attribute__((shared_locks_required(umu))); // \ 117983cad4544f8a89fb6a611f330d71d027c238375eDeLesley Hutchins // expected-warning {{'shared_locks_required' attribute requires arguments whose type is annotated with 'lockable' attribute}} 1180b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1181b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1182b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//-----------------------------------------// 1183b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Regression tests for unusual cases. 1184b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//-----------------------------------------// 1185b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1186b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiint trivially_false_edges(bool b) { 1187b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // Create NULL (never taken) edges in CFG 1188b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski if (false) return 1; 1189b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski else return 2; 1190b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1191b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1192b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Possible Clang bug -- method pointer in template parameter 1193b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass UnFoo { 1194b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskipublic: 1195b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void foo(); 1196b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1197b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1198b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskitemplate<void (UnFoo::*methptr)()> 1199b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass MCaller { 1200b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskipublic: 1201b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski static void call_method_ptr(UnFoo *f) { 1202b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // FIXME: Possible Clang bug: 1203b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // getCalleeDecl() returns NULL in the following case: 1204b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski (f->*methptr)(); 1205b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1206b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1207b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1208b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskivoid call_method_ptr_inst(UnFoo* f) { 1209b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski MCaller<&UnFoo::foo>::call_method_ptr(f); 1210b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1211b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1212b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiint temp; 1213b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskivoid empty_back_edge() { 1214b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // Create a back edge to a block with with no statements 1215b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski for (;;) { 1216b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ++temp; 1217b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski if (temp > 10) break; 1218b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1219b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1220b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1221b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskistruct Foomger { 1222b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void operator++(); 1223b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1224b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1225b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskistruct Foomgoper { 1226b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski Foomger f; 1227b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1228b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski bool done(); 1229b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void invalid_back_edge() { 1230b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski do { 1231b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // FIXME: Possible Clang bug: 1232b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // The first statement in this basic block has no source location 1233b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ++f; 1234b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } while (!done()); 1235b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1236b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1237b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1238b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1239ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski//----------------------------------------------------- 1240ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski// Parsing of member variables and function parameters 1241ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski//------------------------------------------------------ 1242ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1243ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin SadowskiMu gmu; 1244ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1245ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskiclass StaticMu { 1246ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski static Mu statmu; 1247ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski}; 1248ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1249ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskiclass FooLate { 1250ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskipublic: 1251ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo1() __attribute__((exclusive_locks_required(gmu))) { } 1252ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo2() __attribute__((exclusive_locks_required(mu))) { } 1253ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo3(Mu *m) __attribute__((exclusive_locks_required(m))) { } 1254ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo3(FooLate *f) __attribute__((exclusive_locks_required(f->mu))) { } 1255ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo4(FooLate *f) __attribute__((exclusive_locks_required(f->mu))); 1256ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1257ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski static void foo5() __attribute__((exclusive_locks_required(mu))); // \ 1258cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor // expected-error {{'this' cannot be implicitly used in a static member function declaration}} 1259ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1260ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski template <class T> 1261ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo6() __attribute__((exclusive_locks_required(T::statmu))) { } 1262ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1263ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski template <class T> 1264ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo7(T* f) __attribute__((exclusive_locks_required(f->mu))) { } 1265ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1266ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski int a __attribute__((guarded_by(gmu))); 1267ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski int b __attribute__((guarded_by(mu))); 1268ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski int c __attribute__((guarded_by(this->mu))); 1269ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1270ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski Mu mu; 1271ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski}; 1272ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 12734805f158203017bdf575003235473284134c1071DeLesley Hutchins//------------------------- 12744805f158203017bdf575003235473284134c1071DeLesley Hutchins// Empty argument lists 12754805f158203017bdf575003235473284134c1071DeLesley Hutchins//------------------------- 12764805f158203017bdf575003235473284134c1071DeLesley Hutchins 12774805f158203017bdf575003235473284134c1071DeLesley Hutchinsclass __attribute__((lockable)) EmptyArgListsTest { 12784805f158203017bdf575003235473284134c1071DeLesley Hutchins void lock() __attribute__((exclusive_lock_function())) { } 12794805f158203017bdf575003235473284134c1071DeLesley Hutchins void unlock() __attribute__((unlock_function())) { } 12804805f158203017bdf575003235473284134c1071DeLesley Hutchins}; 12814805f158203017bdf575003235473284134c1071DeLesley Hutchins 1282c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1283c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsnamespace FunctionDefinitionParseTest { 1284c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins// Test parsing of attributes on function definitions. 1285c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1286c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsclass Foo { 1287c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinspublic: 1288c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins Mu mu_; 1289c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins void foo1(); 1290c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins void foo2(Foo *f); 1291c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins}; 1292c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1293c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinstemplate <class T> 1294c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsclass Bar { 1295c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinspublic: 1296c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins Mu mu_; 1297c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins void bar(); 1298c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins}; 1299c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1300c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsvoid Foo::foo1() __attribute__((exclusive_locks_required(mu_))) { } 1301c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsvoid Foo::foo2(Foo *f) __attribute__((exclusive_locks_required(f->mu_))) { } 1302c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1303c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinstemplate <class T> 1304c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsvoid Bar<T>::bar() __attribute__((exclusive_locks_required(mu_))) { } 1305c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 1306c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchinsvoid baz(Foo *f) __attribute__((exclusive_locks_required(f->mu_))) { } 13072287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13082287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins} // end namespace 13092287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13102287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13112287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchinsnamespace TestMultiDecl { 13122287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13132287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchinsclass Foo { 13142287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchinspublic: 13152287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins int __attribute__((guarded_by(mu_))) a; 13162287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins int __attribute__((guarded_by(mu_))) b, c; 13172287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 13182287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchinsprivate: 13192287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins Mu mu_; 1320c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins}; 1321c24a2335677f3d1bd2cab1019ac445d650f52123DeLesley Hutchins 13222287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 1323cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchinsnamespace NestedClassLateDecl { 1324cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1325cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchinsclass Foo { 1326cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins class Bar { 1327cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins int a GUARDED_BY(mu); 1328cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins int b GUARDED_BY(fooMuStatic); 1329cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1330cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins void bar() EXCLUSIVE_LOCKS_REQUIRED(mu) { a = 0; } 1331cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins void bar2(Bar* b) EXCLUSIVE_LOCKS_REQUIRED(b->mu) { b->a = 0; } 1332cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins void bar3(Foo* f) EXCLUSIVE_LOCKS_REQUIRED(f->fooMu) { f->a = 0; } 1333cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1334cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins Mu mu; 1335cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins }; 1336cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1337cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins int a GUARDED_BY(fooMu); 1338cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins Mu fooMu; 1339cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins static Mu fooMuStatic; 1340cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins}; 1341cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 1342cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins} 1343cf2fa2f0c9d67adb98b282ec0eaa88f08df29804DeLesley Hutchins 13442287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins} // end namespace TestMultiDecl 13452287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 1346