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