diff --git a/AK/Checked.h b/AK/Checked.h index 13090e6b1a..84aea2c3df 100644 --- a/AK/Checked.h +++ b/AK/Checked.h @@ -34,7 +34,7 @@ namespace AK { -template= sizeof(Source)), bool destination_is_signed = NumericLimits::is_signed(), bool source_is_signed = NumericLimits::is_signed()> +template::max() >= NumericLimits::max()), bool destination_is_signed = NumericLimits::is_signed(), bool source_is_signed = NumericLimits::is_signed()> struct TypeBoundsChecker; template @@ -98,7 +98,7 @@ template struct TypeBoundsChecker { static constexpr bool is_within_range(Source value) { - if (sizeof(Destination) > sizeof(Source)) + if (NumericLimits::max() > NumericLimits::max()) return true; return value <= static_cast(NumericLimits::max()); } diff --git a/Tests/AK/TestChecked.cpp b/Tests/AK/TestChecked.cpp index 452b1eb46e..34562a2ac2 100644 --- a/Tests/AK/TestChecked.cpp +++ b/Tests/AK/TestChecked.cpp @@ -445,3 +445,20 @@ TEST_CASE(should_constexpr_make_via_factory) { [[maybe_unused]] constexpr auto value = make_checked(42); } + +TEST_CASE(is_within_range_float_to_int) +{ + static_assert(AK::is_within_range(0.0)); + static_assert(AK::is_within_range(0.0f)); + static_assert(AK::is_within_range(((long double)0.0))); + + static_assert(!AK::is_within_range(NumericLimits::max())); + static_assert(!AK::is_within_range(NumericLimits::max())); + static_assert(!AK::is_within_range(NumericLimits::max())); + static_assert(!AK::is_within_range(NumericLimits::lowest())); + + static_assert(AK::is_within_range(0.0)); + static_assert(AK::is_within_range(0.0)); + + static_assert(!AK::is_within_range(NAN)); +}