https://gcc.gnu.org/g:837c21e1aab850126e91eee9b8944aa2baca9ad5
commit r16-6205-g837c21e1aab850126e91eee9b8944aa2baca9ad5 Author: Tomasz Kamiński <[email protected]> Date: Wed Dec 17 10:32:54 2025 +0100 libstdc++: Make declaration and definition of generate_canonical consistent. 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. * testsuite/26_numerics/random/pr60037-neg.cc: Updated line of error. Reviewed-by: Jonathan Wakely <[email protected]> Signed-off-by: Tomasz Kamiński <[email protected]> Diff: --- libstdc++-v3/include/bits/random.tcc | 11 ++++------- libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc | 3 ++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc index 3c5288c2eab8..053307519b4b 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 a floating point type"); static_assert(__digits != 0 && _Urbg::max() > _Urbg::min(), diff --git a/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc b/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc index 06d659aae94f..13c4dc8724a4 100644 --- a/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc +++ b/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc @@ -12,4 +12,5 @@ auto x = std::generate_canonical<std::size_t, // { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 271 } -// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3653 } +// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3650 } +
