[Demangle] fix deref of std::string_view::end()
authorNick Desaulniers <ndesaulniers@google.com>
Wed, 31 May 2023 16:44:13 +0000 (09:44 -0700)
committerNick Desaulniers <ndesaulniers@google.com>
Wed, 31 May 2023 16:49:36 +0000 (09:49 -0700)
commit54a2994fa8beb4f89bc3783b8f631f628a23e92c
treec0e0c4c43e90ea4ce3049f2757f0ce6bd4cf6f7f
parent4ad7279392653c0bcf564799ffb3f7e20ed4ef00
[Demangle] fix deref of std::string_view::end()

In D148546, I replaced much of the use of llvm::StringView w/
std::string_view.  There's one important semantic difference between the
two:

In most STL containers, end() returns an iterator that refers to one
past the end of the container. But llvm::StringView::end() refers to the
last element.

Expressions such as `&*my_std_string_view.end()` produce the failed
assertion:

  include/c++/v1/__iterator/bounded_iter.h:93: assertion
  __in_bounds(__current_) failed: __bounded_iter::operator*: Attempt to
  dereference an out-of-range iterator

This was caught when copying the recent downstream changes back upstream
in D148566, and is reproducible via:

  $ libcxx/utils/ci/run-buildbot generic-debug-mode

when compiled with clang and clang++. The correct way to get the same
value as before without dereferencing invalid iterators is to prefer
`&*my_std_string_view.rbegin() + 1`.

Fix this downstream so that I might copy it back upstream in D148566.

The other instance of `&*my_std_string_view.end()` that I introduced in
D148546 has been fixed already in D149061.

Reviewed By: ashay-github

Differential Revision: https://reviews.llvm.org/D151760
llvm/include/llvm/Demangle/ItaniumDemangle.h