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

Reply via email to