blob: a38d005db5d334ad59ad202acac2e5e83119901f [file] [log] [blame]
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +00001// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety %s
2
3
4//-----------------------------------------//
5// Helper fields
6//-----------------------------------------//
7
8
9class __attribute__((lockable)) Mutex {
10 public:
11 void Lock() __attribute__((exclusive_lock_function));
12 void ReaderLock() __attribute__((shared_lock_function));
13 void Unlock() __attribute__((unlock_function));
14 bool TryLock() __attribute__((exclusive_trylock_function(true)));
15 bool ReaderTryLock() __attribute__((shared_trylock_function(true)));
16 void LockWhen(const int &cond) __attribute__((exclusive_lock_function));
17};
18
19
20Mutex sls_mu;
21
22Mutex sls_mu2 __attribute__((acquired_after(sls_mu)));
23int sls_guard_var __attribute__((guarded_var)) = 0;
24int sls_guardby_var __attribute__((guarded_by(sls_mu))) = 0;
25
26bool getBool();
27
28class MutexWrapper {
29public:
30 Mutex mu;
31 // int x __attribute__((guarded_by(mu))); // FIXME: scoping error
32};
33
34MutexWrapper sls_mw;
35
36void sls_fun_0() {
37 sls_mw.mu.Lock();
38 // sls_mw.x = 5; // FIXME: turn mu into sls_mw.mu
39 sls_mw.mu.Unlock();
40}
41
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +000042void sls_fun_2() {
43 sls_mu.Lock();
44 int x = sls_guard_var;
45 sls_mu.Unlock();
46}
47
48void sls_fun_3() {
49 sls_mu.Lock();
50 sls_guard_var = 2;
51 sls_mu.Unlock();
52}
53
54void sls_fun_4() {
55 sls_mu2.Lock();
56 sls_guard_var = 2;
57 sls_mu2.Unlock();
58}
59
60void sls_fun_5() {
61 sls_mu.Lock();
62 int x = sls_guardby_var;
63 sls_mu.Unlock();
64}
65
66void sls_fun_6() {
67 sls_mu.Lock();
68 sls_guardby_var = 2;
69 sls_mu.Unlock();
70}
71
72void sls_fun_7() {
73 sls_mu.Lock();
74 sls_mu2.Lock();
75 sls_mu2.Unlock();
76 sls_mu.Unlock();
77}
78
79void sls_fun_8() {
80 sls_mu.Lock();
81 if (getBool())
82 sls_mu.Unlock();
83 else
84 sls_mu.Unlock();
85}
86
87void sls_fun_9() {
88 if (getBool())
89 sls_mu.Lock();
90 else
91 sls_mu.Lock();
92 sls_mu.Unlock();
93}
94
95void sls_fun_good_6() {
96 if (getBool()) {
97 sls_mu.Lock();
98 } else {
99 if (getBool()) {
100 getBool(); // EMPTY
101 } else {
102 getBool(); // EMPTY
103 }
104 sls_mu.Lock();
105 }
106 sls_mu.Unlock();
107}
108
109void sls_fun_good_7() {
110 sls_mu.Lock();
111 while (getBool()) {
112 sls_mu.Unlock();
113 if (getBool()) {
114 if (getBool()) {
115 sls_mu.Lock();
116 continue;
117 }
118 }
119 sls_mu.Lock();
120 }
121 sls_mu.Unlock();
122}
123
124void sls_fun_bad_1() {
125 sls_mu.Unlock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000126 // expected-warning{{unlocking 'sls_mu' that was not acquired}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000127}
128
129void sls_fun_bad_2() {
130 sls_mu.Lock();
131 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000132 // expected-warning{{locking 'sls_mu' that is already acquired}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000133 sls_mu.Unlock();
134}
135
136void sls_fun_bad_3() {
137 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000138 // expected-warning{{lock 'sls_mu' is not released at the end of function 'sls_fun_bad_3'}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000139}
140
141void sls_fun_bad_4() {
142 if (getBool())
143 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000144 // expected-warning{{lock 'sls_mu' is not released at the end of its scope}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000145 else
146 sls_mu2.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000147 // expected-warning{{lock 'sls_mu2' is not released at the end of its scope}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000148}
149
150void sls_fun_bad_5() {
151 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000152 // expected-warning{{lock 'sls_mu' is not released at the end of its scope}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000153 if (getBool())
154 sls_mu.Unlock();
155}
156
157void sls_fun_bad_6() {
158 if (getBool()) {
159 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000160 // expected-warning{{lock 'sls_mu' is not released at the end of its scope}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000161 } else {
162 if (getBool()) {
163 getBool(); // EMPTY
164 } else {
165 getBool(); // EMPTY
166 }
167 }
168 sls_mu.Unlock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000169 // expected-warning{{unlocking 'sls_mu' that was not acquired}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000170}
171
172void sls_fun_bad_7() {
173 sls_mu.Lock();
174 while (getBool()) { // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000175 // expected-warning{{expecting lock 'sls_mu' to be held at start of each loop}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000176 sls_mu.Unlock();
177 if (getBool()) {
178 if (getBool()) {
179 continue;
180 }
181 }
182 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000183 // expected-warning{{lock 'sls_mu' is not released at the end of its scope}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000184 }
185 sls_mu.Unlock();
186}
187
188void sls_fun_bad_8() {
189 sls_mu.Lock();
190 do {
191 sls_mu.Unlock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000192 // expected-warning{{expecting lock 'sls_mu' to be held at start of each loop}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000193 } while (getBool());
194}
195
196void sls_fun_bad_9() {
197 do {
198 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000199 // expected-warning{{lock 'sls_mu' is not released at the end of its scope}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000200 } while (getBool());
201 sls_mu.Unlock();
202}
203
204void sls_fun_bad_10() {
205 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000206 // expected-warning{{lock 'sls_mu' is not released at the end of function 'sls_fun_bad_10'}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000207 while(getBool()) { // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000208 // expected-warning{{expecting lock 'sls_mu' to be held at start of each loop}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000209 sls_mu.Unlock();
210 }
211}
212
213void sls_fun_bad_11() {
214 while (getBool()) {
215 sls_mu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000216 // expected-warning{{lock 'sls_mu' is not released at the end of its scope}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000217 }
218 sls_mu.Unlock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000219 // expected-warning{{unlocking 'sls_mu' that was not acquired}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000220}
221
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000222//-----------------------------------------//
223// Handling lock expressions in attribute args
224// -------------------------------------------//
225
226Mutex aa_mu;
227
228class GlobalLocker {
229public:
230 void globalLock() __attribute__((exclusive_lock_function(aa_mu)));
231 void globalUnlock() __attribute__((unlock_function(aa_mu)));
232};
233
234GlobalLocker glock;
235
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000236void aa_fun_1() {
237 glock.globalLock();
238 glock.globalUnlock();
239}
240
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000241void aa_fun_bad_1() {
242 glock.globalUnlock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000243 // expected-warning{{unlocking 'aa_mu' that was not acquired}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000244}
245
246void aa_fun_bad_2() {
247 glock.globalLock();
248 glock.globalLock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000249 // expected-warning{{locking 'aa_mu' that is already acquired}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000250 glock.globalUnlock();
251}
252
253void aa_fun_bad_3() {
254 glock.globalLock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000255 // expected-warning{{lock 'aa_mu' is not released at the end of function 'aa_fun_bad_3'}}
Caitlin Sadowski3ac1fbc2011-08-23 18:46:34 +0000256}
Caitlin Sadowskib4d0a962011-08-29 17:12:27 +0000257
Caitlin Sadowskib4d0a962011-08-29 17:12:27 +0000258//--------------------------------------------------//
259// Regression tests for unusual method names
260//--------------------------------------------------//
261
262Mutex wmu;
263
264// Test diagnostics for other method names.
265class WeirdMethods {
266 WeirdMethods() {
267 wmu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000268 // expected-warning {{lock 'wmu' is not released at the end of function 'WeirdMethods'}}
Caitlin Sadowskib4d0a962011-08-29 17:12:27 +0000269 }
270 ~WeirdMethods() {
271 wmu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000272 // expected-warning {{lock 'wmu' is not released at the end of function '~WeirdMethods'}}
Caitlin Sadowskib4d0a962011-08-29 17:12:27 +0000273 }
274 void operator++() {
275 wmu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000276 // expected-warning {{lock 'wmu' is not released at the end of function 'operator++'}}
Caitlin Sadowskib4d0a962011-08-29 17:12:27 +0000277 }
278 operator int*() {
279 wmu.Lock(); // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000280 // expected-warning {{lock 'wmu' is not released at the end of function 'operator int *'}}
Caitlin Sadowskib4d0a962011-08-29 17:12:27 +0000281 return 0;
282 }
283};
284
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000285//-----------------------------------------------//
286// Errors for guarded by or guarded var variables
287// ----------------------------------------------//
288
289int *pgb_gvar __attribute__((pt_guarded_var));
290int *pgb_var __attribute__((pt_guarded_by(sls_mu)));
291
292class PGBFoo {
293 public:
294 int x;
295 int *pgb_field __attribute__((guarded_by(sls_mu2)))
296 __attribute__((pt_guarded_by(sls_mu)));
297 void testFoo() {
298 pgb_field = &x; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000299 // expected-warning {{writing variable 'pgb_field' requires lock 'sls_mu2' to be held exclusively}}
300 *pgb_field = x; // expected-warning {{reading variable 'pgb_field' requires lock 'sls_mu2' to be held}} \
301 // expected-warning {{writing the value pointed to by 'pgb_field' requires lock 'sls_mu' to be held exclusively}}
302 x = *pgb_field; // expected-warning {{reading variable 'pgb_field' requires lock 'sls_mu2' to be held}} \
303 // expected-warning {{reading the value pointed to by 'pgb_field' requires lock 'sls_mu' to be held}}
304 (*pgb_field)++; // expected-warning {{reading variable 'pgb_field' requires lock 'sls_mu2' to be held}} \
305 // expected-warning {{writing the value pointed to by 'pgb_field' requires lock 'sls_mu' to be held exclusively}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000306 }
307};
308
309class GBFoo {
310 public:
311 int gb_field __attribute__((guarded_by(sls_mu)));
312
313 void testFoo() {
314 gb_field = 0; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000315 // expected-warning {{writing variable 'gb_field' requires lock 'sls_mu' to be held exclusively}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000316 }
317};
318
319GBFoo GlobalGBFoo __attribute__((guarded_by(sls_mu)));
320
321void gb_fun_0() {
322 sls_mu.Lock();
323 int x = *pgb_var;
324 sls_mu.Unlock();
325}
326
327void gb_fun_1() {
328 sls_mu.Lock();
329 *pgb_var = 2;
330 sls_mu.Unlock();
331}
332
333void gb_fun_2() {
334 int x;
335 pgb_var = &x;
336}
337
338void gb_fun_3() {
339 int *x = pgb_var;
340}
341
342void gb_bad_0() {
343 sls_guard_var = 1; // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000344 // expected-warning{{accessing variable 'sls_guard_var' requires some lock}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000345}
346
347void gb_bad_1() {
348 int x = sls_guard_var; // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000349 // expected-warning{{accessing variable 'sls_guard_var' requires some lock}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000350}
351
352void gb_bad_2() {
353 sls_guardby_var = 1; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000354 // expected-warning {{writing variable 'sls_guardby_var' requires lock 'sls_mu' to be held exclusively}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000355}
356
357void gb_bad_3() {
358 int x = sls_guardby_var; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000359 // expected-warning {{reading variable 'sls_guardby_var' requires lock 'sls_mu' to be held}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000360}
361
362void gb_bad_4() {
363 *pgb_gvar = 1; // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000364 // expected-warning {{accessing the value pointed to by 'pgb_gvar' requires some lock}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000365}
366
367void gb_bad_5() {
368 int x = *pgb_gvar; // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000369 // expected-warning {{accessing the value pointed to by 'pgb_gvar' requires some lock}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000370}
371
372void gb_bad_6() {
373 *pgb_var = 1; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000374 // expected-warning {{writing the value pointed to by 'pgb_var' requires lock 'sls_mu' to be held exclusively}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000375}
376
377void gb_bad_7() {
378 int x = *pgb_var; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000379 // expected-warning {{reading the value pointed to by 'pgb_var' requires lock 'sls_mu' to be held}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000380}
381
382void gb_bad_8() {
383 GBFoo G;
384 G.gb_field = 0; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000385 // expected-warning {{writing variable 'gb_field' requires lock 'sls_mu'}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000386}
387
388void gb_bad_9() {
389 sls_guard_var++; // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000390 // expected-warning{{accessing variable 'sls_guard_var' requires some lock}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000391 sls_guard_var--; // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000392 // expected-warning{{accessing variable 'sls_guard_var' requires some lock}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000393 ++sls_guard_var; // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000394 // expected-warning{{accessing variable 'sls_guard_var' requires some lock}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000395 --sls_guard_var; // \
Caitlin Sadowski3bb43582011-09-08 18:07:26 +0000396 // expected-warning{{accessing variable 'sls_guard_var' requires some lock}}
Caitlin Sadowski05b436e2011-08-29 22:27:51 +0000397}
Caitlin Sadowskib4d0a962011-08-29 17:12:27 +0000398
Caitlin Sadowskieff98fc2011-09-08 17:42:22 +0000399//-----------------------------------------------//
400// Warnings on variables with late parsed attributes
401// ----------------------------------------------//
402
403class LateFoo {
404public:
405 int a __attribute__((guarded_by(mu)));
406 int b;
407
408 void foo() __attribute__((exclusive_locks_required(mu))) { }
409
410 void test() {
411 a = 0; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000412 // expected-warning{{writing variable 'a' requires lock 'mu' to be held exclusively}}
Caitlin Sadowskieff98fc2011-09-08 17:42:22 +0000413 b = a; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000414 // expected-warning {{reading variable 'a' requires lock 'mu' to be held}}
Caitlin Sadowskieff98fc2011-09-08 17:42:22 +0000415 c = 0; // \
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000416 // expected-warning {{writing variable 'c' requires lock 'mu' to be held exclusively}}
Caitlin Sadowskieff98fc2011-09-08 17:42:22 +0000417 }
418
419 int c __attribute__((guarded_by(mu)));
420
421 Mutex mu;
422};
423
Caitlin Sadowskia53257c2011-09-08 18:19:38 +0000424//-----------------------------------------------//
425// Extra warnings for shared vs. exclusive locks
426// ----------------------------------------------//
427
428void shared_fun_0() {
429 sls_mu.Lock();
430 do {
431 sls_mu.Unlock();
432 sls_mu.Lock();
433 } while (getBool());
434 sls_mu.Unlock();
435}
436
437void shared_fun_1() {
438 sls_mu.ReaderLock();
439 do {
440 sls_mu.Unlock();
441 sls_mu.Lock(); // \
442 // expected-warning {{lock 'sls_mu' is held exclusively and shared in the same scope}}
443 } while (getBool());
444 sls_mu.Unlock();
445}
446
447void shared_fun_3() {
448 if (getBool())
449 sls_mu.Lock();
450 else
451 sls_mu.Lock();
452 *pgb_var = 1;
453 sls_mu.Unlock();
454}
455
456void shared_fun_4() {
457 if (getBool())
458 sls_mu.ReaderLock();
459 else
460 sls_mu.ReaderLock();
461 int x = sls_guardby_var;
462 sls_mu.Unlock();
463}
464
465void shared_fun_8() {
466 if (getBool())
467 sls_mu.Lock(); // \
468 // expected-warning {{lock 'sls_mu' is held exclusively and shared in the same scope}}
469 else
470 sls_mu.ReaderLock(); // \
471 // expected-note {{the other acquire of lock 'sls_mu' is here}}
472 sls_mu.Unlock();
473}
474
475void shared_bad_0() {
476 sls_mu.Lock();
477 do {
478 sls_mu.Unlock();
479 sls_mu.ReaderLock(); // \
480 // expected-warning {{lock 'sls_mu' is held exclusively and shared in the same scope}}
481 } while (getBool());
482 sls_mu.Unlock();
483}
484
485void shared_bad_1() {
486 if (getBool())
487 sls_mu.Lock(); // \
488 // expected-warning {{lock 'sls_mu' is held exclusively and shared in the same scope}}
489 else
490 sls_mu.ReaderLock(); // \
491 // expected-note {{the other acquire of lock 'sls_mu' is here}}
492 *pgb_var = 1;
493 sls_mu.Unlock();
494}
495
496void shared_bad_2() {
497 if (getBool())
498 sls_mu.ReaderLock(); // \
499 // expected-warning {{lock 'sls_mu' is held exclusively and shared in the same scope}}
500 else
501 sls_mu.Lock(); // \
502 // expected-note {{the other acquire of lock 'sls_mu' is here}}
503 *pgb_var = 1;
504 sls_mu.Unlock();
505}
Caitlin Sadowski978191e2011-09-08 18:27:31 +0000506
507// FIXME: Add support for functions (not only methods)
508class LRBar {
509 public:
510 void aa_elr_fun() __attribute__((exclusive_locks_required(aa_mu)));
511 void aa_elr_fun_s() __attribute__((shared_locks_required(aa_mu)));
512 void le_fun() __attribute__((locks_excluded(sls_mu)));
513};
514
515class LRFoo {
516 public:
517 void test() __attribute__((exclusive_locks_required(sls_mu)));
518 void testShared() __attribute__((shared_locks_required(sls_mu2)));
519};
520
521void elr_fun() __attribute__((exclusive_locks_required(sls_mu)));
522void elr_fun() {}
523
524LRFoo MyLRFoo;
525LRBar Bar;
526
527void es_fun_0() {
528 aa_mu.Lock();
529 Bar.aa_elr_fun();
530 aa_mu.Unlock();
531}
532
533void es_fun_1() {
534 aa_mu.Lock();
535 Bar.aa_elr_fun_s();
536 aa_mu.Unlock();
537}
538
539void es_fun_2() {
540 aa_mu.ReaderLock();
541 Bar.aa_elr_fun_s();
542 aa_mu.Unlock();
543}
544
545void es_fun_3() {
546 sls_mu.Lock();
547 MyLRFoo.test();
548 sls_mu.Unlock();
549}
550
551void es_fun_4() {
552 sls_mu2.Lock();
553 MyLRFoo.testShared();
554 sls_mu2.Unlock();
555}
556
557void es_fun_5() {
558 sls_mu2.ReaderLock();
559 MyLRFoo.testShared();
560 sls_mu2.Unlock();
561}
562
563void es_fun_6() {
564 Bar.le_fun();
565}
566
567void es_fun_7() {
568 sls_mu.Lock();
569 elr_fun();
570 sls_mu.Unlock();
571}
572
573void es_bad_0() {
574 Bar.aa_elr_fun(); // \
575 // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock 'aa_mu'}}
576}
577
578void es_bad_1() {
579 aa_mu.ReaderLock();
580 Bar.aa_elr_fun(); // \
581 // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock 'aa_mu'}}
582 aa_mu.Unlock();
583}
584
585void es_bad_2() {
586 Bar.aa_elr_fun_s(); // \
587 // expected-warning {{calling function 'aa_elr_fun_s' requires shared lock 'aa_mu'}}
588}
589
590void es_bad_3() {
591 MyLRFoo.test(); // \
592 // expected-warning {{calling function 'test' requires exclusive lock 'sls_mu'}}
593}
594
595void es_bad_4() {
596 MyLRFoo.testShared(); // \
597 // expected-warning {{calling function 'testShared' requires shared lock 'sls_mu2'}}
598}
599
600void es_bad_5() {
601 sls_mu.ReaderLock();
602 MyLRFoo.test(); // \
603 // expected-warning {{calling function 'test' requires exclusive lock 'sls_mu'}}
604 sls_mu.Unlock();
605}
606
607void es_bad_6() {
608 sls_mu.Lock();
609 Bar.le_fun(); // \
610 // expected-warning {{cannot call function 'le_fun' while holding lock 'sls_mu'}}
611 sls_mu.Unlock();
612}
613
614void es_bad_7() {
615 sls_mu.ReaderLock();
616 Bar.le_fun(); // \
617 // expected-warning {{cannot call function 'le_fun' while holding lock 'sls_mu'}}
618 sls_mu.Unlock();
619}