warn-thread-safety-parsing.cpp revision 2fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fc
1b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety %s 2fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 3db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 4b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 5b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Helper fields 6b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 7db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 8db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((lockable)) Mu { 9eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski public: 10eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void Lock(); 11db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 12db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 13b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass UnlockableMu{ 14b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 15b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 16b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass MuWrapper { 17b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski public: 18b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski Mu mu; 19b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski Mu getMu() { 20b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return mu; 21b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 22b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski Mu * getMuPointer() { 23b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return μ 24b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 25b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 26b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 27b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 28b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiclass MuDoubleWrapper { 29b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski public: 30b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski MuWrapper* muWrapper; 31b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski MuWrapper* getWrapper() { 32b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski return muWrapper; 33b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski } 34b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski}; 35b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 36db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu mu1; 37b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiUnlockableMu umu; 38db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu mu2; 39b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMuWrapper muWrapper; 40b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMuDoubleWrapper muDoubleWrapper; 41b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu* muPointer; 42b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ** muDoublePointer = & muPointer; 43b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu& muRef = mu1; 44db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 45eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//---------------------------------------// 46eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// Scoping tests 47eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//--------------------------------------// 48eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 49eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Foo { 50eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mu foomu; 51eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void needLock() __attribute__((exclusive_lock_function(foomu))); 52eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 53eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 54eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Foo2 { 55eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void needLock() __attribute__((exclusive_lock_function(foomu))); 56eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mu foomu; 57eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 58eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 59eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass Bar { 60eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mu barmu; 61eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mu barmu2 __attribute__((acquired_after(barmu))); 62eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 63eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 64eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 65b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 66b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// No Thread Safety Analysis (noanal) // 67b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 68fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 69fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski// FIXME: Right now we cannot parse attributes put on function definitions 70fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski// We would like to patch this at some point. 71fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 72fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(no_thread_safety_analysis) 73fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support no_thread_safety_analysis attribute" 74fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 75fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid noanal_fun() __attribute__((no_thread_safety_analysis)); 77fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid noanal_fun_args() __attribute__((no_thread_safety_analysis(1))); // \ 793bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 80fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 81fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint noanal_testfn(int y) __attribute__((no_thread_safety_analysis)); 82fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 83fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint noanal_testfn(int y) { 84fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int x __attribute__((no_thread_safety_analysis)) = y; // \ 853bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 86fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 87fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 88fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 89fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint noanal_test_var __attribute__((no_thread_safety_analysis)); // \ 903bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 91fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 92fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass NoanalFoo { 93fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 94fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int test_field __attribute__((no_thread_safety_analysis)); // \ 953bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 96fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski void test_method() __attribute__((no_thread_safety_analysis)); 97fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 98fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 99fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((no_thread_safety_analysis)) NoanalTestClass { // \ 1003bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 101fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 102fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 103fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid noanal_fun_params(int lvar __attribute__((no_thread_safety_analysis))); // \ 1043bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 105fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 106fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 107b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 108b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Guarded Var Attribute (gv) 109b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 110fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 111fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(guarded_var) 112fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support guarded_var attribute" 113fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 114fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 115fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint gv_var_noargs __attribute__((guarded_var)); 116fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 117fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint gv_var_args __attribute__((guarded_var(1))); // \ 1183bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 119fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 120fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass GVFoo { 121fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 122fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int gv_field_noargs __attribute__((guarded_var)); 123fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int gv_field_args __attribute__((guarded_var(1))); // \ 1243bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 125fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 126fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 127fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((guarded_var)) GV { // \ 1283bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 129fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 130fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 131fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid gv_function() __attribute__((guarded_var)); // \ 1323bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 133fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 134fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid gv_function_params(int gv_lvar __attribute__((guarded_var))); // \ 1353bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 136fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 137fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint gv_testfn(int y){ 138fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int x __attribute__((guarded_var)) = y; // \ 1393bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_var' attribute only applies to fields and global variables}} 140fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 141fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 142fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 143b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 144b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Pt Guarded Var Attribute (pgv) 145b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 146fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 147fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski//FIXME: add support for boost::scoped_ptr<int> fancyptr and references 148fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 149fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(pt_guarded_var) 150fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support pt_guarded_var attribute" 151fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 152fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 153fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint *pgv_pt_var_noargs __attribute__((pt_guarded_var)); 154fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 155fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint pgv_var_noargs __attribute__((pt_guarded_var)); // \ 1563bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' only applies to pointer types; type here is 'int'}} 157fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 158fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass PGVFoo { 159fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 160fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int *pt_field_noargs __attribute__((pt_guarded_var)); 161fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int field_noargs __attribute__((pt_guarded_var)); // \ 1623bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' only applies to pointer types; type here is 'int'}} 163fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int *gv_field_args __attribute__((pt_guarded_var(1))); // \ 1643bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 165fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 166fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 167fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((pt_guarded_var)) PGV { // \ 1683bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 169fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 170fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 171fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint *pgv_var_args __attribute__((pt_guarded_var(1))); // \ 1723bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 173fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 174fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 175fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid pgv_function() __attribute__((pt_guarded_var)); // \ 1763bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 177fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 178fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid pgv_function_params(int *gv_lvar __attribute__((pt_guarded_var))); // \ 1793bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 180fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 181fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid pgv_testfn(int y){ 182fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int *x __attribute__((pt_guarded_var)) = new int(0); // \ 1833bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_var' attribute only applies to fields and global variables}} 184fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski delete x; 185fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 186fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 187b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 188b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Lockable Attribute (l) 189b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 190fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 191fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski//FIXME: In future we may want to add support for structs, ObjC classes, etc. 192fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 193fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(lockable) 194fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support lockable attribute" 195fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 196fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 197fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((lockable)) LTestClass { 198fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 199fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 200fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((lockable (1))) LTestClass_args { // \ 2013bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 202fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 203fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 204fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid l_test_function() __attribute__((lockable)); // \ 2053bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 206fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 207fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint l_testfn(int y) { 208fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int x __attribute__((lockable)) = y; // \ 2093bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 210fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 211fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 212fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 213fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint l_test_var __attribute__((lockable)); // \ 2143bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 215fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 216fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass LFoo { 217fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 218fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int test_field __attribute__((lockable)); // \ 2193bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 220fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski void test_method() __attribute__((lockable)); // \ 2213bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 222fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 223fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 224fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 225fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid l_function_params(int lvar __attribute__((lockable))); // \ 2263bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lockable' attribute only applies to classes}} 227fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 228fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 229b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 230b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Scoped Lockable Attribute (sl) 231b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 232fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 233fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#if !__has_attribute(scoped_lockable) 234fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#error "Should support scoped_lockable attribute" 235fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski#endif 236fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 237fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((scoped_lockable)) SLTestClass { 238fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 239fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 240fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass __attribute__((scoped_lockable (1))) SLTestClass_args { // \ 2413bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes no arguments}} 242fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 243fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 244fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid sl_test_function() __attribute__((scoped_lockable)); // \ 2453bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 246fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 247fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint sl_testfn(int y) { 248fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int x __attribute__((scoped_lockable)) = y; // \ 2493bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 250fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski return x; 251fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski} 252fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 253fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiint sl_test_var __attribute__((scoped_lockable)); // \ 2543bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 255fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 256fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskiclass SLFoo { 257fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski private: 258fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski int test_field __attribute__((scoped_lockable)); // \ 2593bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 260fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski void test_method() __attribute__((scoped_lockable)); // \ 2613bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 262fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski}; 263fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 264fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowski 265fdde9e719ad75e656a1475a36b06c2f88f0957ccCaitlin Sadowskivoid sl_function_params(int lvar __attribute__((scoped_lockable))); // \ 2663bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'scoped_lockable' attribute only applies to classes}} 267db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 268db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 269b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 270b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Guarded By Attribute (gb) 271b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 272db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 273b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// FIXME: Eventually, would we like this attribute to take more than 1 arg? 274db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 275db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(guarded_by) 276db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support guarded_by attribute" 277db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 278db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 279db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//1. Check applied to the right types & argument number 280db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 281db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_var_arg __attribute__((guarded_by(mu1))); 282db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 283db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_var_args __attribute__((guarded_by(mu1, mu2))); // \ 2843bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 285db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 286db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_var_noargs __attribute__((guarded_by)); // \ 2873bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 288db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 289db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass GBFoo { 290db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 291db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int gb_field_noargs __attribute__((guarded_by)); // \ 2923bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 293db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int gb_field_args __attribute__((guarded_by(mu1))); 294db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 295db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 296db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((guarded_by(mu1))) GB { // \ 2973bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 298db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 299db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 300db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid gb_function() __attribute__((guarded_by(mu1))); // \ 3013bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 302db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 303db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid gb_function_params(int gv_lvar __attribute__((guarded_by(mu1)))); // \ 3043bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 305db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 306db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint gb_testfn(int y){ 307db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((guarded_by(mu1))) = y; // \ 3083bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'guarded_by' attribute only applies to fields and global variables}} 309db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 310db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 311db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 312b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//2. Check argument parsing. 313b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 314b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 315b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_1 __attribute__((guarded_by(muWrapper.mu))); 316b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_2 __attribute__((guarded_by(muDoubleWrapper.muWrapper->mu))); 317b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_3 __attribute__((guarded_by(muWrapper.getMu()))); 318b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_4 __attribute__((guarded_by(*muWrapper.getMuPointer()))); 319b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_5 __attribute__((guarded_by(&mu1))); 320b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_6 __attribute__((guarded_by(muRef))); 321b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_7 __attribute__((guarded_by(muDoubleWrapper.getWrapper()->getMu()))); 322b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_8 __attribute__((guarded_by(muPointer))); 323b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 324b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 325b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 326b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_bad_1 __attribute__((guarded_by(1))); // \ 3273bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'guarded_by' attribute requires arguments that are class type or point to class type}} 328b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_bad_2 __attribute__((guarded_by("mu"))); // \ 3293bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'guarded_by' attribute requires arguments that are class type or point to class type}} 330b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_bad_3 __attribute__((guarded_by(muDoublePointer))); // \ 3313bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'guarded_by' attribute requires arguments that are class type or point to class type}} 332b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint gb_var_arg_bad_4 __attribute__((guarded_by(umu))); // \ 3333bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'guarded_by' attribute requires arguments whose type is annotated with 'lockable' attribute}} 334db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 335db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//3. 336db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// Thread Safety analysis tests 337db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 338db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 339b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 340b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Pt Guarded By Attribute (pgb) 341b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 342db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 343db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(pt_guarded_by) 344db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support pt_guarded_by attribute" 345db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 346db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 347db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski//1. Check applied to the right types & argument number 348db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 349db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint *pgb_var_noargs __attribute__((pt_guarded_by)); // \ 3503bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 351db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 352db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint *pgb_ptr_var_arg __attribute__((pt_guarded_by(mu1))); 353db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 354db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint *pgb_ptr_var_args __attribute__((guarded_by(mu1, mu2))); // \ 3553bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 356db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 357db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint pgb_var_args __attribute__((pt_guarded_by(mu1))); // \ 3583bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' only applies to pointer types; type here is 'int'}} 359db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 360db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass PGBFoo { 361db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 362db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int *pgb_field_noargs __attribute__((pt_guarded_by)); // \ 3633bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 364db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int *pgb_field_args __attribute__((pt_guarded_by(mu1))); 365db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 366db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 367db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((pt_guarded_by(mu1))) PGB { // \ 3683bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 369db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 370db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 371db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid pgb_function() __attribute__((pt_guarded_by(mu1))); // \ 3723bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 373db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 374db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid pgb_function_params(int gv_lvar __attribute__((pt_guarded_by(mu1)))); // \ 3753bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 376db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 377db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid pgb_testfn(int y){ 378db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int *x __attribute__((pt_guarded_by(mu1))) = new int(0); // \ 3793bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'pt_guarded_by' attribute only applies to fields and global variables}} 380db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski delete x; 381db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 382db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 383b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//2. Check argument parsing. 384b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 385b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 386b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_1 __attribute__((pt_guarded_by(muWrapper.mu))); 387b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_2 __attribute__((pt_guarded_by(muDoubleWrapper.muWrapper->mu))); 388b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_3 __attribute__((pt_guarded_by(muWrapper.getMu()))); 389b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_4 __attribute__((pt_guarded_by(*muWrapper.getMuPointer()))); 390b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_5 __attribute__((pt_guarded_by(&mu1))); 391b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_6 __attribute__((pt_guarded_by(muRef))); 392b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_7 __attribute__((pt_guarded_by(muDoubleWrapper.getWrapper()->getMu()))); 393b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_8 __attribute__((pt_guarded_by(muPointer))); 394b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 395b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 396b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 397b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_bad_1 __attribute__((pt_guarded_by(1))); // \ 3983bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'pt_guarded_by' attribute requires arguments that are class type or point to class type}} 399b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_bad_2 __attribute__((pt_guarded_by("mu"))); // \ 4003bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'pt_guarded_by' attribute requires arguments that are class type or point to class type}} 401b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_bad_3 __attribute__((pt_guarded_by(muDoublePointer))); // \ 4023bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'pt_guarded_by' attribute requires arguments that are class type or point to class type}} 403b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint * pgb_var_arg_bad_4 __attribute__((pt_guarded_by(umu))); // \ 4043bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'pt_guarded_by' attribute requires arguments whose type is annotated with 'lockable' attribute}} 405b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 406b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 407b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 408b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Acquired After (aa) 409b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 410db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 411db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// FIXME: Would we like this attribute to take more than 1 arg? 412db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 413db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(acquired_after) 414db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support acquired_after attribute" 415db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 416db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 417db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu mu_aa __attribute__((acquired_after(mu1))); 418db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 419db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu aa_var_noargs __attribute__((acquired_after)); // \ 4203bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 421db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 422db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass AAFoo { 423db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 424db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu aa_field_noargs __attribute__((acquired_after)); // \ 4253bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 426db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu aa_field_args __attribute__((acquired_after(mu1))); 427db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 428db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 429db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((acquired_after(mu1))) AA { // \ 4303bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 431db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 432db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 433db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid aa_function() __attribute__((acquired_after(mu1))); // \ 4343bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 435db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 436db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid aa_function_params(int gv_lvar __attribute__((acquired_after(mu1)))); // \ 4373bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 438db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 439db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid aa_testfn(int y){ 440db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu x __attribute__((acquired_after(mu1))) = Mu(); // \ 4413bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_after' attribute only applies to fields and global variables}} 442db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 443db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 444b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//Check argument parsing. 445b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 446b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 447b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_1 __attribute__((acquired_after(muWrapper.mu))); 448b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_2 __attribute__((acquired_after(muDoubleWrapper.muWrapper->mu))); 449b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_3 __attribute__((acquired_after(muWrapper.getMu()))); 450b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_4 __attribute__((acquired_after(*muWrapper.getMuPointer()))); 451b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_5 __attribute__((acquired_after(&mu1))); 452b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_6 __attribute__((acquired_after(muRef))); 453b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_7 __attribute__((acquired_after(muDoubleWrapper.getWrapper()->getMu()))); 454b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_8 __attribute__((acquired_after(muPointer))); 455b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 456b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 457b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 458b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_bad_1 __attribute__((acquired_after(1))); // \ 4593bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_after' attribute requires arguments that are class type or point to class type}} 460b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_bad_2 __attribute__((acquired_after("mu"))); // \ 4613bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_after' attribute requires arguments that are class type or point to class type}} 462b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_bad_3 __attribute__((acquired_after(muDoublePointer))); // \ 4633bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_after' attribute requires arguments that are class type or point to class type}} 464b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu aa_var_arg_bad_4 __attribute__((acquired_after(umu))); // \ 4653bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_after' attribute requires arguments whose type is annotated with 'lockable' attribute}} 466b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiUnlockableMu aa_var_arg_bad_5 __attribute__((acquired_after(mu_aa))); // \ 4673bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_after' attribute can only be applied in a context annotated with 'lockable' attribute}} 468b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 469b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 470b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Acquired Before (ab) 471b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 472db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 473db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(acquired_before) 474db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support acquired_before attribute" 475db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 476db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 477db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu mu_ab __attribute__((acquired_before(mu1))); 478db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 479db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin SadowskiMu ab_var_noargs __attribute__((acquired_before)); // \ 4803bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 481db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 482db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ABFoo { 483db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 484db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu ab_field_noargs __attribute__((acquired_before)); // \ 4853bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 486db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu ab_field_args __attribute__((acquired_before(mu1))); 487db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 488db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 489db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((acquired_before(mu1))) AB { // \ 4903bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 491db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 492db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 493db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid ab_function() __attribute__((acquired_before(mu1))); // \ 4943bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 495db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 496db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid ab_function_params(int gv_lvar __attribute__((acquired_before(mu1)))); // \ 4973bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 498db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 499db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid ab_testfn(int y){ 500db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski Mu x __attribute__((acquired_before(mu1))) = Mu(); // \ 5013bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'acquired_before' attribute only applies to fields and global variables}} 502db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski} 503db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 504db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// Note: illegal int ab_int __attribute__((acquired_before(mu1))) will 505db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// be taken care of by warnings that ab__int is not lockable. 506db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 507b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//Check argument parsing. 508b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 509b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 510b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_1 __attribute__((acquired_before(muWrapper.mu))); 511b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_2 __attribute__((acquired_before(muDoubleWrapper.muWrapper->mu))); 512b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_3 __attribute__((acquired_before(muWrapper.getMu()))); 513b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_4 __attribute__((acquired_before(*muWrapper.getMuPointer()))); 514b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_5 __attribute__((acquired_before(&mu1))); 515b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_6 __attribute__((acquired_before(muRef))); 516b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_7 __attribute__((acquired_before(muDoubleWrapper.getWrapper()->getMu()))); 517b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_8 __attribute__((acquired_before(muPointer))); 518b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 519b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 520b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 521b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_bad_1 __attribute__((acquired_before(1))); // \ 5223bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_before' attribute requires arguments that are class type or point to class type}} 523b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_bad_2 __attribute__((acquired_before("mu"))); // \ 5243bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_before' attribute requires arguments that are class type or point to class type}} 525b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_bad_3 __attribute__((acquired_before(muDoublePointer))); // \ 5263bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_before' attribute requires arguments that are class type or point to class type}} 527b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiMu ab_var_arg_bad_4 __attribute__((acquired_before(umu))); // \ 5283bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_before' attribute requires arguments whose type is annotated with 'lockable' attribute}} 529b51e0315d4ffd12670441ea2284ae1188485df14Caitlin SadowskiUnlockableMu ab_var_arg_bad_5 __attribute__((acquired_before(mu_ab))); // \ 5303bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'acquired_before' attribute can only be applied in a context annotated with 'lockable' attribute}} 531b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 532b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 533b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 534b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive Lock Function (elf) 535b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 536db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 537db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_lock_function) 538db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_lock_function attribute" 539db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 540db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 541db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 542db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 543db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elf_function() __attribute__((exclusive_lock_function)); 544db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 545db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elf_function_args() __attribute__((exclusive_lock_function(mu1, mu2))); 546db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 547db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elf_testfn(int y) __attribute__((exclusive_lock_function)); 548db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 549db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elf_testfn(int y) { 550db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((exclusive_lock_function)) = y; // \ 5513bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 552db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 553db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 554db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 555db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elf_test_var __attribute__((exclusive_lock_function)); // \ 5563bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 557db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 558db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ElfFoo { 559db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 560db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((exclusive_lock_function)); // \ 5613bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 562db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((exclusive_lock_function)); 563db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 564db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 565db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((exclusive_lock_function)) ElfTestClass { // \ 5663bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 567db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 568db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 569db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elf_fun_params(int lvar __attribute__((exclusive_lock_function))); // \ 5703bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_lock_function' attribute only applies to functions and methods}} 571db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 572b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 573b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 574b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 575b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_1() __attribute__((exclusive_lock_function(muWrapper.mu))); 576b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_2() __attribute__((exclusive_lock_function(muDoubleWrapper.muWrapper->mu))); 577b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_3() __attribute__((exclusive_lock_function(muWrapper.getMu()))); 578b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_4() __attribute__((exclusive_lock_function(*muWrapper.getMuPointer()))); 579b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_5() __attribute__((exclusive_lock_function(&mu1))); 580b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_6() __attribute__((exclusive_lock_function(muRef))); 581b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_7() __attribute__((exclusive_lock_function(muDoubleWrapper.getWrapper()->getMu()))); 582b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_8() __attribute__((exclusive_lock_function(muPointer))); 583b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_9(Mu x) __attribute__((exclusive_lock_function(1))); 584b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_9(Mu x, Mu y) __attribute__((exclusive_lock_function(1,2))); 585b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 586b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 587b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 588b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_2() __attribute__((exclusive_lock_function("mu"))); // \ 5893bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute requires arguments that are class type or point to class type}} 590b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_3() __attribute__((exclusive_lock_function(muDoublePointer))); // \ 5913bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute requires arguments that are class type or point to class type}} 592b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_4() __attribute__((exclusive_lock_function(umu))); // \ 5933bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 594b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 595b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_1() __attribute__((exclusive_lock_function(1))); // \ 5963bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 597b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_5(Mu x) __attribute__((exclusive_lock_function(0))); // \ 5983bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 599b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_6(Mu x, Mu y) __attribute__((exclusive_lock_function(0))); // \ 6003bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 601b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elf_function_bad_7() __attribute__((exclusive_lock_function(0))); // \ 6023bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 603b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 604b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 605b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 606b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared Lock Function (slf) 607b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 608db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 609db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_lock_function) 610db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_lock_function attribute" 611db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 612db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 613db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 614db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 615db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slf_function() __attribute__((shared_lock_function)); 616db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 617db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slf_function_args() __attribute__((shared_lock_function(mu1, mu2))); 618db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 619db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slf_testfn(int y) __attribute__((shared_lock_function)); 620db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 621db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slf_testfn(int y) { 622db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((shared_lock_function)) = y; // \ 6233bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 624db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 625db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 626db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 627db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slf_test_var __attribute__((shared_lock_function)); // \ 6283bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 629db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 630db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slf_fun_params(int lvar __attribute__((shared_lock_function))); // \ 6313bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 632db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 633db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass SlfFoo { 634db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 635db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((shared_lock_function)); // \ 6363bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 637db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((shared_lock_function)); 638db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 639db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 640db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((shared_lock_function)) SlfTestClass { // \ 6413bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_lock_function' attribute only applies to functions and methods}} 642db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 643db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 644b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 645b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 646b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 647b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_1() __attribute__((shared_lock_function(muWrapper.mu))); 648b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_2() __attribute__((shared_lock_function(muDoubleWrapper.muWrapper->mu))); 649b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_3() __attribute__((shared_lock_function(muWrapper.getMu()))); 650b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_4() __attribute__((shared_lock_function(*muWrapper.getMuPointer()))); 651b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_5() __attribute__((shared_lock_function(&mu1))); 652b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_6() __attribute__((shared_lock_function(muRef))); 653b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_7() __attribute__((shared_lock_function(muDoubleWrapper.getWrapper()->getMu()))); 654b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_8() __attribute__((shared_lock_function(muPointer))); 655b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_9(Mu x) __attribute__((shared_lock_function(1))); 656b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_9(Mu x, Mu y) __attribute__((shared_lock_function(1,2))); 657b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 658b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 659b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 660b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_2() __attribute__((shared_lock_function("mu"))); // \ 6613bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute requires arguments that are class type or point to class type}} 662b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_3() __attribute__((shared_lock_function(muDoublePointer))); // \ 6633bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute requires arguments that are class type or point to class type}} 664b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_4() __attribute__((shared_lock_function(umu))); // \ 6653bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 666b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 667b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_1() __attribute__((shared_lock_function(1))); // \ 6683bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 669b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_5(Mu x) __attribute__((shared_lock_function(0))); // \ 6703bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 671b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_6(Mu x, Mu y) __attribute__((shared_lock_function(0))); // \ 6723bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 673b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slf_function_bad_7() __attribute__((shared_lock_function(0))); // \ 6743bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_lock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 675b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 676b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 677b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 678b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive TryLock Function (etf) 679b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 680db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 681db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_trylock_function) 682db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_trylock_function attribute" 683db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 684db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 685db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes a mandatory boolean or integer argument specifying the retval 686db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// plus an optional list of locks (vars/fields) 687db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 688db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_function() __attribute__((exclusive_trylock_function)); // \ 6892fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu // expected-error {{attribute takes at least 1 argument}} 690db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 691db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_function_args() __attribute__((exclusive_trylock_function(1, mu2))); 692db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 693db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_function_arg() __attribute__((exclusive_trylock_function(1))); 694db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 695db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint etf_testfn(int y) __attribute__((exclusive_trylock_function(1))); 696db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 697db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint etf_testfn(int y) { 698db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((exclusive_trylock_function(1))) = y; // \ 6993bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 700db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 701db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 702db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 703db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint etf_test_var __attribute__((exclusive_trylock_function(1))); // \ 7043bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 705db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 706db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass EtfFoo { 707db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 708db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((exclusive_trylock_function(1))); // \ 7093bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 710db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((exclusive_trylock_function(1))); 711db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 712db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 713db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((exclusive_trylock_function(1))) EtfTestClass { // \ 7143bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 715db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 716db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 717db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid etf_fun_params(int lvar __attribute__((exclusive_trylock_function(1)))); // \ 7183bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_trylock_function' attribute only applies to functions and methods}} 719db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 720b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 721b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 722b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 723b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_1() __attribute__((exclusive_trylock_function(1, muWrapper.mu))); 724b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_2() __attribute__((exclusive_trylock_function(1, muDoubleWrapper.muWrapper->mu))); 725b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_3() __attribute__((exclusive_trylock_function(1, muWrapper.getMu()))); 726b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_4() __attribute__((exclusive_trylock_function(1, *muWrapper.getMuPointer()))); 727b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_5() __attribute__((exclusive_trylock_function(1, &mu1))); 728b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_6() __attribute__((exclusive_trylock_function(1, muRef))); 729b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_7() __attribute__((exclusive_trylock_function(1, muDoubleWrapper.getWrapper()->getMu()))); 730b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_functetfn_8() __attribute__((exclusive_trylock_function(1, muPointer))); 731b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_9() __attribute__((exclusive_trylock_function(true))); 732b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 733b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 734b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 735b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_1() __attribute__((exclusive_trylock_function(mu1))); // \ 7363bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute first argument must be of int or bool type}} 737b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_2() __attribute__((exclusive_trylock_function("mu"))); // \ 7383bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute first argument must be of int or bool type}} 739b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_3() __attribute__((exclusive_trylock_function(muDoublePointer))); // \ 7403bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute first argument must be of int or bool type}} 741db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 742b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_4() __attribute__((exclusive_trylock_function(1, "mu"))); // \ 7433bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute requires arguments that are class type or point to class type}} 744b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_5() __attribute__((exclusive_trylock_function(1, muDoublePointer))); // \ 7453bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute requires arguments that are class type or point to class type}} 746b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint etf_function_bad_6() __attribute__((exclusive_trylock_function(1, umu))); // \ 7473bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_trylock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 748db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 749b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 750b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 751b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared TryLock Function (stf) 752b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 753db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 754db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_trylock_function) 755db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_trylock_function attribute" 756db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 757db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 758db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes a mandatory boolean or integer argument specifying the retval 759db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// plus an optional list of locks (vars/fields) 760db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 761db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_function() __attribute__((shared_trylock_function)); // \ 7623bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 763db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 764db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_function_args() __attribute__((shared_trylock_function(1, mu2))); 765db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 766db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_function_arg() __attribute__((shared_trylock_function(1))); 767db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 768db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint stf_testfn(int y) __attribute__((shared_trylock_function(1))); 769db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 770db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint stf_testfn(int y) { 771db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((shared_trylock_function(1))) = y; // \ 7723bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 773db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 774db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 775db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 776db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint stf_test_var __attribute__((shared_trylock_function(1))); // \ 7773bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 778db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 779db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid stf_fun_params(int lvar __attribute__((shared_trylock_function(1)))); // \ 7803bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 781db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 782db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 783db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass StfFoo { 784db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 785db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((shared_trylock_function(1))); // \ 7863bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 787db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((shared_trylock_function(1))); 788db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 789db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 790db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((shared_trylock_function(1))) StfTestClass { // \ 7913bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_trylock_function' attribute only applies to functions and methods}} 792db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 793db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 794b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 795b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 796b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 797b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_1() __attribute__((shared_trylock_function(1, muWrapper.mu))); 798b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_2() __attribute__((shared_trylock_function(1, muDoubleWrapper.muWrapper->mu))); 799b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_3() __attribute__((shared_trylock_function(1, muWrapper.getMu()))); 800b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_4() __attribute__((shared_trylock_function(1, *muWrapper.getMuPointer()))); 801b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_5() __attribute__((shared_trylock_function(1, &mu1))); 802b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_6() __attribute__((shared_trylock_function(1, muRef))); 803b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_7() __attribute__((shared_trylock_function(1, muDoubleWrapper.getWrapper()->getMu()))); 804b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_8() __attribute__((shared_trylock_function(1, muPointer))); 805b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_9() __attribute__((shared_trylock_function(true))); 806b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 807b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 808b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 809b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_1() __attribute__((shared_trylock_function(mu1))); // \ 8103bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute first argument must be of int or bool type}} 811b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_2() __attribute__((shared_trylock_function("mu"))); // \ 8123bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute first argument must be of int or bool type}} 813b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_3() __attribute__((shared_trylock_function(muDoublePointer))); // \ 8143bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute first argument must be of int or bool type}} 815db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 816b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_4() __attribute__((shared_trylock_function(1, "mu"))); // \ 8173bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute requires arguments that are class type or point to class type}} 818b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_5() __attribute__((shared_trylock_function(1, muDoublePointer))); // \ 8193bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute requires arguments that are class type or point to class type}} 820b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint stf_function_bad_6() __attribute__((shared_trylock_function(1, umu))); // \ 8213bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_trylock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 822b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 823b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 824b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 825b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Unlock Function (uf) 826b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 827db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 828db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(unlock_function) 829db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support unlock_function attribute" 830db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 831db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 832db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes zero or more arguments, all locks (vars/fields) 833db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 834db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid uf_function() __attribute__((unlock_function)); 835db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 836db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid uf_function_args() __attribute__((unlock_function(mu1, mu2))); 837db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 838db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint uf_testfn(int y) __attribute__((unlock_function)); 839db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 840db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint uf_testfn(int y) { 841db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((unlock_function)) = y; // \ 8423bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'unlock_function' attribute only applies to functions and methods}} 843db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 844db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 845db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 846db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint uf_test_var __attribute__((unlock_function)); // \ 8473bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'unlock_function' attribute only applies to functions and methods}} 848db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 849db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass UfFoo { 850db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 851db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((unlock_function)); // \ 8523bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'unlock_function' attribute only applies to functions and methods}} 853db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((unlock_function)); 854db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 855db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 856db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((no_thread_safety_analysis)) UfTestClass { // \ 8573bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'no_thread_safety_analysis' attribute only applies to functions and methods}} 858db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 859db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 860db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid uf_fun_params(int lvar __attribute__((unlock_function))); // \ 8613bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'unlock_function' attribute only applies to functions and methods}} 862db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 863b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 864b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 865b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 866b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_1() __attribute__((unlock_function(muWrapper.mu))); 867b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_2() __attribute__((unlock_function(muDoubleWrapper.muWrapper->mu))); 868b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_3() __attribute__((unlock_function(muWrapper.getMu()))); 869b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_4() __attribute__((unlock_function(*muWrapper.getMuPointer()))); 870b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_5() __attribute__((unlock_function(&mu1))); 871b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_6() __attribute__((unlock_function(muRef))); 872b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_7() __attribute__((unlock_function(muDoubleWrapper.getWrapper()->getMu()))); 873b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_8() __attribute__((unlock_function(muPointer))); 874b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_9(Mu x) __attribute__((unlock_function(1))); 875b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_9(Mu x, Mu y) __attribute__((unlock_function(1,2))); 876b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 877b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 878b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 879b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_2() __attribute__((unlock_function("mu"))); // \ 8803bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute requires arguments that are class type or point to class type}} 881b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_3() __attribute__((unlock_function(muDoublePointer))); // \ 8823bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute requires arguments that are class type or point to class type}} 883b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_4() __attribute__((unlock_function(umu))); // \ 8843bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute requires arguments whose type is annotated with 'lockable' attribute}} 885b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 886b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_1() __attribute__((unlock_function(1))); // \ 8873bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 888b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_5(Mu x) __attribute__((unlock_function(0))); // \ 8893bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: can only be 1, since there is one parameter}} 890b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_6(Mu x, Mu y) __attribute__((unlock_function(0))); // \ 8913bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: must be between 1 and 2}} 892b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint uf_function_bad_7() __attribute__((unlock_function(0))); // \ 8933bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'unlock_function' attribute parameter 1 is out of bounds: no parameters to index into}} 894b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 895b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 896b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 897b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Lock Returned (lr) 898b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 899db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 900db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(lock_returned) 901db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support lock_returned attribute" 902db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 903db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 904db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// Takes exactly one argument, a var/field 905db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 906db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_function() __attribute__((lock_returned)); // \ 9073bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 908db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 909db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_function_arg() __attribute__((lock_returned(mu1))); 910db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 911db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_function_args() __attribute__((lock_returned(mu1, mu2))); // \ 9123bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes one argument}} 913db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 914db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint lr_testfn(int y) __attribute__((lock_returned(mu1))); 915db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 916db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint lr_testfn(int y) { 917db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((lock_returned(mu1))) = y; // \ 9183bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 919db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 920db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 921db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 922db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint lr_test_var __attribute__((lock_returned(mu1))); // \ 9233bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 924db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 925db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid lr_fun_params(int lvar __attribute__((lock_returned(mu1)))); // \ 9263bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 927db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 928db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass LrFoo { 929db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 930db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((lock_returned(mu1))); // \ 9313bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 932db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((lock_returned(mu1))); 933db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 934db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 935db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((lock_returned(mu1))) LrTestClass { // \ 9363bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'lock_returned' attribute only applies to functions and methods}} 937db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 938db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 939b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 940b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 941b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 942b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_1() __attribute__((lock_returned(muWrapper.mu))); 943b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_2() __attribute__((lock_returned(muDoubleWrapper.muWrapper->mu))); 944b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_3() __attribute__((lock_returned(muWrapper.getMu()))); 945b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_4() __attribute__((lock_returned(*muWrapper.getMuPointer()))); 946b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_5() __attribute__((lock_returned(&mu1))); 947b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_6() __attribute__((lock_returned(muRef))); 948b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_7() __attribute__((lock_returned(muDoubleWrapper.getWrapper()->getMu()))); 949b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_8() __attribute__((lock_returned(muPointer))); 950b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 951b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 952b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 953b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_bad_1() __attribute__((lock_returned(1))); // \ 9543bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'lock_returned' attribute requires arguments that are class type or point to class type}} 955b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_bad_2() __attribute__((lock_returned("mu"))); // \ 9563bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'lock_returned' attribute requires arguments that are class type or point to class type}} 957b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_bad_3() __attribute__((lock_returned(muDoublePointer))); // \ 9583bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'lock_returned' attribute requires arguments that are class type or point to class type}} 959b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint lr_function_bad_4() __attribute__((lock_returned(umu))); // \ 9603bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'lock_returned' attribute requires arguments whose type is annotated with 'lockable' attribute}} 961b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 962b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 963b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 964b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 965b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Locks Excluded (le) 966b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 967db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 968db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(locks_excluded) 969db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support locks_excluded attribute" 970db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 971db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 972db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 973db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 974db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_function() __attribute__((locks_excluded)); // \ 9753bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 976db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 977db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_function_arg() __attribute__((locks_excluded(mu1))); 978db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 979db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_function_args() __attribute__((locks_excluded(mu1, mu2))); 980db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 981db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint le_testfn(int y) __attribute__((locks_excluded(mu1))); 982db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 983db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint le_testfn(int y) { 984db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((locks_excluded(mu1))) = y; // \ 9853bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 986db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 987db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 988db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 989db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint le_test_var __attribute__((locks_excluded(mu1))); // \ 9903bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 991db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 992db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid le_fun_params(int lvar __attribute__((locks_excluded(mu1)))); // \ 9933bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 994db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 995db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass LeFoo { 996db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 997db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((locks_excluded(mu1))); // \ 9983bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 999db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((locks_excluded(mu1))); 1000db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1001db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1002db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((locks_excluded(mu1))) LeTestClass { // \ 10033bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'locks_excluded' attribute only applies to functions and methods}} 1004db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1005db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1006b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1007b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1008b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 1009b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_1() __attribute__((locks_excluded(muWrapper.mu))); 1010b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_2() __attribute__((locks_excluded(muDoubleWrapper.muWrapper->mu))); 1011b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_3() __attribute__((locks_excluded(muWrapper.getMu()))); 1012b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_4() __attribute__((locks_excluded(*muWrapper.getMuPointer()))); 1013b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_5() __attribute__((locks_excluded(&mu1))); 1014b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_6() __attribute__((locks_excluded(muRef))); 1015b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_7() __attribute__((locks_excluded(muDoubleWrapper.getWrapper()->getMu()))); 1016b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_8() __attribute__((locks_excluded(muPointer))); 1017db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1018b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1019b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 1020b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_bad_1() __attribute__((locks_excluded(1))); // \ 10213bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'locks_excluded' attribute requires arguments that are class type or point to class type}} 1022b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_bad_2() __attribute__((locks_excluded("mu"))); // \ 10233bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'locks_excluded' attribute requires arguments that are class type or point to class type}} 1024b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_bad_3() __attribute__((locks_excluded(muDoublePointer))); // \ 10253bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'locks_excluded' attribute requires arguments that are class type or point to class type}} 1026b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint le_function_bad_4() __attribute__((locks_excluded(umu))); // \ 10273bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'locks_excluded' attribute requires arguments whose type is annotated with 'lockable' attribute}} 1028b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1029b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1030b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1031b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1032b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Exclusive Locks Required (elr) 1033b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1034db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1035db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(exclusive_locks_required) 1036db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support exclusive_locks_required attribute" 1037db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 1038db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1039db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 1040db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1041db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_function() __attribute__((exclusive_locks_required)); // \ 10423bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 1043db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1044db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_function_arg() __attribute__((exclusive_locks_required(mu1))); 1045db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1046db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_function_args() __attribute__((exclusive_locks_required(mu1, mu2))); 1047db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1048db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elr_testfn(int y) __attribute__((exclusive_locks_required(mu1))); 1049db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1050db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elr_testfn(int y) { 1051db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((exclusive_locks_required(mu1))) = y; // \ 10523bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1053db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 1054db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1055db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1056db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint elr_test_var __attribute__((exclusive_locks_required(mu1))); // \ 10573bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1058db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1059db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid elr_fun_params(int lvar __attribute__((exclusive_locks_required(mu1)))); // \ 10603bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1061db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1062db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass ElrFoo { 1063db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 1064db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((exclusive_locks_required(mu1))); // \ 10653bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1066db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((exclusive_locks_required(mu1))); 1067db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1068db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1069db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((exclusive_locks_required(mu1))) ElrTestClass { // \ 10703bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'exclusive_locks_required' attribute only applies to functions and methods}} 1071db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1072db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1073b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1074b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1075b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 1076b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_1() __attribute__((exclusive_locks_required(muWrapper.mu))); 1077b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_2() __attribute__((exclusive_locks_required(muDoubleWrapper.muWrapper->mu))); 1078b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_3() __attribute__((exclusive_locks_required(muWrapper.getMu()))); 1079b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_4() __attribute__((exclusive_locks_required(*muWrapper.getMuPointer()))); 1080b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_5() __attribute__((exclusive_locks_required(&mu1))); 1081b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_6() __attribute__((exclusive_locks_required(muRef))); 1082b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_7() __attribute__((exclusive_locks_required(muDoubleWrapper.getWrapper()->getMu()))); 1083b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_8() __attribute__((exclusive_locks_required(muPointer))); 1084b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1085b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1086b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 1087b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_bad_1() __attribute__((exclusive_locks_required(1))); // \ 10883bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_locks_required' attribute requires arguments that are class type or point to class type}} 1089b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_bad_2() __attribute__((exclusive_locks_required("mu"))); // \ 10903bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_locks_required' attribute requires arguments that are class type or point to class type}} 1091b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_bad_3() __attribute__((exclusive_locks_required(muDoublePointer))); // \ 10923bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_locks_required' attribute requires arguments that are class type or point to class type}} 1093b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint elr_function_bad_4() __attribute__((exclusive_locks_required(umu))); // \ 10943bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'exclusive_locks_required' attribute requires arguments whose type is annotated with 'lockable' attribute}} 1095b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1096b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1097b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1098b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1099b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1100b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Shared Locks Required (slr) 1101b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski//-----------------------------------------// 1102db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1103db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#if !__has_attribute(shared_locks_required) 1104db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#error "Should support shared_locks_required attribute" 1105db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski#endif 1106db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1107db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski// takes one or more arguments, all locks (vars/fields) 1108db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1109db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_function() __attribute__((shared_locks_required)); // \ 11103bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{attribute takes at least 1 argument}} 1111db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1112db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_function_arg() __attribute__((shared_locks_required(mu1))); 1113db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1114db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_function_args() __attribute__((shared_locks_required(mu1, mu2))); 1115db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1116db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slr_testfn(int y) __attribute__((shared_locks_required(mu1))); 1117db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1118db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slr_testfn(int y) { 1119db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int x __attribute__((shared_locks_required(mu1))) = y; // \ 11203bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1121db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski return x; 1122db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1123db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1124db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiint slr_test_var __attribute__((shared_locks_required(mu1))); // \ 11253bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1126db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1127db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskivoid slr_fun_params(int lvar __attribute__((shared_locks_required(mu1)))); // \ 11283bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1129db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1130db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass SlrFoo { 1131db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski private: 1132db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski int test_field __attribute__((shared_locks_required(mu1))); // \ 11333bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1134db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski void test_method() __attribute__((shared_locks_required(mu1))); 1135db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1136db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski 1137db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowskiclass __attribute__((shared_locks_required(mu1))) SlrTestClass { // \ 11383bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-warning {{'shared_locks_required' attribute only applies to functions and methods}} 1139db33e14661c7a118a2d9a777ae69c0ecaa036e1eCaitlin Sadowski}; 1140b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1141b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// Check argument parsing. 1142b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1143b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// legal attribute arguments 1144b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_1() __attribute__((shared_locks_required(muWrapper.mu))); 1145b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_2() __attribute__((shared_locks_required(muDoubleWrapper.muWrapper->mu))); 1146b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_3() __attribute__((shared_locks_required(muWrapper.getMu()))); 1147b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_4() __attribute__((shared_locks_required(*muWrapper.getMuPointer()))); 1148b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_5() __attribute__((shared_locks_required(&mu1))); 1149b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_6() __attribute__((shared_locks_required(muRef))); 1150b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_7() __attribute__((shared_locks_required(muDoubleWrapper.getWrapper()->getMu()))); 1151b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_8() __attribute__((shared_locks_required(muPointer))); 1152b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1153b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1154b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski// illegal attribute arguments 1155b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_bad_1() __attribute__((shared_locks_required(1))); // \ 11563bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_locks_required' attribute requires arguments that are class type or point to class type}} 1157b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_bad_2() __attribute__((shared_locks_required("mu"))); // \ 11583bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_locks_required' attribute requires arguments that are class type or point to class type}} 1159b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_bad_3() __attribute__((shared_locks_required(muDoublePointer))); // \ 11603bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_locks_required' attribute requires arguments that are class type or point to class type}} 1161b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowskiint slr_function_bad_4() __attribute__((shared_locks_required(umu))); // \ 11623bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{'shared_locks_required' attribute requires arguments whose type is annotated with 'lockable' attribute}} 1163b51e0315d4ffd12670441ea2284ae1188485df14Caitlin Sadowski 1164b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1165b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//-----------------------------------------// 1166b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Regression tests for unusual cases. 1167b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//-----------------------------------------// 1168b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1169b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiint trivially_false_edges(bool b) { 1170b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // Create NULL (never taken) edges in CFG 1171b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski if (false) return 1; 1172b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski else return 2; 1173b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1174b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1175b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Possible Clang bug -- method pointer in template parameter 1176b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass UnFoo { 1177b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskipublic: 1178b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void foo(); 1179b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1180b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1181b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskitemplate<void (UnFoo::*methptr)()> 1182b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass MCaller { 1183b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskipublic: 1184b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski static void call_method_ptr(UnFoo *f) { 1185b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // FIXME: Possible Clang bug: 1186b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // getCalleeDecl() returns NULL in the following case: 1187b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski (f->*methptr)(); 1188b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1189b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1190b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1191b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskivoid call_method_ptr_inst(UnFoo* f) { 1192b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski MCaller<&UnFoo::foo>::call_method_ptr(f); 1193b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1194b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1195b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiint temp; 1196b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskivoid empty_back_edge() { 1197b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // Create a back edge to a block with with no statements 1198b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski for (;;) { 1199b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ++temp; 1200b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski if (temp > 10) break; 1201b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1202b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski} 1203b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1204b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskistruct Foomger { 1205b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void operator++(); 1206b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1207b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1208b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskistruct Foomgoper { 1209b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski Foomger f; 1210b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1211b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski bool done(); 1212b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void invalid_back_edge() { 1213b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski do { 1214b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // FIXME: Possible Clang bug: 1215b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski // The first statement in this basic block has no source location 1216b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ++f; 1217b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } while (!done()); 1218b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 1219b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 1220b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1221b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 1222ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski//----------------------------------------------------- 1223ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski// Parsing of member variables and function parameters 1224ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski//------------------------------------------------------ 1225ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1226ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin SadowskiMu gmu; 1227ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1228ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskiclass StaticMu { 1229ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski static Mu statmu; 1230ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski}; 1231ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1232ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskiclass FooLate { 1233ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowskipublic: 1234ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo1() __attribute__((exclusive_locks_required(gmu))) { } 1235ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo2() __attribute__((exclusive_locks_required(mu))) { } 1236ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo3(Mu *m) __attribute__((exclusive_locks_required(m))) { } 1237ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo3(FooLate *f) __attribute__((exclusive_locks_required(f->mu))) { } 1238ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo4(FooLate *f) __attribute__((exclusive_locks_required(f->mu))); 1239ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1240ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski static void foo5() __attribute__((exclusive_locks_required(mu))); // \ 12413bb435809c84153bb41a631030b92039598a330cCaitlin Sadowski // expected-error {{invalid use of member 'mu' in static member function}} 1242ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1243ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski template <class T> 1244ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo6() __attribute__((exclusive_locks_required(T::statmu))) { } 1245ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1246ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski template <class T> 1247ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski void foo7(T* f) __attribute__((exclusive_locks_required(f->mu))) { } 1248ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1249ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski int a __attribute__((guarded_by(gmu))); 1250ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski int b __attribute__((guarded_by(mu))); 1251ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski int c __attribute__((guarded_by(this->mu))); 1252ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 1253ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski Mu mu; 1254ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski}; 1255ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3Caitlin Sadowski 12564805f158203017bdf575003235473284134c1071DeLesley Hutchins//------------------------- 12574805f158203017bdf575003235473284134c1071DeLesley Hutchins// Empty argument lists 12584805f158203017bdf575003235473284134c1071DeLesley Hutchins//------------------------- 12594805f158203017bdf575003235473284134c1071DeLesley Hutchins 12604805f158203017bdf575003235473284134c1071DeLesley Hutchinsclass __attribute__((lockable)) EmptyArgListsTest { 12614805f158203017bdf575003235473284134c1071DeLesley Hutchins void lock() __attribute__((exclusive_lock_function())) { } 12624805f158203017bdf575003235473284134c1071DeLesley Hutchins void unlock() __attribute__((unlock_function())) { } 12634805f158203017bdf575003235473284134c1071DeLesley Hutchins}; 12644805f158203017bdf575003235473284134c1071DeLesley Hutchins 1265