summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/numerics
diff options
context:
space:
mode:
authorZoe Carver <z.zoelec2@gmail.com>2019-08-20 15:43:25 +0000
committerZoe Carver <z.zoelec2@gmail.com>2019-08-20 15:43:25 +0000
commit6585f018ada85c53efeec28fb6b1d9c978c209f7 (patch)
treecf6e4790d3d16262e33749cf264a58636a90b184 /libcxx/test/std/numerics
parenta47ca1ea6d32d2d99d080ec850670c1de340c525 (diff)
downloadbcm5719-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.cpp32
-rw-r--r--libcxx/test/std/numerics/c.math/abs.pass.cpp65
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;
+}
+
OpenPOWER on IntegriCloud