Files
TheRock/math-libs/libhipcxx/.upstream-tests/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.pass.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

126 lines
4.0 KiB
C++

//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// <numeric>
// template<class _M, class _N>
// constexpr common_type_t<_M,_N> gcd(_M __m, _N __n)
#include <cuda/std/cassert>
#include <cuda/std/climits>
#include <cuda/std/cstdint>
#include <cuda/std/numeric>
#include <cuda/std/type_traits>
#include "test_macros.h"
struct TestCase
{
int x;
int y;
int expect;
};
template <typename Input1, typename Input2, typename Output>
__host__ __device__ constexpr bool test0(int in1, int in2, int out)
{
auto value1 = static_cast<Input1>(in1);
auto value2 = static_cast<Input2>(in2);
static_assert(cuda::std::is_same<Output, decltype(cuda::std::gcd(value1, value2))>::value, "");
static_assert(cuda::std::is_same<Output, decltype(cuda::std::gcd(value2, value1))>::value, "");
assert(static_cast<Output>(out) == cuda::std::gcd(value1, value2));
return true;
}
template <typename Input1, typename Input2 = Input1>
__host__ __device__ constexpr void test()
{
using S1 = cuda::std::make_signed_t<Input1>;
using S2 = cuda::std::make_signed_t<Input2>;
using U1 = cuda::std::make_signed_t<Input1>;
using U2 = cuda::std::make_signed_t<Input2>;
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<S1, S2>;
accumulate &= test0<S1, S2, Output>(TC.x, TC.y, TC.expect);
accumulate &= test0<S1, S2, Output>(-TC.x, TC.y, TC.expect);
accumulate &= test0<S1, S2, Output>(TC.x, -TC.y, TC.expect);
accumulate &= test0<S1, S2, Output>(-TC.x, -TC.y, TC.expect);
accumulate &= test0<S2, S1, Output>(TC.x, TC.y, TC.expect);
accumulate &= test0<S2, S1, Output>(-TC.x, TC.y, TC.expect);
accumulate &= test0<S2, S1, Output>(TC.x, -TC.y, TC.expect);
accumulate &= test0<S2, S1, Output>(-TC.x, -TC.y, TC.expect);
}
{ // test with two unsigned types
using Output = cuda::std::common_type_t<U1, U2>;
accumulate &= test0<U1, U2, Output>(TC.x, TC.y, TC.expect);
accumulate &= test0<U2, U1, Output>(TC.x, TC.y, TC.expect);
}
{ // Test with mixed signs
using Output = cuda::std::common_type_t<S1, U2>;
accumulate &= test0<S1, U2, Output>(TC.x, TC.y, TC.expect);
accumulate &= test0<U2, S1, Output>(TC.x, TC.y, TC.expect);
accumulate &= test0<S1, U2, Output>(-TC.x, TC.y, TC.expect);
accumulate &= test0<U2, S1, Output>(TC.x, -TC.y, TC.expect);
}
{ // Test with mixed signs
using Output = cuda::std::common_type_t<S2, U1>;
accumulate &= test0<S2, U1, Output>(TC.x, TC.y, TC.expect);
accumulate &= test0<U1, S2, Output>(TC.x, TC.y, TC.expect);
accumulate &= test0<S2, U1, Output>(-TC.x, TC.y, TC.expect);
accumulate &= test0<U1, S2, Output>(TC.x, -TC.y, TC.expect);
}
}
assert(accumulate);
}
__host__ __device__ constexpr bool test()
{
test<signed char>();
test<short>();
test<int>();
test<long>();
test<long long>();
test<cuda::std::int8_t>();
test<cuda::std::int16_t>();
test<cuda::std::int32_t>();
test<cuda::std::int64_t>();
test<signed char, int>();
test<int, signed char>();
test<short, int>();
test<int, short>();
test<int, long>();
test<long, int>();
test<int, long long>();
test<long long, int>();
return true;
}
int main(int argc, char**)
{
test();
static_assert(test(), "");
// LWG#2837
{
auto res = cuda::std::gcd(static_cast<cuda::std::int64_t>(1234), INT32_MIN);
static_assert(cuda::std::is_same<decltype(res), cuda::std::int64_t>::value, "");
assert(res == 2);
}
return 0;
}