blob: b06285a196cd10725ad3e332b9c8b4a38f40d6c7 [file] [log] [blame]
// { dg-do compile }
// { dg-additional-options "-fnon-call-exceptions -fno-inline-functions-called-once -fno-tree-sra --param early-inlining-insns=1" }
template <typename, typename> struct __replace_first_arg;
template <template <typename> class _Template, typename _Up, typename _Tp,
typename... _Types>
struct __replace_first_arg<_Template<_Tp, _Types...>, _Up> {
using type = _Template<_Up>;
};
template <class> class min_pointer;
struct pointer_traits {
template <typename _Up>
using rebind = typename __replace_first_arg<min_pointer<int>, _Up>::type;
};
template <typename, typename _Tp>
using __ptr_rebind = pointer_traits::rebind<_Tp>;
template <typename _Alloc> struct allocator_traits {
template <typename _Tp>
static auto construct(_Alloc, _Tp) noexcept -> decltype(0);
};
template <typename _ForwardIterator, typename _Allocator>
void _Destroy(_ForwardIterator __last, _Allocator) {
_ForwardIterator __first;
for (; __first != __last;)
;
}
template <typename _ForwardIterator, typename _Allocator>
void __uninitialized_default_a(_ForwardIterator __last, _Allocator __alloc) {
_ForwardIterator __first;
try {
for (; __first != __last;)
allocator_traits<_Allocator>::construct(__alloc, 0);
} catch (...) {
_Destroy(__first, __alloc);
}
}
template <typename _Ptr> struct _Deque_iterator {
typedef __ptr_rebind<_Ptr, __ptr_rebind<_Ptr, int>> _Map_pointer;
};
template <typename _Alloc> class _Deque_base {
protected:
typedef _Alloc _Tp_alloc_type;
typedef _Deque_iterator<typename _Tp_alloc_type ::pointer> iterator;
_Deque_base(_Alloc, long);
typedef typename iterator::_Map_pointer _Map_pointer;
_Tp_alloc_type _M_get_Tp_allocator();
};
template <typename _Alloc> class deque : _Deque_base<_Alloc> {
typedef _Deque_base<_Alloc> _Base;
typedef typename _Base::_Map_pointer _Map_pointer;
typedef typename _Base::iterator iterator;
using _Base::_M_get_Tp_allocator;
public:
deque(int, _Alloc __a) : _Base(__a, 0) {
_Map_pointer __cur;
try {
__uninitialized_default_a(__cur, _M_get_Tp_allocator());
} catch (...) {
}
_M_destroy_data(begin(), end(), 0);
}
iterator begin();
iterator end();
template <typename _Alloc1>
void _M_destroy_data(iterator, iterator, _Alloc1) {
for (_Map_pointer __node;;)
_Destroy(__node, _M_get_Tp_allocator());
}
};
template <class T> class min_pointer {
T ptr_;
friend bool operator==(min_pointer x, min_pointer y) {
return x.ptr_ == y.ptr_;
}
friend bool operator!=(min_pointer x, min_pointer y) { return x == y; }
};
template <class> class min_allocator {
public:
typedef int pointer;
};
int foo() {
int n;
min_allocator<int> alloc;
deque<min_allocator<int>>(n, alloc);
return 1;
}