Skip to content

constexpr test fails in C++20

Environment

  • Operating System : Linux
  • Architecture : x64
  • Eigen Version : f9dfda28 (Wed Sep 7 14:10:02 2022 -0700)
  • Compiler Version : g++ (Debian 12.1.0-8) 12.1.0

Minimal Example

xlz@X300M-STX:~/src/eigen/build$ cmake .. -DCMAKE_CXX_STANDARD=20
...
xlz@X300M-STX:~/src/eigen/build$ make compile_time_evaluation VERBOSE=1
/usr/bin/cmake -S/home/xlz/src/eigen -B/home/xlz/src/eigen/build --check-build-system CMakeFiles/Makefile.cmake 0
make  -f CMakeFiles/Makefile2 compile_time_evaluation
make[1]: Entering directory '/home/xlz/src/eigen/build'
/usr/bin/cmake -S/home/xlz/src/eigen -B/home/xlz/src/eigen/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/xlz/src/eigen/build/CMakeFiles 0
make  -f CMakeFiles/Makefile2 test/CMakeFiles/compile_time_evaluation.dir/all
make[2]: Entering directory '/home/xlz/src/eigen/build'
make  -f test/CMakeFiles/compile_time_evaluation.dir/build.make test/CMakeFiles/compile_time_evaluation.dir/depend
make[3]: Entering directory '/home/xlz/src/eigen/build'
cd /home/xlz/src/eigen/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/xlz/src/eigen /home/xlz/src/eigen/test /home/xlz/src/eigen/build /home/xlz/src/eigen/build/test /home/xlz/src/eigen/build/test/CMakeFiles/compile_time_evaluation.dir/DependInfo.cmake --color=
make[3]: Leaving directory '/home/xlz/src/eigen/build'
make  -f test/CMakeFiles/compile_time_evaluation.dir/build.make test/CMakeFiles/compile_time_evaluation.dir/build
make[3]: Entering directory '/home/xlz/src/eigen/build'
Building CXX object test/CMakeFiles/compile_time_evaluation.dir/compile_time_evaluation.cpp.o
cd /home/xlz/src/eigen/build/test && /usr/bin/c++ -DEIGEN_TEST_MAX_SIZE=320 -DEIGEN_TEST_PART_ALL=1 -I/home/xlz/src/eigen -pedantic -Wall -Wextra -Wundef -Wcast-align -Wchar-subscripts -Wnon-virtual-dtor -Wunused-local-typedefs -Wpointer-arith -Wwrite-strings -Wformat-security -Wlogical-op -Wenum-conversion -Wc++11-extensions -Wdouble-promotion -Wshadow -Wno-psabi -Wno-variadic-macros -Wno-long-long -fno-check-new -fno-common -fstrict-aliasing -O3 -DNDEBUG -std=c++20 -MD -MT test/CMakeFiles/compile_time_evaluation.dir/compile_time_evaluation.cpp.o -MF CMakeFiles/compile_time_evaluation.dir/compile_time_evaluation.cpp.o.d -o CMakeFiles/compile_time_evaluation.dir/compile_time_evaluation.cpp.o -c /home/xlz/src/eigen/test/compile_time_evaluation.cpp
In file included from /home/xlz/src/eigen/Eigen/Core:285,
                 from /home/xlz/src/eigen/Eigen/Dense:1,
                 from /home/xlz/src/eigen/test/compile_time_evaluation.cpp:3:
/home/xlz/src/eigen/Eigen/src/Core/AssignEvaluator.h: In function ‘constexpr bool test_nc()’:
/home/xlz/src/eigen/test/compile_time_evaluation.cpp:279:27:   in ‘constexpr’ expansion of ‘nc_maps()’
/home/xlz/src/eigen/test/compile_time_evaluation.cpp:70:9:   in ‘constexpr’ expansion of ‘((Eigen::DenseBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)(& v))->Eigen::DenseBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >::fill((Eigen::DenseBase<Eigen::Map<Eigen::Matrix<float, 3, 1, 0, 3, 1>, 0, Eigen::Stride<0, 0> > >::Scalar)10)’
/home/xlz/src/eigen/Eigen/src/Core/CwiseNullaryOp.h:339:14:   in ‘constexpr’ expansion of ‘((Eigen::DenseBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)this)->Eigen::DenseBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >::setConstant((* & val))’
/home/xlz/src/eigen/Eigen/src/Core/CwiseNullaryOp.h:349:20:   in ‘constexpr’ expansion of ‘((Eigen::MatrixBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)(&((Eigen::EigenBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)((Eigen::DenseBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)this))->Eigen::EigenBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >::derived()))->Eigen::MatrixBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >::operator=<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> > >(Eigen::DenseBase<Derived>::Constant(Eigen::Index, Eigen::Index, const Scalar&) [with Derived = Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> >; ConstantReturnType = Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> >; Eigen::Index = long int; Scalar = float](((Eigen::EigenBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)((Eigen::DenseBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)this))->Eigen::EigenBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >::cols(), (* & val)))’
/home/xlz/src/eigen/Eigen/src/Core/Assign.h:68:28:   in ‘constexpr’ expansion of ‘Eigen::internal::call_assignment<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> >, Eigen::CwiseNullaryOp<scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> > >((* &((Eigen::EigenBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)((Eigen::MatrixBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >*)this))->Eigen::EigenBase<Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> > >::derived()), (* &((const Eigen::EigenBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> > >*)(& other))->Eigen::EigenBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> > >::derived()))’
/home/xlz/src/eigen/Eigen/src/Core/AssignEvaluator.h:837:18: error: ‘constexpr void Eigen::internal::call_assignment(Dst&, const Src&, const Func&, std::enable_if_t<(! evaluator_assume_aliasing<Src>::value), void*>) [with Dst = Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> >; Src = Eigen::CwiseNullaryOp<scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> >; Func = assign_op<float, float>; std::enable_if_t<(! evaluator_assume_aliasing<Src>::value), void*> = void*; typename evaluator_traits<SrcXprType>::Shape = Eigen::DenseShape]’ called in a constant expression
  837 |   call_assignment(dst, src, internal::assign_op<typename Dst::Scalar,typename Src::Scalar>());
      |   ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/xlz/src/eigen/Eigen/src/Core/AssignEvaluator.h:857:6: note: ‘constexpr void Eigen::internal::call_assignment(Dst&, const Src&, const Func&, std::enable_if_t<(! evaluator_assume_aliasing<Src>::value), void*>) [with Dst = Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> >; Src = Eigen::CwiseNullaryOp<scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> >; Func = assign_op<float, float>; std::enable_if_t<(! evaluator_assume_aliasing<Src>::value), void*> = void*; typename evaluator_traits<SrcXprType>::Shape = Eigen::DenseShape]’ is not usable as a ‘constexpr’ function because:
  857 | void call_assignment(Dst& dst, const Src& src, const Func& func, std::enable_if_t<!evaluator_assume_aliasing<Src>::value, void*> = 0)
      |      ^~~~~~~~~~~~~~~
/home/xlz/src/eigen/Eigen/src/Core/AssignEvaluator.h:859:27: error: call to non-‘constexpr’ function ‘void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> >; Src = Eigen::CwiseNullaryOp<scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> >; Func = assign_op<float, float>]’
  859 |   call_assignment_no_alias(dst, src, func);
      |   ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
/home/xlz/src/eigen/Eigen/src/Core/AssignEvaluator.h:874:6: note: ‘void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Map<Eigen::Matrix<float, 3, 1>, 0, Eigen::Stride<0, 0> >; Src = Eigen::CwiseNullaryOp<scalar_constant_op<float>, Eigen::Matrix<float, 3, 1> >; Func = assign_op<float, float>]’ declared here
  874 | void call_assignment_no_alias(Dst& dst, const Src& src, const Func& func)
      |      ^~~~~~~~~~~~~~~~~~~~~~~~
make[3]: *** [test/CMakeFiles/compile_time_evaluation.dir/build.make:76: test/CMakeFiles/compile_time_evaluation.dir/compile_time_evaluation.cpp.o] Error 1
make[3]: Leaving directory '/home/xlz/src/eigen/build'
make[2]: *** [CMakeFiles/Makefile2:17812: test/CMakeFiles/compile_time_evaluation.dir/all] Error 2
make[2]: Leaving directory '/home/xlz/src/eigen/build'
make[1]: *** [CMakeFiles/Makefile2:17819: test/CMakeFiles/compile_time_evaluation.dir/rule] Error 2
make[1]: Leaving directory '/home/xlz/src/eigen/build'
make: *** [Makefile:6302: compile_time_evaluation] Error 2