blob: ea00c897a9f0c25a07d9f1634f79246af2a20382 [file] [log] [blame]
// Test guarded_by/pt_guarded_by 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 {
int p GUARDED_BY(a->mu); // { dg-warning "'guarded_by' attribute downgraded to 'guarded'" }
int q GUARDED_BY(f2()->get_lock()); // { dg-warning "'guarded_by' attribute downgraded to 'guarded'" }
class Foo {
public:
Mutex mu_;
};
int r GUARDED_BY(ns2::Foo::mu_); // { dg-warning "'guarded_by' attribute downgraded to 'guarded'" }
template <typename T>
class Bar {
public:
T func1() {
T ret;
mu1_.Lock();
a_ = 5; // { dg-warning "Writing to variable 'a_' requires lock 'foo_->mu_'" }
x_ = 3 + q;
ret = x_ - *y_;
mu1_.Unlock();
return ret;
}
T x_ GUARDED_BY(((mu1_)));
Mutex mu1_ ACQUIRED_AFTER(mu2); // { dg-warning "Unsupported argument of 'acquired_after' attribute ignored" }
T a_ GUARDED_BY(foo_->mu_);
T *y_ PT_GUARDED_BY(array[2]->mu_); // { dg-warning "'point_to_guarded_by' attribute downgraded to 'point_to_guarded'" }
Foo *foo_;
};
Bar<int> *b1 GUARDED_BY((a->mu)); // { dg-warning "'guarded_by' attribute downgraded to 'guarded'" }
Foo *f2;
int main()
{
f2->mu_.Lock();
b1->mu1_.Lock();
b1->func1();
p = r + 5;
b1->x_ = 3;
b1->mu1_.Unlock();
f2->mu_.Unlock();
}
}