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