diff --git a/esphome/core/finite_set_mask.h b/esphome/core/finite_set_mask.h index a84ca17b40b..c8a48c2ea73 100644 --- a/esphome/core/finite_set_mask.h +++ b/esphome/core/finite_set_mask.h @@ -157,14 +157,19 @@ template(mask)); - } else { - return __builtin_ctzl(static_cast(mask)); } +#if defined(__GNUC__) || defined(__clang__) + int bit; + if constexpr (sizeof(bitmask_t) <= sizeof(unsigned int)) { + bit = __builtin_ctz(static_cast(mask)); + } else if constexpr (sizeof(bitmask_t) <= sizeof(uint32_t)) { + bit = __builtin_ctzl(static_cast(mask)); + } else { + bit = __builtin_ctzll(static_cast(mask)); + } + return bit < BitPolicy::MAX_BITS ? bit : BitPolicy::MAX_BITS; #else int bit = 0; while (bit < BitPolicy::MAX_BITS && !(mask & (static_cast(1) << bit))) {