[libcxx-commits] [libcxx] r369394 - [libc++] std::abs should not return double
Zoe Carver via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Aug 20 08:43:26 PDT 2019
Author: zoecarver
Date: Tue Aug 20 08:43:25 2019
New Revision: 369394
URL: http://llvm.org/viewvc/llvm-project?rev=369394&view=rev
Log:
[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.
Added:
libcxx/trunk/test/std/numerics/c.math/abs.fail.cpp
libcxx/trunk/test/std/numerics/c.math/abs.pass.cpp
Modified:
libcxx/trunk/www/cxx1z_status.html
Added: libcxx/trunk/test/std/numerics/c.math/abs.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/numerics/c.math/abs.fail.cpp?rev=369394&view=auto
==============================================================================
--- libcxx/trunk/test/std/numerics/c.math/abs.fail.cpp (added)
+++ libcxx/trunk/test/std/numerics/c.math/abs.fail.cpp Tue Aug 20 08:43:25 2019
@@ -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;
+}
+
Added: libcxx/trunk/test/std/numerics/c.math/abs.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/numerics/c.math/abs.pass.cpp?rev=369394&view=auto
==============================================================================
--- libcxx/trunk/test/std/numerics/c.math/abs.pass.cpp (added)
+++ libcxx/trunk/test/std/numerics/c.math/abs.pass.cpp Tue Aug 20 08:43:25 2019
@@ -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;
+}
+
Modified: libcxx/trunk/www/cxx1z_status.html
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1z_status.html?rev=369394&r1=369393&r2=369394&view=diff
==============================================================================
--- libcxx/trunk/www/cxx1z_status.html (original)
+++ libcxx/trunk/www/cxx1z_status.html Tue Aug 20 08:43:25 2019
@@ -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>
More information about the libcxx-commits
mailing list