[PATCH] libstdc++: Fix up all_pedantic_errors.cc [PR119739]

Jakub Jelinek jakub@redhat.com
Wed Dec 17 06:55:01 GMT 2025


On Tue, Dec 16, 2025 at 02:52:27PM -0500, Nathan Myers wrote:
> 	PR libstdc++/119739
> 	* include/bits/random.tcc: Add generate_canonical impl for C++26.
> 	* testsuite/26_numerics/random/uniform_real_distribution/operators/64351.cc:
> 	Adapt test for both pre- and post- C++26.
> 	* testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon.cc:
> 	Test for float and double from 32-bit RNG, including 1.0 do-over.

This breaks some tests.
On x86_64-linux
FAIL: 17_intro/headers/c++1998/all_pedantic_errors.cc  -std=gnu++17 (test for excess errors)
Excess errors:
/home/jakub/src/gcc/obj20/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/random.tcc:3681: error: ISO C++ does not support '__int128' for 'type name' [-Wpedantic]
/home/jakub/src/gcc/obj20/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/random.tcc:3698: error: ISO C++ does not support '__int128' for 'type name' [-Wpedantic]
for which I'm attaching patch below,
FAIL: std/ranges/adaptors/93978.cc  -std=gnu++20 (test for excess errors)
Excess errors:
/home/jakub/src/gcc/obj20/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/random.tcc:3664: warning: typedef 'using _Rng = decltype (_Urbg::max())' locally defined but not used [-Wunused-local-typedefs]
FAIL: std/ranges/adaptors/93978.cc  -std=gnu++26 (test for excess errors)
Excess errors:
/home/jakub/src/gcc/obj20/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/random.tcc:3664: warning: typedef 'using _Rng = decltype (_Urbg::max())' locally defined but not used [-Wunused-local-typedefs]
where that
      using _Rng = decltype(_Urbg::max());
indeed looks unused and it is unclear if you want to use
it somewhere or remove,
FAIL: 26_numerics/random/pr60037-neg.cc  -std=gnu++17  (test for errors, line 3480)
FAIL: 26_numerics/random/pr60037-neg.cc  -std=gnu++17 (test for excess errors)
Excess errors:
/home/jakub/src/gcc/obj20/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/random.tcc:3653: error: static assertion failed: template argument must be floating point
and on i686-linux tons of further FAILs like:
FAIL: 26_numerics/random/fisher_f_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
Excess errors:
/home/jakub/src/gcc/obj21/i686-pc-linux-gnu/libstdc++-v3/include/bits/random.tcc:3700: error: static assertion failed: irregular RNG with float precision >32 requires __int128 support
/home/jakub/src/gcc/obj21/i686-pc-linux-gnu/libstdc++-v3/include/bits/random.tcc:3705: warning: no return statement in function returning non-void [-Wreturn-type]
UNRESOLVED: 26_numerics/random/fisher_f_distribution/operators/serialize.cc  -std=gnu++17 compilation failed to produce executable
I think it is all of
FAIL: 20_util/is_function/91371.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/bernoulli_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/binomial_distribution/114359.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/binomial_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/cauchy_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/chi_squared_distribution/83833.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/chi_squared_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/discrete_distribution/operators/call-default.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/discrete_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/exponential_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/extreme_value_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/fisher_f_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/gamma_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/geometric_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/lognormal_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/negative_binomial_distribution/operators/58302.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/negative_binomial_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/normal_distribution/operators/equal.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/normal_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/piecewise_constant_distribution/operators/call-default.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/piecewise_constant_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/piecewise_linear_distribution/operators/call-default.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/piecewise_linear_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/poisson_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/pr60037-neg.cc  -std=gnu++17  (test for errors, line 3480)
FAIL: 26_numerics/random/pr60037-neg.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/student_t_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/uniform_real_distribution/operators/64351.cc  -std=gnu++17 execution test
FAIL: 26_numerics/random/uniform_real_distribution/operators/gencanon.cc  -std=gnu++17 execution test
FAIL: 26_numerics/random/uniform_real_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: 26_numerics/random/weibull_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/arcsine_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/beta_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/hoyt_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/hypergeometric_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/k_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/logistic_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/nakagami_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/normal_mv_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/pareto_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/rice_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/triangular_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/uniform_inside_sphere_distribution/operators/generate.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/uniform_inside_sphere_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/uniform_on_sphere_distribution/operators/generate.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/uniform_on_sphere_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
FAIL: ext/random/von_mises_distribution/operators/serialize.cc  -std=gnu++17 (test for excess errors)
Because we don't have unsigned _BitInt(128) in C++ right now, I'm afraid you
want some unsigned __int128 like class for #ifndef __SIZEOF_INT128__ which
will handle all the operations you need on a pair of unsigned long long.

Note, some time ago I was working on an int128 and uint128 for libgcobol,
https://gcc.gnu.org/bugzilla/attachment.cgi?id=61011 is the latest patch
(part of https://gcc.gnu.org/PR119595), it probably has far more than
you actually need and not the libstdc++-v3 formatting.

Anyway, here is just the quick __extension__ patch to fix up
all_pedantic_errors.cc.

Ok for trunk?

2025-12-17  Jakub Jelinek  <jakub@redhat.com>

	* include/bits/random.tcc (std::generate_canonical): Use
	__extension__ before __generate_canonical_{pow2,any} calls with
	unsigned __int128 template arguments.

--- libstdc++-v3/include/bits/random.tcc.jj	2025-12-16 22:26:28.485419458 +0100
+++ libstdc++-v3/include/bits/random.tcc	2025-12-17 07:25:12.633790536 +0100
@@ -3677,7 +3677,7 @@ namespace __detail
 	    {
 #if defined(__SIZEOF_INT128__)
 	      // Accommodate double double or float128.
-	      return __generate_canonical_pow2<
+	      return __extension__ __generate_canonical_pow2<
 		_RealT, unsigned __int128, __d>(__urng);
 #else
 	      static_assert(false,
@@ -3694,7 +3694,7 @@ namespace __detail
 #if defined(__SIZEOF_INT128__)
 	      static_assert(__d <= 64,
 		"irregular RNG with float precision >64 is not supported");
-	      return __generate_canonical_any<
+	      return __extension__ __generate_canonical_any<
 		_RealT, unsigned __int128, __d>(__urng);
 #else
 	      static_assert(false, "irregular RNG with float precision"


	Jakub



More information about the Libstdc++ mailing list