diff --git a/lib/source/pl/lib/std/core.cpp b/lib/source/pl/lib/std/core.cpp index f3eb5f96..284f30f0 100644 --- a/lib/source/pl/lib/std/core.cpp +++ b/lib/source/pl/lib/std/core.cpp @@ -155,9 +155,21 @@ namespace pl::lib::libstd::core { runtime.addFunction(nsStdCore, "is_valid_enum", FunctionParameterCount::exactly(1), [](Evaluator *, auto params) -> std::optional { auto pattern = params[0].toPattern(); - if (auto enumPattern = dynamic_cast(pattern.get()); enumPattern != nullptr) { - auto value = enumPattern->getValue().toUnsigned(); - for (auto &[name, entry] : enumPattern->getEnumValues()) { + auto enumValues = [&] -> std::map const* { + if (auto enumPattern = dynamic_cast(pattern.get()); enumPattern != nullptr) { + return &enumPattern->getEnumValues(); + } + + if (auto bitfieldEnumPattern = dynamic_cast(pattern.get()); bitfieldEnumPattern != nullptr) { + return &bitfieldEnumPattern->getEnumValues(); + } + + return nullptr; + }(); + + if (enumValues != nullptr) { + auto value = pattern->getValue().toUnsigned(); + for (auto &[name, entry] : *enumValues) { auto min = entry.min.toUnsigned(); auto max = entry.max.toUnsigned(); diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index cb3c69ea..7ce4ffbd 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -159,6 +159,7 @@ namespace pl::test { std::assert(test.flag4 == false, "flag4 was invalid"); std::assert(test.flag5 == false, "flag5 was invalid"); std::assert(test.enumerated == Enum::A, "enumerated was invalid"); + std::assert(builtin::std::core::is_valid_enum(test.enumerated), "bitfield enum field must be a valid enum"); )"; } };