[Bug c++/105233] Incorrect "alignment not an integer constant" error in alignas with template parameter dependent argument
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 12 12:03:56 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105233
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Slightly reduced:
template <typename T>
struct __int_traits {
static constexpr int __digits = sizeof (T) * 8;
static constexpr T __max = ~(T) 0;
};
namespace std __attribute__ ((__visibility__ ("default")))
{
template<typename _Tp>
constexpr int
__countl_zero(_Tp __x) noexcept
{
constexpr auto _Nd = __int_traits<_Tp>::__digits;
if (__x == 0)
return _Nd;
constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits;
constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
if constexpr (_Nd <= _Nd_u)
{
constexpr int __diff = _Nd_u - _Nd;
return __builtin_clz(__x) - __diff;
}
else if constexpr (_Nd <= _Nd_ul)
{
constexpr int __diff = _Nd_ul - _Nd;
return __builtin_clzl(__x) - __diff;
}
else if constexpr (_Nd <= _Nd_ull)
{
constexpr int __diff = _Nd_ull - _Nd;
return __builtin_clzll(__x) - __diff;
}
else
{
static_assert(_Nd <= (2 * _Nd_ull),
"Maximum supported integer size is 128-bit");
unsigned long long __high = __x >> _Nd_ull;
if (__high != 0)
{
constexpr int __diff = (2 * _Nd_ull) - _Nd;
return __builtin_clzll(__high) - __diff;
}
constexpr auto __max_ull = __int_traits<unsigned long long>::__max;
unsigned long long __low = __x & __max_ull;
return (_Nd - _Nd_ull) + __builtin_clzll(__low);
}
}
template<typename _Tp>
constexpr _Tp
__bit_ceil(_Tp __x) noexcept
{
constexpr auto _Nd = __int_traits<_Tp>::__digits;
if (__x == 0 || __x == 1)
return 1;
auto __shift_exponent = _Nd - std::__countl_zero((_Tp)(__x - 1u));
if (!__builtin_is_constant_evaluated())
{
;
}
return (_Tp)1u << __shift_exponent;
}
}
template<typename T>
struct Data {
T m_a;
T m_b;
T m_c;
};
template<typename T>
struct alignas(std::__bit_ceil(sizeof(Data<T>))) AlignedData {
Data<T> m_data;
};
AlignedData<int> g_test;
Seems it is the if (!__builtin_is_constant_evaluated()) { ; }
part.
More information about the Gcc-bugs
mailing list