//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // // template // constexpr common_type_t<_M,_N> gcd(_M __m, _N __n) #include #include #include #include #include #include "test_macros.h" struct TestCase { int x; int y; int expect; }; template __host__ __device__ constexpr bool test0(int in1, int in2, int out) { auto value1 = static_cast(in1); auto value2 = static_cast(in2); static_assert(cuda::std::is_same::value, ""); static_assert(cuda::std::is_same::value, ""); assert(static_cast(out) == cuda::std::gcd(value1, value2)); return true; } template __host__ __device__ constexpr void test() { using S1 = cuda::std::make_signed_t; using S2 = cuda::std::make_signed_t; using U1 = cuda::std::make_signed_t; using U2 = cuda::std::make_signed_t; bool accumulate = true; constexpr TestCase Cases[] = { {0, 0, 0}, {1, 0, 1}, {0, 1, 1}, {1, 1, 1}, {2, 3, 1}, {2, 4, 2}, {36, 17, 1}, {36, 18, 18}}; for (auto TC : Cases) { { // Test with two signed types using Output = cuda::std::common_type_t; accumulate &= test0(TC.x, TC.y, TC.expect); accumulate &= test0(-TC.x, TC.y, TC.expect); accumulate &= test0(TC.x, -TC.y, TC.expect); accumulate &= test0(-TC.x, -TC.y, TC.expect); accumulate &= test0(TC.x, TC.y, TC.expect); accumulate &= test0(-TC.x, TC.y, TC.expect); accumulate &= test0(TC.x, -TC.y, TC.expect); accumulate &= test0(-TC.x, -TC.y, TC.expect); } { // test with two unsigned types using Output = cuda::std::common_type_t; accumulate &= test0(TC.x, TC.y, TC.expect); accumulate &= test0(TC.x, TC.y, TC.expect); } { // Test with mixed signs using Output = cuda::std::common_type_t; accumulate &= test0(TC.x, TC.y, TC.expect); accumulate &= test0(TC.x, TC.y, TC.expect); accumulate &= test0(-TC.x, TC.y, TC.expect); accumulate &= test0(TC.x, -TC.y, TC.expect); } { // Test with mixed signs using Output = cuda::std::common_type_t; accumulate &= test0(TC.x, TC.y, TC.expect); accumulate &= test0(TC.x, TC.y, TC.expect); accumulate &= test0(-TC.x, TC.y, TC.expect); accumulate &= test0(TC.x, -TC.y, TC.expect); } } assert(accumulate); } __host__ __device__ constexpr bool test() { test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); return true; } int main(int argc, char**) { test(); static_assert(test(), ""); // LWG#2837 { auto res = cuda::std::gcd(static_cast(1234), INT32_MIN); static_assert(cuda::std::is_same::value, ""); assert(res == 2); } return 0; }