diff --git a/libcxx/test/std/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.int/eval.pass.cpp b/libcxx/test/std/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.int/eval.pass.cpp --- a/libcxx/test/std/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.int/eval.pass.cpp +++ b/libcxx/test/std/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.int/eval.pass.cpp @@ -7,9 +7,6 @@ //===----------------------------------------------------------------------===// // // REQUIRES: long_tests -// -// This fails on MinGW for some unknown reason. -// UNSUPPORTED: target={{.+}}-windows-gnu // @@ -28,6 +25,12 @@ #include "test_macros.h" +// The __int128 conversions to/from floating point crash on MinGW on x86_64. +// This is fixed in Clang 14 by https://reviews.llvm.org/D110413. +#if defined(__x86_64__) && defined(__MINGW32__) && defined(__clang_major__) && __clang_major__ < 14 + #define TEST_BUGGY_I128_FP +#endif + template T sqr(T x) { @@ -130,7 +133,7 @@ // or unsigned long long. // (We support __int128 as an extension.) -#ifndef _LIBCPP_HAS_NO_INT128 +#if !defined(_LIBCPP_HAS_NO_INT128) && !defined(TEST_BUGGY_I128_FP) test_statistics<__int128_t, std::minstd_rand0>(); test_statistics<__uint128_t, std::minstd_rand0>();