On Wed, Dec 17, 2025 at 9:56 AM Tomasz Kamiński <[email protected]> wrote:
> 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.
>
v2 only adjusted commit description to reflect that.
>
> 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
>
>