c++20 compilation failure
Using a late GCC-10 snapshot, the following example compiles under -std=c++17 but fails with -std=c++2a:
#include <eigen/Eigen/Eigen>
#include <eigen/Eigen/SVD>
int main()
{
int n = 10;
Eigen::VectorXd a(n);
Eigen::MatrixXd b(n,4);
Eigen::Vector4d c = b.bdcSvd().solve(a);
return 0;
}
The output of compilation is:
In file included from dependencies/eigen/Eigen/SVD:38,
from dependencies/eigen/Eigen/Dense:5,
from dependencies/eigen/Eigen/Eigen:1,
from file.cpp:1:
dependencies/eigen/Eigen/src/SVD/BDCSVD.h: In instantiation of ‘void Eigen::BDCSVD<MatrixType>::structured_update(Eigen::Block<Eigen::Matrix<typename Eigen::NumTraits<typename Xpr::Scalar>::Real, -1, -1, 0>, -1, -1>, const MatrixXr&, Eigen::Index) [with _MatrixType = Eigen::Matrix<double, -1, -1>; typename Eigen::NumTraits<typename Xpr::Scalar>::Real = double; Eigen::BDCSVD<MatrixType>::MatrixXr = Eigen::Matrix<double, -1, -1>; Eigen::Index = long int]’:
dependencies/eigen/Eigen/src/SVD/BDCSVD.h:548:5: required from ‘void Eigen::BDCSVD<MatrixType>::divide(Eigen::Index, Eigen::Index, Eigen::Index, Eigen::Index, Eigen::Index) [with _MatrixType = Eigen::Matrix<double, -1, -1>; Eigen::Index = long int]’
dependencies/eigen/Eigen/src/SVD/BDCSVD.h:284:3: required from ‘Eigen::BDCSVD<_MatrixType>& Eigen::BDCSVD<MatrixType>::compute(const MatrixType&, unsigned int) [with _MatrixType = Eigen::Matrix<double, -1, -1>; Eigen::BDCSVD<MatrixType>::MatrixType = Eigen::Matrix<double, -1, -1>]’
dependencies/eigen/Eigen/src/SVD/BDCSVD.h:143:12: required from ‘Eigen::BDCSVD<MatrixType>::BDCSVD(const MatrixType&, unsigned int) [with _MatrixType = Eigen::Matrix<double, -1, -1>; Eigen::BDCSVD<MatrixType>::MatrixType = Eigen::Matrix<double, -1, -1>]’
dependencies/eigen/Eigen/src/SVD/BDCSVD.h:1344:10: required from ‘Eigen::BDCSVD<typename Eigen::DenseBase<Derived>::PlainObject> Eigen::MatrixBase<Derived>::bdcSvd(unsigned int) const [with Derived = Eigen::Matrix<double, -1, -1>; typename Eigen::DenseBase<Derived>::PlainObject = Eigen::Matrix<double, -1, -1>]’
file.cpp:8:34: required from here
dependencies/eigen/Eigen/src/SVD/BDCSVD.h:361:37: error: return type of ‘const RCmpEQReturnType Eigen::operator==(const Scalar&, const Eigen::ArrayWrapper<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, -1, false>, -1, 1, true>, -1, 1, false> >&)’ is not ‘bool’
361 | if( (A.col(j).head(n1).array()!=Literal(0)).any() )
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
dependencies/eigen/Eigen/src/SVD/BDCSVD.h:361:37: note: used as rewritten candidate for comparison of ‘Eigen::ArrayWrapper<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, -1, false>, -1, 1, true>, -1, 1, false> >’ and ‘Eigen::BDCSVD<Eigen::Matrix<double, -1, -1> >::Literal’ {aka ‘double’}
dependencies/eigen/Eigen/src/SVD/BDCSVD.h:367:37: error: return type of ‘const RCmpEQReturnType Eigen::operator==(const Scalar&, const Eigen::ArrayWrapper<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, -1, false>, -1, 1, true>, -1, 1, false> >&)’ is not ‘bool’
367 | if( (A.col(j).tail(n2).array()!=Literal(0)).any() )
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
dependencies/eigen/Eigen/src/SVD/BDCSVD.h:367:37: note: used as rewritten candidate for comparison of ‘Eigen::ArrayWrapper<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, -1, false>, -1, 1, true>, -1, 1, false> >’ and ‘Eigen::BDCSVD<Eigen::Matrix<double, -1, -1> >::Literal’ {aka ‘double’}