https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102974
--- Comment #14 from cqwrteur <unlvsur at live dot com> ---
template<typename T>
inline constexpr T add_carry_no_carry_in(T a,T b,T& carryout) noexcept
{
T res{a+b};
carryout=res<a;
return res;
}
template<typename T>
inline constexpr T add_carry(T a,T b,T carryin,T& carryout) noexcept
{
assume(carryin==0||carryin==1);
a=add_carry_no_carry_in(carryin,a,carryout);
a=add_carry_no_carry_in(a,b,carryin);
carryout+=carryin;
assume(carryout==0||carryout==1);
return a;
}