//===----------------------------------------------------------------------===// // // 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 #include #include #include #include #include "test_macros.h" template struct correct_size_int { typedef typename std::conditional::type type; }; template 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::max(); // a value too big for ints to store long long int negative_big_value = -big_value; assert(std::abs(negative_big_value) == big_value); // make sure it doesn't get casted to a smaller type } // The following is helpful to keep in mind: // 1byte == char <= short <= int <= long <= long long int main(int, char**) { // On some systems char is unsigned. // If that is the case, we should just test signed char twice. typedef std::conditional< std::is_signed::value, char, signed char >::type SignedChar; // All types less than or equal to and not greater than int are promoted to int. test_abs(); test_abs(); test_abs(); // These three calls have specific overloads: test_abs(); test_abs(); test_abs(); // Here there is no guarantee that int is larger than int8_t so we // use a helper type trait to conditional test against int. test_abs::type>(); test_abs::type>(); test_abs::type>(); test_abs::type>(); test_abs(); test_abs(); test_abs(); test_big(); return 0; }