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 }
+

Reply via email to