https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101361

--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This would be better, because it avoids the redundant range checking done when
this->compare calls this->substr:

      {
        const auto __len = this->size();
        const auto __xlen = __x.size();
        return __len >= __xlen
          && traits_type::compare(end() - __xlen, __x.data(), __xlen) == 0;
      }

But there's still a bug if the compiler warns about unreachable code. The npos
is passed to substr as __n which does:

const size_type __rlen = std::min(__n, _M_len - __pos);

So there is no way we ever pass that value to memcmp. From my uninformed point
of view this seems like a problem with jump threading vs VRP and changing
libstdc++ just sweeps it under the rug.

Reply via email to