On Wed, Dec 17, 2025 at 9:23 AM Nathan Myers <[email protected]> wrote:

> On 12/17/25 2:06 AM, Tomasz Kamiński wrote:
> > The r16-6177-g866bc8a9214b1d introduced type-constraint on _Urbg template
> > parameter in __glibcxx_concepts, which make the mangled inconsistient.
> > This lead to the missing symbol errors in tests, from
> > __gnu_cxx::random_condition::throw_conditionally.
>
> TIL that changing a typename parameter to a concept-constrained type
> changes the mangled name.
>
Yes, this applies to all constraints, not only constrained parameters:
template<typename T> requires C1<T> void foo();
template<typename T> requires C2<T> void foo();
If we do not not include C, foo<X> would be ambiguous.
>
>
> Thank you for solving this.
>
> The last line below can be simplified, as uniform_random_bit_generator
> forbids _Urbg::min() <= _Urbg::max().
>
We do not check that pre-C++11, and I am fine with having duplicate check.

>
> > libstdc++-v3/ChangeLog:
> >
> >       * include/bits/random.tcc (generate_canonical)
> >       [!_GLIBCXX_USE_OLD_GENERATE_CANONICAL]: Use static_assert
> >       instead of type-constraint on template parameter.
> > ---
> > I have not yet determined what is causing pre-C++20 version of
> > __gnu_cxx::random_condition::throw_conditionally to be linked against
> > post-C++20 version. I am concerned about it, because if we call
> > generate_canonical from libstdc++ shared library, then
> _GLIBCXX_USE_OLD_GENERATE_CANONICAL
> > flag will not properly restore old behavior. Posting anyway to
> > aknowledge the issue.
> >
> >
> >   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..29d50d553e2 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<_Ubrg>);
> > +#endif
> >         static_assert(__is_rand_dist_float_v<_RealT>,
> >       "template argument must be floating point");
> >         static_assert(__digits != 0 && _Urbg::max() > _Urbg::min(),
>
>

Reply via email to