Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

[libc++] Move std::abs into __math/abs.h #139586

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
Loading
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions 24 libcxx/include/__math/abs.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,30 @@ template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
return __builtin_fabs((double)__x);
}

// abs

[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI inline float abs(float __x) _NOEXCEPT { return __builtin_fabsf(__x); }
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI inline double abs(double __x) _NOEXCEPT { return __builtin_fabs(__x); }

[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI inline long double abs(long double __x) _NOEXCEPT {
return __builtin_fabsl(__x);
}

template <class = int>
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI inline int abs(int __x) _NOEXCEPT {
return __builtin_abs(__x);
}

template <class = int>
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI inline long abs(long __x) _NOEXCEPT {
return __builtin_labs(__x);
}

template <class = int>
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI inline long long abs(long long __x) _NOEXCEPT {
return __builtin_llabs(__x);
}

} // namespace __math

_LIBCPP_END_NAMESPACE_STD
Expand Down
11 changes: 1 addition & 10 deletions 11 libcxx/include/math.h
Original file line number Diff line number Diff line change
Expand Up @@ -378,9 +378,7 @@ extern "C++" {
# include <__math/traits.h>
# include <__math/trigonometric_functions.h>
# include <__type_traits/enable_if.h>
# include <__type_traits/is_floating_point.h>
# include <__type_traits/is_integral.h>
# include <stdlib.h>

// fpclassify relies on implementation-defined constants, so we can't move it to a detail header
_LIBCPP_BEGIN_NAMESPACE_STD
Expand Down Expand Up @@ -431,19 +429,12 @@ using std::__math::isnormal;
using std::__math::isunordered;
# endif // _LIBCPP_MSVCRT

// abs
//
// handled in stdlib.h

// div
//
// handled in stdlib.h

// We have to provide double overloads for <math.h> to work on platforms that don't provide the full set of math
// functions. To make the overload set work with multiple functions that take the same arguments, we make our overloads
// templates. Functions are preferred over function templates during overload resolution, which means that our overload
// will only be selected when the C library doesn't provide one.

using std::__math::abs;
using std::__math::acos;
using std::__math::acosh;
using std::__math::asin;
Expand Down
19 changes: 2 additions & 17 deletions 19 libcxx/include/stdlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,23 +106,8 @@ extern "C++" {
# undef llabs
# endif

// MSVCRT already has the correct prototype in <stdlib.h> if __cplusplus is defined
# if !defined(_LIBCPP_MSVCRT)
[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long abs(long __x) _NOEXCEPT { return __builtin_labs(__x); }
[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long long abs(long long __x) _NOEXCEPT { return __builtin_llabs(__x); }
# endif // !defined(_LIBCPP_MSVCRT)

[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI float abs(float __lcpp_x) _NOEXCEPT {
return __builtin_fabsf(__lcpp_x); // Use builtins to prevent needing math.h
}

[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI double abs(double __lcpp_x) _NOEXCEPT {
return __builtin_fabs(__lcpp_x);
}

[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long double abs(long double __lcpp_x) _NOEXCEPT {
return __builtin_fabsl(__lcpp_x);
}
# include <__math/abs.h>
using std::__math::abs;

// div

Expand Down
4 changes: 2 additions & 2 deletions 4 libcxx/test/std/numerics/c.math/abs.verify.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ void f() {
(void)std::abs(ui); // expected-error {{call to 'abs' is ambiguous}}

unsigned char uc = -5;
(void)std::abs(uc); // expected-warning {{taking the absolute value of unsigned type 'unsigned char' has no effect}}
(void)std::abs(uc); // expected-warning 0-1 {{taking the absolute value of unsigned type 'unsigned char' has no effect}}

unsigned short us = -5;
(void)std::abs(us); // expected-warning {{taking the absolute value of unsigned type 'unsigned short' has no effect}}
(void)std::abs(us); // expected-warning 0-1 {{taking the absolute value of unsigned type 'unsigned short' has no effect}}

unsigned long ul = -5;
(void)std::abs(ul); // expected-error {{call to 'abs' is ambiguous}}
Expand Down
Loading
Morty Proxy This is a proxified and sanitized view of the page, visit original site.