blob: d12ee69faba392e91de21767460c7cc5616e1ce0 [file] [log] [blame]
// Test function lock requirement annotations with unsupported or unrecognized
// lock names/expressions
// { dg-do compile }
// { dg-options "-Wthread-safety -Wthread-unsupported-lock-name -O" }
#include "thread_annot_common.h"
namespace ns1 {
struct Foo {
Mutex mu_;
};
template <typename T>
class Bar {
private:
Mutex mu_;
void Lock() EXCLUSIVE_LOCK_FUNCTION(mu_);
void Unlock() UNLOCK_FUNCTION(mu_);
T foo GUARDED_BY(mu_);
Foo *x;
public:
Mutex *GetLock1() LOCK_RETURNED(mu_);
Mutex *GetLock2() LOCK_RETURNED(x->mu_);
Mutex *GetLock3() LOCK_RETURNED(y->mu_); // { dg-warning "'lock_returned' attribute ignored due to the unsupported argument" }
T get_foo() SHARED_LOCKS_REQUIRED(x->mu_, (mu2)) { // { dg-warning "Unsupported argument of 'shared_locks_required' attribute ignored" }
T ret;
ret = foo;
return ret;
}
void set_foo(T a) EXCLUSIVE_LOCKS_REQUIRED((mu_), GetLock2()) { // { dg-warning "Unsupported argument of 'exclusive_locks_required' attribute ignored" }
foo = a;
}
};
Mutex mu2;
float r;
Bar<float> *b1;
void func1()
{
{
MutexLock ml(b1->GetLock1());
b1->set_foo(3.5);
r = b1->get_foo(); // { dg-warning "Calling function 'get_foo' requires lock 'x->mu_'" }
}
b1->GetLock2()->Lock();
r += b1->get_foo();
b1->GetLock2()->Unlock();
}
}