aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/include/c_global/cmath20
-rw-r--r--libstdc++-v3/testsuite/26_numerics/headers/cmath/117406.cc59
2 files changed, 69 insertions, 10 deletions
diff --git a/libstdc++-v3/include/c_global/cmath b/libstdc++-v3/include/c_global/cmath
index 5c568c7..09b4d0d 100644
--- a/libstdc++-v3/include/c_global/cmath
+++ b/libstdc++-v3/include/c_global/cmath
@@ -2838,7 +2838,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr int
ilogb(_Float16 __x)
- { return _Float16(__builtin_ilogbf(__x)); }
+ { return __builtin_ilogbf(__x); }
constexpr _Float16
lgamma(_Float16 __x)
@@ -2846,11 +2846,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr long long
llrint(_Float16 __x)
- { return _Float16(__builtin_llrintf(__x)); }
+ { return __builtin_llrintf(__x); }
constexpr long long
llround(_Float16 __x)
- { return _Float16(__builtin_llroundf(__x)); }
+ { return __builtin_llroundf(__x); }
constexpr _Float16
log1p(_Float16 __x)
@@ -2867,11 +2867,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr long
lrint(_Float16 __x)
- { return _Float16(__builtin_lrintf(__x)); }
+ { return __builtin_lrintf(__x); }
constexpr long
lround(_Float16 __x)
- { return _Float16(__builtin_lroundf(__x)); }
+ { return __builtin_lroundf(__x); }
constexpr _Float16
nearbyint(_Float16 __x)
@@ -3560,7 +3560,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr int
ilogb(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_ilogbf(__x)); }
+ { return __builtin_ilogbf(__x); }
constexpr __gnu_cxx::__bfloat16_t
lgamma(__gnu_cxx::__bfloat16_t __x)
@@ -3568,11 +3568,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr long long
llrint(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_llrintf(__x)); }
+ { return __builtin_llrintf(__x); }
constexpr long long
llround(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_llroundf(__x)); }
+ { return __builtin_llroundf(__x); }
constexpr __gnu_cxx::__bfloat16_t
log1p(__gnu_cxx::__bfloat16_t __x)
@@ -3589,11 +3589,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr long
lrint(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_lrintf(__x)); }
+ { return __builtin_lrintf(__x); }
constexpr long
lround(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_lroundf(__x)); }
+ { return __builtin_lroundf(__x); }
constexpr __gnu_cxx::__bfloat16_t
nearbyint(__gnu_cxx::__bfloat16_t __x)
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cmath/117406.cc b/libstdc++-v3/testsuite/26_numerics/headers/cmath/117406.cc
new file mode 100644
index 0000000..8966c71
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/headers/cmath/117406.cc
@@ -0,0 +1,59 @@
+// Copyright (C) 2024 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do run { target c++23 } }
+// { dg-require-cmath "" }
+
+#include <stdfloat>
+#include <cmath>
+#include <limits>
+#include <testsuite_hooks.h>
+
+template <typename T>
+void
+test ()
+{
+ using lim = std::numeric_limits<T>;
+ int t0 = std::ilogb(T(4.0));
+ VERIFY( t0 == 2 );
+ int t1 = std::ilogb(lim::infinity());
+ VERIFY( t1 == INT_MAX );
+ int t2 = std::ilogb(-lim::infinity());
+ VERIFY( t2 == INT_MAX );
+}
+
+int
+main ()
+{
+#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
+ test <std::float16_t>();
+#endif
+#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
+ test <std::float32_t>();
+#endif
+#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
+ test <std::float64_t>();
+#endif
+#if defined(__STDCPP_FLOAT128_T__) \
+ && (defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) \
+ || defined(_GLIBCXX_HAVE_FLOAT128_MATH))
+ test <std::float128_t>();
+#endif
+#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
+ test <std::bfloat16_t>();
+#endif
+}