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

    <tr>
        <th>Summary</th>
        <td>
            [libc++] inconsistent `is_integral<_BitInt(N)>` implementation
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++
      </td>
    </tr>

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

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

<pre>
    After optimization commit https://github.com/llvm/llvm-project/commit/5ade17e0ca8b11f57cb15a1bee6d30a3815d8cac pushed back in 2020, behavior of `is_integral<_BitInt(N)>` became inconsistent.
1) in libstdc++ `std::is_integral_v<_BitInt(N)>` is false
2) in libc++ `std::is_integral_v<_BitInt(N)>` is false when compiler has no `__is_integral` built-in
3) in libc++ `std::is_integral_v<_BitInt(N)>` is true when compiler has `__is_integral` built-in

This is caused by https://github.com/llvm/llvm-project/blob/main/libcxx/include/__type_traits/is_integral.h implementation
```c++
template <class _Tp> struct __libcpp_is_integral { enum { value = 0 }; };
template <>          struct __libcpp_is_integral<bool>               { enum { value = 1 }; };
template <>          struct __libcpp_is_integral<char>               { enum { value = 1 }; };
// ...other specializations...

#if __has_builtin(__is_integral)
    // __is_integral-based implementation, treating _BitInt(N) as integral
#else
    // __libcpp_is_integral-based implementation, treating _BitInt(N) as not integral
#endif
```

Here is example (causing failure in `ROCm/composable_kernel`):
```c++
#include <type_traits>

using int4_t  = _BitInt(4);
using f8_t    = _BitInt(8);
using bf8_t   = unsigned _BitInt(8);

// passes with stdlibc++, fails with clang+libc++
static_assert(!std::is_integral_v<int4_t>);
static_assert(!std::is_integral_v<f8_t>);
static_assert(!std::is_integral_v<bf8_t>);
```
Conformance view: https://godbolt.org/z/TcjPTrhGq

To my knowledge `_BitInt(N)` should not pass is_integral trait (maybe is some future standard we'll see this). 
Overall, I'd like to see consistent behavior (not depending on `__has_builtin(__is_integral)`).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVt-PozYQ_mucl9EhMAmBBx6S7KY9qepV1b4j2wzBt8amtslu7q-vDLkN2R933e6hKETx-PtmPN_MmDknDxqxJKstWd0s2OBbY8uNPtjTH-ZeLripT-Wm8WjB9F528hvz0mgQpuukh9b73pF0Q-ie0P1B-nbgkTAdoXuljt9fn3prvqLwhO6nfYTuV6zGZI2xYDlPkma1FjxZsYQjZnUaszRPVnUumIB-cC3WwJm4B6mBxjQmdAccW3aUxoJpgGSxdJXUHg-WKZLuqq30n7UnNP-T0IKktySLgaNgHYLUwmgnnUftIxLfkHiTEFoEbCW587UgdEvoNqA6X4fg0s0Mvjq-RSAdNEw5nEDpBfTDiPDQ4njmvVRooWUOtAlwVTUPPAQ5SOU_ST35kP4aH7wdXnPh5_zT910rXYARbHAhk6f3y4Yrwwndd0zqsCi5eHwkdC-1UEONhO6ryp96rLxl0ruwcnErakF2vcIOtR_Fe_Yti6fP-WSmfz12vWIegaQ7oZhzUN31JL0F5-0gPFRVIO_7edxA1ltAPXTjjyNTQ9h-AzGQ9Q1Jt-fXS4KA-_T8gICkO26MujIfnzeIk19ILFpmP0Y8JRmiKDK-RQuuRyGZOncSF0XRXCyEprKBqmqZq0YxhYzn1zqjxWQ7ejKhXxl84iwI7VnW6Q68RealPsC10oE5eAL_7gU-VfIVzctD-j9s2vhXGHUtm2finB_N72gx1BE-ssAFhOahpAJDw6QawqoOVfn3l1039dreOMYVVvdoNYYCHet686MKCAmYyiooZV5V6e3cm4lYar-sPIzZv4S5HGm2c8MmD2bPDfOXhvxsGQwHPY6n-q0dVwLrmXPo4EH6FpyvLz0v5CIc0HlNKKYPhG5nBiOMC5kTVUCxgYnQ5M1OOYUdTmTmzXsAQpAf2M5f2f9MMzujG2M7pgXCUeIDSTfP-66puVE-MvZA6P4bofs78fWvO9v-9s9V-zbQneBemweF9QHHtn89KLIYXGsGVY-6DnmAeXsc5RPU2rETHxXsTIfQDD5I1nmma2ZreEBC10qBQwTfSkdoEcHkwpcjWqZUSORnQtc1KHmP4M1oexnnl0sBoXlwpcY-FJU-gNHTuPpJWxkLJFrUZVoXacEWWCZrmqZJSots0ZZZvOR53CCPM0bToljlLGO8KQqaLIs0ThaypDFdxnkSJ3mcJ1nEljlriiRbrjFdYZ2QZYwdkyoKAy6c_EI6N2CZxHSdrReKcVRuvI1ROlcwDbczW45jkQ8HR5axks67C46XXo33uNm21c3Vdec_XpSuO9lisKp898AeowqD-BzYsaT_BgAA__9s1DcV">