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 | |
| 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')
| -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 | ||||
| -rw-r--r-- | libcxx/www/cxx1z_status.html | 2 | 
3 files changed, 98 insertions, 1 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; +} + diff --git a/libcxx/www/cxx1z_status.html b/libcxx/www/cxx1z_status.html index 100d1592730..d9b5562682b 100644 --- a/libcxx/www/cxx1z_status.html +++ b/libcxx/www/cxx1z_status.html @@ -415,7 +415,7 @@  	<tr><td><a href="https://wg21.link/LWG2729">2729</a></td><td>Missing SFINAE on std::pair::operator=</td><td>Issaquah</td><td></td></tr>  	<tr><td><a href="https://wg21.link/LWG2732">2732</a></td><td>Questionable specification of path::operator/= and path::append</td><td>Issaquah</td><td>Complete</td></tr>  	<tr><td><a href="https://wg21.link/LWG2733">2733</a></td><td>[fund.ts.v2] gcd / lcm and bool</td><td>Issaquah</td><td>Complete</td></tr> -	<tr><td><a href="https://wg21.link/LWG2735">2735</a></td><td>std::abs(short), std::abs(signed char) and others should return int instead of double in order to be compatible with C++98 and C</td><td>Issaquah</td><td></td></tr> +	<tr><td><a href="https://wg21.link/LWG2735">2735</a></td><td>std::abs(short), std::abs(signed char) and others should return int instead of double in order to be compatible with C++98 and C</td><td>Issaquah</td><td>Complete</td></tr>  	<tr><td><a href="https://wg21.link/LWG2736">2736</a></td><td>nullopt_t insufficiently constrained</td><td>Issaquah</td><td>Complete</td></tr>  	<tr><td><a href="https://wg21.link/LWG2738">2738</a></td><td>is_constructible with void types</td><td>Issaquah</td><td>Complete</td></tr>  	<tr><td><a href="https://wg21.link/LWG2739">2739</a></td><td>Issue with time_point non-member subtraction with an unsigned duration</td><td>Issaquah</td><td>Complete</td></tr>  | 

