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

    <tr>
        <th>Summary</th>
        <td>
            [libc++] Some string functions are broken when the allocator size_type is unsigned char
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++,
            rejects-valid
      </td>
    </tr>

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

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

<pre>
    ```c++
#include <cassert>
#include <cstddef>
#include <memory>
#include <string>

template <std::size_t MaxSize, class T>
struct tiny_size_allocator {
  using value_type = T;
  using size_type = unsigned char;

  template <class U>
  struct rebind {
    using other = tiny_size_allocator<MaxSize, T>;
  };

  tiny_size_allocator() = default;

  template <class U>
 tiny_size_allocator(tiny_size_allocator<MaxSize, U>) {}

  T* allocate(std::size_t n) {
    assert(n <= MaxSize);
    return std::allocator<T>{}.allocate(n);
  }

  void deallocate(T* ptr, std::size_t n) { std::allocator<T>{}.deallocate(ptr, n); }

  size_type max_size() { return MaxSize; }

  friend bool operator==(tiny_size_allocator, tiny_size_allocator) { return true; }
 friend bool operator!=(tiny_size_allocator, tiny_size_allocator) { return false; }
};

void test() {
  std::basic_string<char, std::char_traits<char>, tiny_size_allocator<10, char>> str;
  str == "";
}
```
currently fails with
```
/opt/compiler-explorer/clang-trunk-20250131/bin/../include/c++/v1/string:3753:22: error: no matching function for call to 'min'
 3753 |   size_type __rlen = std::min(__n1, __sz - __pos1);
      | ^~~~~~~~
```

We should probably also test other interfaces.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVU2PozgQ_TXOpZQITFjgwIFOmtueZlZ7RAaK4G1jI9tkOn3Y376ygTTpzWpWmshSJOrjvVdVLjNj-EUi5iR-IfF5xybbK52PPReSvyVJsqtVe8vJb8F8GkJf3AkKQiMuGzG1CCQ6NcwY1JZEr_82Gdu22D0zDTgofXtmMVZzeVksQWFxGAWzi6klUUGiwvAPrCz8zt6_8Q8k9ASNYMbA9znMWD01FiyXt8q7MiFUw6zSQBKnAGAyXF7gysSElb2NLv3ZhW-tM8pqnKSvVwtNz_Ts6H23BGcWf8wsABYeGmsu2zv0ml7ZHrVP_YQoiU4bdV7Xwo0k5y36k1CaEpr5xC12bBL2f7F9numn1Hy4g0teHLMF5juhBSwRSGj6tXNyDZkLsowQTaXj5ZjfEbJVN4BGO2kJ91xbRr5CnsJhAys38Rt2V8VbaHHj6PmOVjtF_8X1p8APGZdkC4Mt-udYDezd13btWPKyalzlP0Z2mqNsoVZKgBpRzxTO7jzvFD09b-sDltXTBug5CA1_EaRjwmzlbIbYd8OisZ9lWG7PUu6aGd5U6144-fu37ZP7UFnNuDWr2c3kc1rRKQz8wljcold3TdchMdbfSDeBhFJ3ZpYz6XUVkqBoJq1RWnGDjnFh4Ae3_RcXQks1WkLLRg0jF6j3-D4KpVG7b4LJy97qSb7taUDjIIxCQsuaS0LLw4HQclmJznfZvLS8Op-1EEWUxBGJCkeyANTaqStAKhiYbXq3YrpJNpYrCZ3S0DAhwCogNBkcTOIUuxxAkhNs57KqtEDpN8i9yD4krSoZuupVlfmAPVTVqEz4cEnBZyPx69_z72tRguJPBNOrSbQwalWzWtyACaP8CCxLkUuLumMNmsOuzaM2izK2wzxMojQKj8kx3fV5fKxZGsaUBVFG2zRgrIviMEu6oA3DIGh2PF8LG2QhpemBNi1mR5rFSZyxtmHkGODAuDgIcR0OSl923JgJ85DGYZrsBKtRGP88Uip4fW8DJfREKNX4FzbW7K9M8NZ9jc87nbtc-3q6GHIMBDfWfGa33Ar_3G6SxWf4pgaEuan3hhlgGqHW6g0l_OhRgu0RPp-xz15x8_gy7SYt8t7a0bi-0ZLQ8sJtP9WHRg2Elo7N8rcftXIS3LA54YbQctF-zek_AQAA__-QL4Bx">