blob: 25cf376973b4b9a8591dd822c25ae6fe22d79e8d [file] [log] [blame]
// Test cases where the lock is accessed via a simple method call.
// This commonly arises when using smart pointer classes that define operator->
// { dg-do compile }
// { dg-options "-Wthread-safety -O" }
#include "thread_annot_common.h"
template<class T>
class SharedPtr {
public:
T* ptr;
inline T* operator->() { return ptr; }
inline SharedPtr(T* p) : ptr(p) { }
};
class Foo {
public:
Mutex _mu;
int data GUARDED_BY(_mu);
};
// use a smart pointer
int foo1(Foo* ptr) {
SharedPtr<Foo> sptr(ptr);
MutexLock l(&sptr->_mu);
return sptr->data;
}
// use a smart pointer
int foo2(Foo* ptr) {
SharedPtr<Foo> sptr(ptr);
sptr->_mu.Lock();
int d = sptr->data;
sptr->_mu.Unlock();
return d;
}
// use a smart pointer
// test to ensure there are no "lock not acquired" errors on the unlock.
int foo3(SharedPtr<Foo>& fpp) {
fpp->_mu.Lock();
fpp->_mu.Unlock();
}