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;
}