CWiseUnaryView Incompatible with solve

Summary

Attempting to use a custom CWiseUnaryView with the solve function fails to compile with an error about l-values, yet works without issue for a CWiseUnaryOp.

Environment

  • Operating System : All
  • Architecture : x64/Arm64/PowerPC ...
  • Eigen Version : 3.4.0
  • Compiler Version : Gcc8.3
  • Compile Flags : -02
  • Vector Extension : NA

Minimal Example

Reproducible example on GodBolt: https://godbolt.org/z/rnPojeGz8

With error:

In file included from /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/Core:301,
                 from <source>:1:
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/CwiseUnaryView.h: In instantiation of 'const Scalar* Eigen::CwiseUnaryViewImpl<ViewOp, MatrixType, Eigen::Dense>::data() const [with ViewOp = main()::<lambda(const auto:1&)>; MatrixType = const Eigen::Matrix<std::complex<double>, -1, -1>; Eigen::CwiseUnaryViewImpl<ViewOp, MatrixType, Eigen::Dense>::Scalar = double]':
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/util/XprHelper.h:697:22:   required from 'bool Eigen::internal::is_same_dense(const T1&, const T2&, typename Eigen::internal::enable_if<Eigen::internal::possibly_same_dense<T1, T2>::value>::type*) [with T1 = Eigen::Matrix<double, -1, -1>; T2 = Eigen::CwiseUnaryView<main()::<lambda(const auto:1&)>, const Eigen::Matrix<std::complex<double>, -1, -1> >; typename Eigen::internal::enable_if<Eigen::internal::possibly_same_dense<T1, T2>::value>::type = void]'
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/TriangularMatrix.h:550:34:   required from 'void Eigen::TriangularViewImpl<_MatrixType, _Mode, Eigen::Dense>::_solve_impl(const RhsType&, DstType&) const [with RhsType = Eigen::CwiseUnaryView<main()::<lambda(const auto:1&)>, const Eigen::Matrix<std::complex<double>, -1, -1> >; DstType = Eigen::Matrix<double, -1, -1>; _MatrixType = Eigen::CwiseUnaryView<Eigen::internal::scalar_real_ref_op<std::complex<double> >, Eigen::Matrix<std::complex<double>, -1, -1> >; unsigned int _Mode = 2]'
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/Solve.h:147:5:   required from 'static void Eigen::internal::Assignment<DstXprType, Eigen::Solve<DecType, RhsType>, Eigen::internal::assign_op<Scalar, Scalar>, Eigen::internal::Dense2Dense>::run(DstXprType&, const SrcXprType&, const Eigen::internal::assign_op<Scalar, Scalar>&) [with DstXprType = Eigen::Matrix<double, -1, -1>; DecType = Eigen::TriangularView<Eigen::CwiseUnaryView<Eigen::internal::scalar_real_ref_op<std::complex<double> >, Eigen::Matrix<std::complex<double>, -1, -1> >, 2>; RhsType = Eigen::CwiseUnaryView<main()::<lambda(const auto:1&)>, const Eigen::Matrix<std::complex<double>, -1, -1> >; Scalar = double; Eigen::internal::Assignment<DstXprType, Eigen::Solve<DecType, RhsType>, Eigen::internal::assign_op<Scalar, Scalar>, Eigen::internal::Dense2Dense>::SrcXprType = Eigen::Solve<Eigen::TriangularView<Eigen::CwiseUnaryView<Eigen::internal::scalar_real_ref_op<std::complex<double> >, Eigen::Matrix<std::complex<double>, -1, -1> >, 2>, Eigen::CwiseUnaryView<main()::<lambda(const auto:1&)>, const Eigen::Matrix<std::complex<double>, -1, -1> > >]'
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/AssignEvaluator.h:890:49:   required from 'void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Matrix<double, -1, -1>; Src = Eigen::Solve<Eigen::TriangularView<Eigen::CwiseUnaryView<Eigen::internal::scalar_real_ref_op<std::complex<double> >, Eigen::Matrix<std::complex<double>, -1, -1> >, 2>, Eigen::CwiseUnaryView<main()::<lambda(const auto:1&)>, const Eigen::Matrix<std::complex<double>, -1, -1> > >; Func = Eigen::internal::assign_op<double, double>]'
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/PlainObjectBase.h:797:41:   required from 'Derived& Eigen::PlainObjectBase<Derived>::_set_noalias(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Solve<Eigen::TriangularView<Eigen::CwiseUnaryView<Eigen::internal::scalar_real_ref_op<std::complex<double> >, Eigen::Matrix<std::complex<double>, -1, -1> >, 2>, Eigen::CwiseUnaryView<main()::<lambda(const auto:1&)>, const Eigen::Matrix<std::complex<double>, -1, -1> > >; Derived = Eigen::Matrix<double, -1, -1>]'
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/PlainObjectBase.h:594:7:   required from 'Eigen::PlainObjectBase<Derived>::PlainObjectBase(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Solve<Eigen::TriangularView<Eigen::CwiseUnaryView<Eigen::internal::scalar_real_ref_op<std::complex<double> >, Eigen::Matrix<std::complex<double>, -1, -1> >, 2>, Eigen::CwiseUnaryView<main()::<lambda(const auto:1&)>, const Eigen::Matrix<std::complex<double>, -1, -1> > >; Derived = Eigen::Matrix<double, -1, -1>]'
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/Matrix.h:423:29:   required from 'Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const Eigen::EigenBase<OtherDerived>&) [with OtherDerived = Eigen::Solve<Eigen::TriangularView<Eigen::CwiseUnaryView<Eigen::internal::scalar_real_ref_op<std::complex<double> >, Eigen::Matrix<std::complex<double>, -1, -1> >, 2>, Eigen::CwiseUnaryView<main()::<lambda(const auto:1&)>, const Eigen::Matrix<std::complex<double>, -1, -1> > >; _Scalar = double; int _Rows = -1; int _Cols = -1; int _Options = 0; int _MaxRows = -1; int _MaxCols = -1]'
<source>:12:86:   required from here
/opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/CwiseUnaryView.h:115:66: error: lvalue required as unary '&' operand
     EIGEN_DEVICE_FUNC inline const Scalar* data() const { return &(this->coeff(0)); }
Compiler returned: 1

What is the current bug behavior?

Compiler error

What is the expected correct behavior?

Compiler success