.maxCoeff no longer works on dynamic bool arrays

Summary

Environment

  • Operating System : Linux
  • Architecture : x86_64
  • Eigen Version : 5.0.0
  • Compiler Version : GCC 15.2.1
  • Compile Flags : (none)
  • Vector Extension : (none)

Minimal Example

The following code used to compile with Eigen 3.4.0:

#include <Eigen/Core>

int main()
{
    Eigen::Array<bool, Eigen::Dynamic, 1> a = Eigen::Array<bool, 1, 1>{true};
    Eigen::Index i;
    a.maxCoeff(&i);
}

However, with Eigen 5.0.0 the code results in the following compile error:

In file included from /home/sergiu/Projects/eigen/Eigen/Core:195,
                 from /home/sergiu/Projects/eigen5-bool-find.cpp:1:
/home/sergiu/Projects/eigen/Eigen/src/Core/GenericPacketMath.h: In instantiation of ‘Packet Eigen::internal::pcmp_lt(const Packet&, const Packet&) [with Packet = eigen_packet_wrapper<__vector(2) long long int, 1>]’:
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:27:19:   required from ‘Packet Eigen::internal::max_coeff_functor<Scalar, NaNPropagation, IsInteger>::comparePacket(const Packet&, const Packet&) const [with Packet = Eigen::internal::eigen_packet_wrapper<__vector(2) long long int, 1>; Scalar = bool; int NaNPropagation = 0; bool IsInteger = true]
   27 |     return pcmp_lt(incumbent, candidate);
      |            ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:243:40:   required from ‘static void Eigen::internal::find_coeff_loop<Evaluator, Func, true, true>::run(const Evaluator&, Func&, Scalar&, Eigen::Index&) [with Evaluator = Eigen::internal::find_coeff_evaluator<Eigen::Array<bool, -1, 1> >; Func = Eigen::internal::max_coeff_functor<bool, 0, true>; Scalar = bool; Eigen::Index = long int]’
  243 |       if (predux_any(func.comparePacket(resultPacket, xprPacket))) {
      |                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:341:14:   required from ‘static void Eigen::internal::find_coeff_impl<Derived, Func>::run(const Derived&, Func&, Scalar&, Eigen::Index&) [with Derived = Eigen::Array<bool, -1, 1>; Func = Eigen::internal::max_coeff_functor<bool, 0, true>; Scalar = bool; Eigen::Index = long int]’
  341 |     Loop::run(eval, func, res, index);
      |     ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:369:21:   required from ‘typename Eigen::internal::traits<T>::Scalar Eigen::internal::findCoeff(const Eigen::DenseBase<Derived>&, Func&, IndexType*) [with Derived = Eigen::Array<bool, -1, 1>; IndexType = long int; Func = max_coeff_functor<bool, 0, true>; typename traits<T>::Scalar = bool]’
  369 |   FindCoeffImpl::run(mat.derived(), func, res, index);
      |   ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:459:29:   required from ‘typename Eigen::internal::traits<T>::Scalar Eigen::DenseBase<Derived>::maxCoeff(IndexType*) const [with int NaNPropagation = 0; IndexType = long int; Derived = Eigen::Array<bool, -1, 1>; typename Eigen::internal::traits<T>::Scalar = bool]’
  459 |   return internal::findCoeff(derived(), func, indexPtr);
      |          ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/DenseBase.h:467:35:   required from ‘typename Eigen::internal::traits<T>::Scalar Eigen::DenseBase<Derived>::maxCoeff(IndexType*) const [with IndexType = long int; Derived = Eigen::Array<bool, -1, 1>; typename Eigen::internal::traits<T>::Scalar = bool]’
  467 |     return maxCoeff<PropagateFast>(index);
      |            ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
/home/sergiu/Projects/eigen5-bool-find.cpp:7:15:   required from here
    7 |     a.maxCoeff(&i);
      |     ~~~~~~~~~~^~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/GenericPacketMath.h:444:12: error: no match for ‘operator<’ (operand types are ‘const Eigen::internal::eigen_packet_wrapper<__vector(2) long long int, 1>’ and ‘const Eigen::internal::eigen_packet_wrapper<__vector(2) long long int, 1>’)
  444 |   return a < b ? ptrue(a) : pzero(a);
      |          ~~^~~

Bisecting points to commit 2e9b945b as the cause.