diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 5a5f4b2..955aec2 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -434,12 +434,31 @@ constexpr auto values(std::index_sequence) noexcept { return values; } +template > +inline static constexpr void detect_values_out_of_range() +{ + constexpr auto min = reflected_min_v; + constexpr auto max = reflected_max_v; + constexpr auto range_size = max - min + 1; + + if constexpr (cmp_less((std::numeric_limits::min)(), min) && !IsFlags) + { + static_assert(!is_valid(0)>(), "magic_enum detects enum value smaller than min range size"); + } + + if constexpr (cmp_less(range_size, (std::numeric_limits::max)()) && !IsFlags) + { + static_assert(!is_valid(range_size + 1)>(), "magic_enum detects enum value larger than max range size"); + } +} + template > constexpr auto values() noexcept { static_assert(is_enum_v, "magic_enum::detail::values requires enum type."); constexpr auto range_size = reflected_max_v - reflected_min_v + 1; static_assert(range_size > 0, "magic_enum::enum_range requires valid size."); static_assert(range_size < (std::numeric_limits::max)(), "magic_enum::enum_range requires valid size."); + detect_values_out_of_range(); return values>(std::make_index_sequence{}); }