__uint128_t не работает с Clang и libstdStack Overflow

Рассмотрим следующую небольшую тестовую программу для черт типа GNU-расширений для __uint128_t

#include <limits>
#include <type_traits>

using uint128_t = __uint128_t;

int main()
{
static_assert(std::is_unsigned<uint128_t>{}, "");
static_assert(std::is_integral<uint128_t>{}, "");
static_assert(std::numeric_limits<uint128_t>::digits == 128, "");
}

Это работает для g ++ и libstdc ++ (рабочий пример) и для clang ++ и libc ++ (рабочий пример), но не для комбинации clang ++ и libstdc ++ (неудачный пример).

Обратите внимание, что во всех 3 случаях я использую -std=gnu++1z флаг.

Вопрос: какая комбинация параметров командной строки может успешно скомпилировать мою тестовую программу для clang ++ с libstdc ++?

3

Решение

В нестандартном -std=gnu++* В режимах GCC предопределяет два макроса, которые libstdc ++ выбирает для предоставления дополнительных характеристик типов:

$ g++ -std=gnu++1z -c -E -dM -xc++ /dev/null | grep INT_N
#define __GLIBCXX_BITSIZE_INT_N_0 128
#define __GLIBCXX_TYPE_INT_N_0 __int128

Clang не определяет их. Определение их вручную путем передачи -D__GLIBCXX_TYPE_INT_N_0=__int128 а также -D__GLIBCXX_BITSIZE_INT_N_0=128 в командной строке заставляет ваш тестовый случай работать с clang.

Добавление их в сам Clang является https://llvm.org/bugs/show_bug.cgi?id=23156, который помечен как исправленный, но я не уверен, в какой версии. У меня 3.8.1 установлен локально, где он не работает, но я не проверял 3.9.0.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]