[libcxx-commits] [PATCH] D57778: std::abs should not return double (2735)

Zoe Carver via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Wed Feb 6 12:44:25 PST 2019


zoecarver updated this revision to Diff 185619.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57778/new/

https://reviews.llvm.org/D57778

Files:
  test/std/numerics/c.math/abs.fail.cpp
  test/std/numerics/c.math/abs.pass.cpp


Index: test/std/numerics/c.math/abs.pass.cpp
===================================================================
--- /dev/null
+++ test/std/numerics/c.math/abs.pass.cpp
@@ -0,0 +1,64 @@
+//===----------------------------------------------------------------------===//
+//
+// 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"
+
+#ifndef _LIBCPP_VERSION
+#error _LIBCPP_VERSION not defined
+#endif
+
+template <class T, class R>
+void test_abs()
+{
+    T neg_val = -5;
+    T pos_val = 5;
+    R res = 5;
+    
+    ASSERT_SAME_TYPE(decltype(std::abs(neg_val)), R);
+                     
+    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, int>();
+    test_abs<char, int>();
+    test_abs<signed char, int>();
+    if (std::is_signed<char>::value) test_abs<char, int>(); // sometimes chars are unsigned
+    
+    test_abs<int, int>();
+    test_abs<long int, long int>();
+    test_abs<long long int, long long int>();
+    
+    test_abs<std::int8_t, int>();
+    test_abs<std::int16_t, int>();
+    test_abs<std::int32_t, int>();
+    test_abs<std::int64_t, long long>();
+    
+    test_abs<long double, long double>();
+    test_abs<double, double>();
+    test_abs<float, float>();
+    
+    test_big();
+    
+    return 0;
+}
+
Index: test/std/numerics/c.math/abs.fail.cpp
===================================================================
--- /dev/null
+++ test/std/numerics/c.math/abs.fail.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// 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"
+
+#ifndef _LIBCPP_VERSION
+#error _LIBCPP_VERSION not defined
+#endif
+
+int main(int, char**)
+{
+    unsigned int ui = -5;
+    std::abs(ui); // expected-error {{call to 'abs' is ambiguous}}
+    
+    return 0;
+}
+


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57778.185619.patch
Type: text/x-patch
Size: 2795 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20190206/04172fc3/attachment.bin>


More information about the libcxx-commits mailing list