1// { dg-do compile }
2
3typedef __SIZE_TYPE__ size_t;
4class bad_alloc   { };
5typedef struct {
6} __gthread_mutex_t;
7int __gthread_mutex_unlock (__gthread_mutex_t *__mutex);
8class __concurrence_unlock_error   {
9};
10inline void   __throw_concurrence_unlock_error()   {
11    throw __concurrence_unlock_error();
12}
13class __mutex   {
14    __gthread_mutex_t _M_mutex;
15public:
16    void unlock()     {
17	if (__gthread_mutex_unlock(&_M_mutex) != 0)
18	  __throw_concurrence_unlock_error();
19    }
20};
21class free_list   {
22    typedef __mutex __mutex_type;
23    __mutex_type&     _M_get_mutex();
24    void _M_get(size_t __sz) throw(bad_alloc);
25};
26void  free_list::_M_get(size_t __sz) throw(bad_alloc)
27{
28  __mutex_type& __bfl_mutex = _M_get_mutex();
29  __bfl_mutex.unlock();
30  int __ctr = 2;
31  while (__ctr)  {
32      size_t* __ret = 0;
33      --__ctr;
34      try {
35	  __ret = (size_t*) (::operator new(__sz + sizeof(size_t)));
36      }
37      catch(const bad_alloc&) { }
38  }
39}
40