https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66017
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- I think this would solve it (I'm still trying to build a clang that will allow me to reproduce the error): --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -869,25 +869,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION iterator begin() _GLIBCXX_NOEXCEPT { + if (_M_impl._M_header._M_left == &_M_impl._M_header) + return end(); return iterator(static_cast<_Link_type> (this->_M_impl._M_header._M_left)); } const_iterator begin() const _GLIBCXX_NOEXCEPT - { + { + if (_M_impl._M_header._M_left == &_M_impl._M_header) + return end(); return const_iterator(static_cast<_Const_Link_type> (this->_M_impl._M_header._M_left)); } iterator end() _GLIBCXX_NOEXCEPT - { return iterator(static_cast<_Link_type>(&this->_M_impl._M_header)); } + { + return iterator(reinterpret_cast<_Link_type> + (&this->_M_impl._M_header)); + } const_iterator end() const _GLIBCXX_NOEXCEPT { - return const_iterator(static_cast<_Const_Link_type> + return const_iterator(reinterpret_cast<_Const_Link_type> (&this->_M_impl._M_header)); } When the tree is empty begin() performs an invalid cast too, but I don't like the branch this introduces.