The r16-6177-g866bc8a9214b1d introduced type-constraint on _Urbg template
parameter in __glibcxx_concepts, with was inconsistent with declaration in
bits/random.h and definition in bits/random.tcc causing the missing symbol
errors in tests.
Furthermore, this made the mangled name of generate_canonical in C++20
mode different from older standard and previous versions of GCC.
libstdc++-v3/ChangeLog:
* include/bits/random.tcc (generate_canonical)
[!_GLIBCXX_USE_OLD_GENERATE_CANONICAL]: Use static_assert
instead of type-constraint on template parameter.
---
The missing error was much more prosaic in their root cause, than I
have originally suspected.
Testing on x86_64-linux. OK for trunk?
libstdc++-v3/include/bits/random.tcc | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/libstdc++-v3/include/bits/random.tcc
b/libstdc++-v3/include/bits/random.tcc
index 38e8645c88c..d0aed028ed6 100644
--- a/libstdc++-v3/include/bits/random.tcc
+++ b/libstdc++-v3/include/bits/random.tcc
@@ -3619,12 +3619,6 @@ namespace __detail
template <> const bool __is_rand_dist_float_v<long double> = true;
#endif
-#ifdef __glibcxx_concepts
-# define _Uniform_random_bit_generator uniform_random_bit_generator
-#else
-# define _Uniform_random_bit_generator typename
-#endif
-
// Note, this works even when (__range + 1) overflows:
template <typename _Rng>
constexpr bool __is_power_of_2_less_1(_Rng __range)
@@ -3646,10 +3640,13 @@ namespace __detail
* @since C++11
*/
template<typename _RealT, size_t __digits,
- _Uniform_random_bit_generator _Urbg>
+ typename _Urbg>
_RealT
generate_canonical(_Urbg& __urng)
{
+#ifdef __glibcxx_concepts
+ static_assert(uniform_random_bit_generator<_Urbg>);
+#endif
static_assert(__is_rand_dist_float_v<_RealT>,
"template argument must be floating point");
static_assert(__digits != 0 && _Urbg::max() > _Urbg::min(),
--
2.52.0