Am Sa., 29. Aug. 2020 um 00:12 Uhr schrieb Jonathan Wakely via Libstdc++ <libstd...@gcc.gnu.org>: > > This fixes a bug with mixed signed and unsigned types, where converting > a negative value to the unsigned result type alters the value. The > solution is to obtain the absolute values of the arguments immediately > and to perform the actual GCD or LCM algorithm on two arguments of the > same type. > > In order to operate on the most negative number without overflow when > taking its absolute, use an unsigned type for the result of the abs > operation. For example, -INT_MIN will overflow, but -(unsigned)INT_MIN > is (unsigned)INT_MAX+1U which is the correct value. > > libstdc++-v3/ChangeLog: > > PR libstdc++/92978 > * include/std/numeric (__abs_integral): Replace with ... > (__detail::__absu): New function template that returns an > unsigned type, guaranteeing it can represent the most > negative signed value. > (__detail::__gcd, __detail::__lcm): Require arguments to > be unsigned and therefore already non-negative. > (gcd, lcm): Convert arguments to absolute value as unsigned > type before calling __detail::__gcd or __detail::__lcm. > * include/experimental/numeric (gcd, lcm): Likewise. > * testsuite/26_numerics/gcd/gcd_neg.cc: Adjust expected > errors. > * testsuite/26_numerics/lcm/lcm_neg.cc: Likewise. > * testsuite/26_numerics/gcd/92978.cc: New test. > * testsuite/26_numerics/lcm/92978.cc: New test. > * testsuite/experimental/numeric/92978.cc: New test. > > Tested powerpc64le-linux. Committed to trunk.
Shouldn't the overload of __absu void __absu(bool) = delete; still also be a template or is just the diff presentation confusing me? Thanks, - Daniel