// PR c++/71092
// { dg-do compile { target c++11 } }

template <typename _Default> struct A { using type = _Default; };
template <typename _Default, template <typename> class>
using __detected_or = A<_Default>;
template <typename _Default, template <typename> class _Op>
using __detected_or_t = typename __detected_or<_Default, _Op>::type;
template <typename _Tp> struct B { typedef _Tp value_type; };
struct C {
  template <typename _Tp> using __pointer = typename _Tp::pointer;
};
template <typename _Alloc> struct J : C {
  using pointer = __detected_or_t<typename _Alloc::value_type *, __pointer>;
};
template <typename _T1> void _Construct(_T1 *) { new _T1; }
struct D {
  template <typename _ForwardIterator, typename _Size>
  static _ForwardIterator __uninit_default_n(_ForwardIterator p1, _Size) {
    _Construct(p1);
    return _ForwardIterator();
  }
};
template <typename _ForwardIterator, typename _Size>
void __uninitialized_default_n(_ForwardIterator p1, _Size) {
  D::__uninit_default_n(p1, 0);
}
template <typename _ForwardIterator, typename _Size, typename _Tp>
void __uninitialized_default_n_a(_ForwardIterator p1, _Size, _Tp) {
  __uninitialized_default_n(p1, 0);
}
template <typename> struct __shared_ptr {
  constexpr __shared_ptr() : _M_ptr(), _M_refcount() {}
  int _M_ptr;
  int _M_refcount;
};
template <typename _Alloc> struct F {
  typedef _Alloc _Tp_alloc_type;
  struct G {
    typename J<_Tp_alloc_type>::pointer _M_start;
    G(_Tp_alloc_type);
  };
  F(int, _Alloc p2) : _M_impl(p2) {}
  G _M_impl;
};
template <typename _Tp, typename _Alloc = B<_Tp>> struct K : F<_Alloc> {
  typedef _Alloc allocator_type;
  K(int, allocator_type p2 = allocator_type()) : F<_Alloc>(0, p2) {
    __uninitialized_default_n_a(this->_M_impl._M_start, 0, 0);
  }
};
struct H {
  H();
  struct I {
    __shared_ptr<int> trigger[1];
  };
  __shared_ptr<int> resetTrigger_;
  K<I> states_;
  __shared_ptr<int> triggerManager_;
};
__shared_ptr<int> a;
H::H() : states_(0), triggerManager_(a) {}
