]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Support std::abs for 128-bit integers and floats [PR96710]
authorJonathan Wakely <jwakely@redhat.com>
Fri, 16 May 2025 12:05:51 +0000 (13:05 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 27 May 2025 11:11:43 +0000 (12:11 +0100)
Currently we only provide std::abs(__int128) and std::abs(__float128)
for non-strict modes, i.e. -std=gnu++NN but not -std=c++NN.

This defines those overloads for strict modes too, as a small step
towards resolving PR 96710 (which will eventually mean that __int128
satisfies the std::integral concept).

libstdc++-v3/ChangeLog:

PR libstdc++/96710
* include/bits/std_abs.h [__SIZEOF_INT128__] (abs(__int128)):
Define.
[_GLIBCXX_USE_FLOAT128] (abs(__float128)): Enable definition for
strict modes.
* testsuite/26_numerics/headers/cmath/82644.cc: Use strict_std
instead of defining __STRICT_ANSI__.
* testsuite/26_numerics/headers/cstdlib/abs128.cc: New test.

Reviewed-by: Tomasz KamiƄski <tkaminsk@redhat.com>
libstdc++-v3/include/bits/std_abs.h
libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc
libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc [new file with mode: 0644]

index 35ec4d374b6e4dc6b595828b2b8c6d3535d177af..3d805e6d6f04b25e688005d0a71885f469545305 100644 (file)
@@ -103,6 +103,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
 #endif
 
+#if defined __STRICT_ANSI__ && defined __SIZEOF_INT128__
+  // In strict modes __GLIBCXX_TYPE_INT_N_0 is not defined for __int128,
+  // but we want to always define std::abs(__int128).
+  __extension__ inline _GLIBCXX_CONSTEXPR __int128
+  abs(__int128 __x) { return __x >= 0 ? __x : -__x; }
+#endif
+
 #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
   constexpr _Float16
   abs(_Float16 __x)
@@ -137,7 +144,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   { return __gnu_cxx::__bfloat16_t(__builtin_fabsf(__x)); }
 #endif
 
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if defined(_GLIBCXX_USE_FLOAT128)
   __extension__ inline _GLIBCXX_CONSTEXPR
   __float128
   abs(__float128 __x)
index 3274f0564c4d0f6eec6289a9de1d91fc5243c82e..40abb2ced6684312ba66fd6f211324d7b6f94d20 100644 (file)
@@ -15,8 +15,9 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-options "-D__STDCPP_WANT_MATH_SPEC_FUNCS__ -D__STRICT_ANSI__" }
+// { dg-options "-D__STDCPP_WANT_MATH_SPEC_FUNCS__" }
 // { dg-do compile { target c++11 } }
+// // { dg-add-options strict_std }
 
 #define conf_hyperg 1
 #define conf_hypergf 2
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc
new file mode 100644 (file)
index 0000000..cfb0562
--- /dev/null
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-add-options strict_std }
+
+#include <cstdlib>
+
+template<typename T> T same_type(T, T) { return T(); }
+
+#ifdef __SIZEOF_INT128__
+__int128 i = 0;
+__int128 j = same_type(std::abs(i), i);
+#endif
+
+#ifdef __SIZEOF_FLOAT128__
+__float128 f = 0.0;
+__float128 g = same_type(std::abs(f), f);
+#endif