diff options
| author | Zoe Carver <z.zoelec2@gmail.com> | 2019-08-20 15:43:25 +0000 |
|---|---|---|
| committer | Zoe Carver <z.zoelec2@gmail.com> | 2019-08-20 15:43:25 +0000 |
| commit | 6585f018ada85c53efeec28fb6b1d9c978c209f7 (patch) | |
| tree | cf6e4790d3d16262e33749cf264a58636a90b184 /libcxx/test/std/numerics | |
| parent | a47ca1ea6d32d2d99d080ec850670c1de340c525 (diff) | |
| download | bcm5719-llvm-6585f018ada85c53efeec28fb6b1d9c978c209f7.tar.gz bcm5719-llvm-6585f018ada85c53efeec28fb6b1d9c978c209f7.zip | |
[libc++] std::abs should not return double
Implement LWG Issue 2735 by adding std::abs
tests for several types and checking their
return value. NFC.
llvm-svn: 369394
Diffstat (limited to 'libcxx/test/std/numerics')
| -rw-r--r-- | libcxx/test/std/numerics/c.math/abs.fail.cpp | 32 | ||||
| -rw-r--r-- | libcxx/test/std/numerics/c.math/abs.pass.cpp | 65 |
2 files changed, 97 insertions, 0 deletions
diff --git a/libcxx/test/std/numerics/c.math/abs.fail.cpp b/libcxx/test/std/numerics/c.math/abs.fail.cpp new file mode 100644 index 00000000000..5b7c77d0b59 --- /dev/null +++ b/libcxx/test/std/numerics/c.math/abs.fail.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <cmath> + +#include "test_macros.h" + +int main(int, char**) +{ + unsigned int ui = -5; + ui = std::abs(ui); // expected-error {{call to 'abs' is ambiguous}} + + unsigned char uc = -5; + uc = std::abs(uc); // expected-error {{taking the absolute value of unsigned type 'unsigned char' has no effect}} + + unsigned short us = -5; + us = std::abs(us); // expected-error {{taking the absolute value of unsigned type 'unsigned short' has no effect}} + + unsigned long ul = -5; + ul = std::abs(ul); // expected-error {{call to 'abs' is ambiguous}} + + unsigned long long ull = -5; + ull = ::abs(ull); // expected-error {{call to 'abs' is ambiguous}} + + return 0; +} + diff --git a/libcxx/test/std/numerics/c.math/abs.pass.cpp b/libcxx/test/std/numerics/c.math/abs.pass.cpp new file mode 100644 index 00000000000..f0e4c57f8b6 --- /dev/null +++ b/libcxx/test/std/numerics/c.math/abs.pass.cpp @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <assert.h> +#include <cmath> +#include <cstdint> +#include <type_traits> + +#include "test_macros.h" + +template<class T> +struct correct_size_int +{ + typedef typename std::conditional<sizeof(T) <= sizeof(int), int, T>::type type; +}; + +template <class Source, class Result> +void test_abs() +{ + Source neg_val = -5; + Source pos_val = 5; + Result res = 5; + + ASSERT_SAME_TYPE(decltype(std::abs(neg_val)), Result); + + assert(std::abs(neg_val) == res); + assert(std::abs(pos_val) == res); +} + +void test_big() +{ + long long int big_value = std::numeric_limits<long long int>::max(); // a value to big for ints to store + long long int negative_big_value = -big_value; + assert(std::abs(negative_big_value) == big_value); // make sure it doesnt get casted to a smaller type +} + +int main(int, char**) +{ + test_abs<short int, typename correct_size_int<short int>::type>(); + test_abs<char, typename correct_size_int<char>::type>(); + test_abs<signed char, typename correct_size_int<signed char>::type>(); + + test_abs<int, typename correct_size_int<int>::type>(); + test_abs<long int, typename correct_size_int<long int>::type>(); + test_abs<long long int, typename correct_size_int<long long int>::type>(); + + test_abs<std::int8_t, typename correct_size_int<std::int8_t>::type>(); + test_abs<std::int16_t, typename correct_size_int<std::int16_t>::type>(); + test_abs<std::int32_t, typename correct_size_int<std::int32_t>::type>(); + test_abs<std::int64_t, typename correct_size_int<std::int64_t>::type>(); + + test_abs<long double, long double>(); + test_abs<double, double>(); + test_abs<float, float>(); + + test_big(); + + return 0; +} + |

