https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102974
--- Comment #15 from cqwrteur <unlvsur at live dot com> --- template<::std::unsigned_integral 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<::std::unsigned_integral 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; }