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