1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| // RUN: %clang_cc1 %s -Wthread-safety-analysis -verify -fexceptions
// expected-no-diagnostics
class Mutex {
public:
void Lock() __attribute__((exclusive_lock_function()));
void Unlock() __attribute__((unlock_function()));
};
class A {
public:
Mutex mu1, mu2;
void foo() __attribute__((exclusive_locks_required(mu1))) __attribute__((exclusive_locks_required(mu2))) {}
template <class T>
void bar() __attribute__((exclusive_locks_required(mu1))) __attribute__((exclusive_locks_required(mu2))) {
foo();
}
};
void f() {
A a;
a.mu1.Lock();
a.mu2.Lock();
a.bar<int>();
a.mu2.Unlock();
a.mu1.Unlock();
}
|