<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/81455>81455</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            reverse iterator might not respect fancy pointers
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          ilazaric
      </td>
    </tr>
</table>

<pre>
    https://github.com/llvm/llvm-project/blob/f5399e89a27d8c64849a1631958952f4dfe14692/libcxx/include/__iterator/reverse_iterator.h#L135C1-L145C1

`return std::prev(current).operator->();`

If the `_Iter` type is a fancy pointer from an allocator, this expression will reduce to a raw pointer since fancy pointers usually implement an `operator->` to a raw pointer

I think it's more appropriate for a fancy pointer to have alias `pointer` refer to itself rather than a raw pointer

It might make more sense (not sure if best though) to check if `_Iter` is same as the iterator pointer, kinda like:
`std::is_same_v<_Iter, std::iterator_traits<_Iter>::pointer>` in the `if constexpr` condition:
```
#if _LIBCPP_STD_VER >= 20
 _LIBCPP_HIDE_FROM_ABI constexpr pointer operator->() const
    requires is_pointer_v<_Iter> || requires(const _Iter __i) { __i.operator->(); }
 {
    if constexpr (std::is_same_v<_Iter, std::iterator_traits<_Iter>::pointer>) {
      return std::prev(current);
    } else {
      return std::prev(current).operator->();
    }
  }
#else
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVV2PqzYQ_TWTl9GNjA0BHnjYJIu60la9uq36igwMwV0HU9tkd_vrK4eEZO-HqitVihLwTM459pwZS-fUYSAqINlCsl_JyffGFkrLf6RVzao27XvRez86EA_AS-DlQfl-qteNOQIvtT5dfz6N1vxFjQde1trUwMsuEXlOWS552mbNJs7iXEYbEeVJlie8i9uOoniT8wCg6ubtDXiphkZPLQEvq0p5stIbC7y0dCLraFla98DFcySSXfTpOYqTXQRsD-zh8r1hlvxkB3S-DcLFw2jpBDxrJmtp8MDztRlnqE8gHoFnwHMQW9iwe6CnDn1PCBtWPXmysGHo30dC5VBiJ4fmHUejBk8WO2uOKAeUWptmVr1D3yuH9DZack6ZAV-V1mipnRpCb1Cila8LglNDQx9RHU5uklq_ozqOmo40-MABG_ZBfZD1FdqHXQQdwwsqDzx1eDSWUI6jNaNV0hN2xn6zHW-wlydCqZV0gfCKu2FoqZszlHekO7TS92GhD9v_oQiPR3XoPR7lC80aHA2OEHg2GI9usoSqw5qcR9-b6dADzwNL01PzEkL3ZVAOnTwSSneu0NUXCzPf4YsaWolavVCwwNUYiyOUqwJCdQKxm2H57uaXK2DlrVTeLTni8eKnC898-mq4-kR12JjB-VD0EGnM0CqvzHCv4fKZX7lQHVbPT9vd58_V73_sqz8fv-CZZ4_8krTEf3naP1bll99-rR62TzempWzfmnpOusAgoqW_J2XJoXLV5V93RyAeEdIdpLslLzRNQMBzAlaVCqCQbsPj95sIId1fCCHd3qjvzyaU_f8vxazsxhi2-x9zIDT9kg_pHkkHU_4kyg-myT3w9WV5BC4C13ddsWoL0eYilysqopSlKc8jwVZ9wRJOTIia6ozxmNVJGrE8Y7KRss5zEitV8BDgEWd5xCO2JpF08SaPO560XSISiBkdpdLrMLTXxh5WyrmJiiyKk2SlZU3ana8Dzgd6xXMQOA-3gy3Og76eDg5ippXz7obilddUXAb1rSHnpg8dbsmN1PivJtxqsvrnb5izKge8PKv-NwAA__9MMhy8">