https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100516
--- Comment #2 from vopl at bk dot ru --- minimal reproduce code I have: using size_t = decltype(sizeof(char)); class initializer { const char* _array; size_t _len; public: constexpr initializer() : _array{}, _len{} { } constexpr const char* begin() const noexcept { return _array; } constexpr const char* end() const noexcept { return _array + _len; } }; /////////0/////////1/////////2/////////3/////////4/////////5/////////6/////////7 struct deque { char** _M_map; char** _M_start; char** _M_finish; template <class=void> void _M_initialize_map(size_t); deque(initializer nil) { const char* first = nil.begin(); const char* last = nil.end(); _M_initialize_map(static_cast<size_t>(last - first)); for (char** cur_node = _M_start; cur_node != _M_finish; ++cur_node) ++first; if (last != first) __builtin_memmove(*_M_finish, first, static_cast<size_t>(last - first)); } }; template <class> void deque::_M_initialize_map(size_t num_elements) { size_t num_nodes = (num_elements / size_t{2} + 1); _M_map = new char*[8]; char** nstart = _M_map + (size_t{8} - num_nodes) / 2; try { for (char** cur = nstart; cur == nstart; ++cur) *nstart = new char; } catch(...) { throw; } _M_start = _M_finish = nstart; } /////////0/////////1/////////2/////////3/////////4/////////5/////////6/////////7 int main() { deque{initializer{}}; return 0; }