https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105681
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Target Milestone|--- |12.2
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2022-05-26
Assignee|unassigned at gcc dot gnu.org |redi at gcc dot gnu.org
--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> ---
I think the compiler might have got stricter about diagnosing narrowing
conversions in non-type template arguments (I think I even reported a bug
saying it should do that!)
The problem is that size_t is a 16-bit unsigned int, so too small for the
values we use in the specializations:
template<typename _UIntType, size_t __m,
size_t __pos1, size_t __sl1, size_t __sl2,
size_t __sr1, size_t __sr2,
uint32_t __msk1, uint32_t __msk2,
uint32_t __msk3, uint32_t __msk4,
uint32_t __parity1, uint32_t __parity2,
uint32_t __parity3, uint32_t __parity4>
class simd_fast_mersenne_twister_engine
// ...
typedef simd_fast_mersenne_twister_engine<uint32_t, 86243, 366,
6, 7, 19, 1,
0xfdbffbffU, 0xbff7ff3fU,
0xfd77efffU, 0xbf9ff3ffU,
0x00000001U, 0x00000000U,
0x00000000U, 0xe9528d85U>
sfmt86243;
We could change the size_t there to be a type with at least 32 bits to make it
work, but I think the right fix is to simply not defined those typedefs that
don't fit in 16 bits:
--- a/libstdc++-v3/include/ext/random
+++ b/libstdc++-v3/include/ext/random
@@ -346,6 +346,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
0xa3ac4000U, 0xecc1327aU>
sfmt44497_64;
+#if __SIZE_WIDTH__ >= 32
typedef simd_fast_mersenne_twister_engine<uint32_t, 86243, 366,
6, 7, 19, 1,
@@ -396,6 +397,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
0xf8000001U, 0x89e80709U,
0x3bd2b64bU, 0x0c64b1e4U>
sfmt216091_64;
+#endif // __SIZE_WIDTH__ >= 32
#endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
Everything in <ext/random> is a non-standard extension, so we're under no
obligation to provide any of it for standard conformance.