https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99402
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- François, this can't be right: return std::make_pair(-__seq_dist.first, __seq_dist.second == __dp_exact ? __dp_sign_max_size : __seq_dist.second); This uses __seq_dist.second, but __seq_dist comes from _SeqTraits::_S_size which is: template<typename _Sequence> struct _Sequence_traits { typedef _Distance_traits<typename _Sequence::iterator> _DistTraits; static typename _DistTraits::__type _S_size(const _Sequence& __seq) { return std::make_pair(__seq.size(), __dp_exact); } }; i.e. __seq_dist.second is always __dp_exact, so this function always returns __dp_sign_max_size. You should be using __base_dist.second, no?