AK/Checked: Dont verify overflow bit in lvalue operations

Before, adding an overflow'n `Checked<T>` to another `Checked<T>` would
cause a verification faliure when instead it should propogate m_overflow
and allow the user to handle the overflow.
This commit is contained in:
Jess 2025-02-20 03:05:16 +13:00 committed by Sam Atkins
commit 88c4f71114
Notes: github-actions[bot] 2025-02-25 11:21:17 +00:00
2 changed files with 53 additions and 10 deletions

View file

@ -135,6 +135,49 @@ TEST_CASE(detects_unsigned_overflow)
EXPECT((Checked<u64>(0x4000000000000000) - Checked<u64>(0x4000000000000001)).has_overflow());
}
TEST_CASE(operations_with_overflowed)
{
{
Checked<u32> overflowed(0x100000000);
EXPECT((Checked<u32>(0x100000000) + Checked<u32>(0xff)).has_overflow());
EXPECT((Checked<u32>(0xff) + Checked<u32>(0x100000000)).has_overflow());
EXPECT((overflowed += Checked<u32>(0xff)).has_overflow());
EXPECT((overflowed += Checked<u32>(0x100000000)).has_overflow());
}
{
Checked<u32> overflowed(0x100000000);
EXPECT((Checked<u32>(0x100000000) - Checked<u32>(0xff)).has_overflow());
EXPECT((Checked<u32>(0xff) - Checked<u32>(0x100000000)).has_overflow());
EXPECT((overflowed -= Checked<u32>(0xff)).has_overflow());
EXPECT((overflowed -= Checked<u32>(0x100000000)).has_overflow());
}
{
Checked<u32> overflowed(0x100000000);
EXPECT((Checked<u32>(0x100000000) * Checked<u32>(0xff)).has_overflow());
EXPECT((Checked<u32>(0xff) * Checked<u32>(0x100000000)).has_overflow());
EXPECT((overflowed *= Checked<u32>(0xff)).has_overflow());
EXPECT((overflowed *= Checked<u32>(0x100000000)).has_overflow());
}
{
Checked<u32> overflowed(0x100000000);
EXPECT((Checked<u32>(0x100000000) / Checked<u32>(0xff)).has_overflow());
EXPECT((Checked<u32>(0xff) / Checked<u32>(0x100000000)).has_overflow());
EXPECT((overflowed /= Checked<u32>(0xff)).has_overflow());
EXPECT((overflowed /= Checked<u32>(0x100000000)).has_overflow());
}
{
Checked<u32> overflowed(0x100000000);
EXPECT((Checked<u32>(0x100000000) % Checked<u32>(0xff)).has_overflow());
EXPECT((Checked<u32>(0xff) % Checked<u32>(0x100000000)).has_overflow());
EXPECT((overflowed %= Checked<u32>(0xff)).has_overflow());
EXPECT((overflowed %= Checked<u32>(0x100000000)).has_overflow());
}
}
TEST_CASE(should_constexpr_default_construct)
{
constexpr Checked<int> checked_value {};