1 // { dg-do compile }
2 
3 typedef __SIZE_TYPE__ size_t;
4 class bad_alloc   { };
5 typedef struct {
6 } __gthread_mutex_t;
7 int __gthread_mutex_unlock (__gthread_mutex_t *__mutex);
8 class __concurrence_unlock_error   {
9 };
__throw_concurrence_unlock_error()10 inline void   __throw_concurrence_unlock_error()   {
11     throw __concurrence_unlock_error();
12 }
13 class __mutex   {
14     __gthread_mutex_t _M_mutex;
15 public:
unlock()16     void unlock()     {
17 	if (__gthread_mutex_unlock(&_M_mutex) != 0)
18 	  __throw_concurrence_unlock_error();
19     }
20 };
21 class free_list   {
22     typedef __mutex __mutex_type;
23     __mutex_type&     _M_get_mutex();
24     void _M_get(size_t __sz) throw(bad_alloc);
25 };
_M_get(size_t __sz)26 void  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