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

    <tr>
        <th>Summary</th>
        <td>
            `__restrict` pointers are not `indirectly_readable`
        </td>
    </tr>

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

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

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

<pre>
    For example,
```c++
void f( double * __restrict ptr ) {
    using ptr_t = decltype(ptr);
 static_assert(!std::indirectly_readable<ptr_t>);
 static_assert(!std::is_same_v<std::remove_cv_t<ptr_t>, double *>);
}
```
```
concepts.h(127, 59): Because 'const double *__restrict' does not satisfy 'indirectly_readable'
concepts.h(65, 31): Because 'remove_cvref_t<const double *__restrict>' (aka 'const double *__restrict') does not satisfy '__indirectly_readable_impl'
iterator_traits.h(519, 1): Because 'typename iter_value_t<_In>' would be invalid: no type named 'value_type' in 'std::indirectly_readable_traits<const double *__restrict>'
```
([Godbolt](https://godbolt.org/z/61EM4crG6))

This makes the standard `std::advance` and related functionality unavailable for such pointers (yet `std::ranges::advance` works fine, for whoever needs an immediate fix).

I think `__restrict` should be stripped out of the type, but instead it gets treated syntactically as if is were a `const` or `volatile` qualifier.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVM2O2zgMfhrlQjSw5Ti2Dz7MT1P0sLe9G7REx9qRJa9Ee5p9-oXcdJqdCboFhASiwu-HZIgxmrMjakX5KMrnHS48-tC-kMbAaHe915f25APQN5xmS0I-iexZZA_imH0_SsjHdLbo6o2GQcgatF96SyDkA3RdoMjBKIaZAwjZgKiuCQAASzTunJ46BlE8gyZl-TKTkPXMQchGFD9-HRnZqA5jpMBC1kLmkbUoHkTxYJw2gRTbSxcINfaWRPG0wYri8-_DxC7iRN0qiqe3YKDJr9SpNWHdYD7d-HxHIqrnd5W6e1XeKZo57kch61xWCbNsNqAHeCSFS0zolfIu8g3bz6IKWYH2FMF5hohs4nBJGffqIas7rMcykRb5R9I324GGzfkvVCT3FQhZ4wv-r-A0A_c0d90d1Z2ZZvsm3TAFZB86DmiuDsq8SRbuOEhz5HAiSGndinahzUj31V0Vv_rFaugJjFvRmtRwcB5SIqRMnWCuidtQVmBciv1q8K7ifqNi92dE1qJ8_OJ17y2L8lnIemSeY-KTJyFP5-9Pex_OQp7-EfJ0zD__cVDhyzHVQDZXnO3zz9FEmPCFIvBIafidxqBBHLM3D6hXdIrEMQN0GgJZZNIwLE6x8Q6t4QssDlc0NhmEwQeIixph9sYxhZhafyH-D2pAd6b4geHVh5cIg3FpnWxIr6OnlQI4Ih0BHZhpIm2QCQbzTchmf2voK_Bo3EuiuinnMYM4_mhmis0zafALgx8249_b9wT9wmBcZEINhuFMHIEDbYbjxTEqNgqtvQBGMAOYCK8UCDARbv1MXD6k6-otsrGbrb8XtGYwFPY73Ra6KRrcUZtXeV6XpSwPu7Gl6lAcGyTVNLIecq1JVU1ZU02U06FXO9PKTB6yosizQmblYd_njW5UI1HLvm9yFIeMJjR2b-06pf7vTIwLtXWVV_XOYk82bstcSkevsD0KKdNuD23K-dQv5ygOmTWR408UNmyp_VDRt-5ioO3PKo7ZvcVyzHZLsO27KTU8Lv1e-UnIU2K6fn2ag_-L0iI4bfqikKdN_78BAAD__9IQFHE">