summaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/26_numerics/lcm/105844.cc
blob: d0e032e03e0005c873a68f2c9d575b9af968e190 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// { dg-do compile { target c++17 } }
#include <numeric>
#include <climits>

// PR libstdc++/105844

// |INT_MIN| can be represented in common_type_t<int, unsigned> i.e. unsigned.
static_assert( std::lcm(INT_MIN, 1u) == INT_MAX+1u );
static_assert( std::lcm(1u, INT_MIN) == INT_MAX+1u );

// But |INT_MIN| cannot be represented in common_type<int, int> i.e. int.
constexpr int a = std::lcm(INT_MIN, 1); // { dg-error "overflow" }
constexpr int b = std::lcm(1, INT_MIN); // { dg-error "overflow" }

// And the LCM of 50000 and 49999 cannot be represented in int.
constexpr int c = std::lcm(50000, 49999); // { dg-error "overflow" }
constexpr int d = std::lcm(49999, 50000); // { dg-error "overflow" }

// Similarly for unsigned, but the diagnostic is a failed assertion instead.
constexpr int e = std::lcm(500000u, 499999); // { dg-error "in 'constexpr'" }
constexpr int f = std::lcm(499999u, 500000); // { dg-error "in 'constexpr'" }
// { dg-error "unreachable" "" { target *-*-* } 0 }