Compilation fails for the above code. Of course this compiles fine when not using the CTP. Not sure if its a compiler bug or an Eigen issue. Eigen::Matrix3d A; Eigen::Vector3d b; Eigen::Vector3d x = A.fullPivLu().solve(b); Error message is : 1>------ Build started: Project: TestCompilation, Configuration: Debug x64 ------ 1>Build started 20/04/2015 10:21:06 PM. 1>InitializeBuildStatus: 1> Touching "x64\Debug\TestCompilation.tlog\unsuccessfulbuild". 1>ClCompile: 1> All outputs are up-to-date. 1> main.cpp 1>c:\src\insight\src\3rdparty\eigen\eigen\src/LU/FullPivLU.h(718): error C2280: 'Eigen::Block<Derived,1,1,false> &Eigen::Block<Derived,1,1,false>::operator =(const Eigen::Block<Derived,1,1,false> &)' : attempting to reference a deleted function 1> with 1> [ 1> Derived=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> c:\src\insight\src\3rdparty\eigen\eigen\src/Core/Block.h(143) : compiler has generated 'Eigen::Block<Derived,1,1,false>::operator =' here 1> with 1> [ 1> Derived=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> c:\src\insight\src\3rdparty\eigen\eigen\src/misc/Solve.h(51) : see reference to function template instantiation 'void Eigen::internal::solve_retval<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Derived>::evalTo<Dest>(Dest &) const' being compiled 1> with 1> [ 1> Derived=Eigen::Matrix<double,3,1,0,3,1> 1> , Dest=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> c:\src\insight\src\3rdparty\eigen\eigen\src/misc/Solve.h(51) : see reference to function template instantiation 'void Eigen::internal::solve_retval<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Derived>::evalTo<Dest>(Dest &) const' being compiled 1> with 1> [ 1> Derived=Eigen::Matrix<double,3,1,0,3,1> 1> , Dest=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> c:\src\insight\src\3rdparty\eigen\eigen\src/Core/ReturnByValue.h(60) : see reference to function template instantiation 'void Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Rhs>::evalTo<Dest>(Dest &) const' being compiled 1> with 1> [ 1> Rhs=Eigen::Matrix<double,3,1,0,3,1> 1> , Dest=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> c:\src\insight\src\3rdparty\eigen\eigen\src/Core/ReturnByValue.h(60) : see reference to function template instantiation 'void Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Rhs>::evalTo<Dest>(Dest &) const' being compiled 1> with 1> [ 1> Rhs=Eigen::Matrix<double,3,1,0,3,1> 1> , Dest=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> c:\src\insight\src\3rdparty\eigen\eigen\src/Core/Matrix.h(296) : see reference to function template instantiation 'void Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Rhs>>::evalTo<Eigen::Matrix<double,3,1,0,3,1>>(Dest &) const' being compiled 1> with 1> [ 1> Rhs=Eigen::Matrix<double,3,1,0,3,1> 1> , Dest=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> c:\src\insight\src\3rdparty\eigen\eigen\src/Core/Matrix.h(296) : see reference to function template instantiation 'void Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Rhs>>::evalTo<Eigen::Matrix<double,3,1,0,3,1>>(Dest &) const' being compiled 1> with 1> [ 1> Rhs=Eigen::Matrix<double,3,1,0,3,1> 1> , Dest=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> ..\..\..\Users\Christos\Downloads\TestEigenComp\main.cpp(57) : see reference to function template instantiation 'Eigen::Matrix<double,3,1,0,3,1>::Matrix<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Rhs>>(const Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Rhs>> &)' being compiled 1> with 1> [ 1> Rhs=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> ..\..\..\Users\Christos\Downloads\TestEigenComp\main.cpp(57) : see reference to function template instantiation 'Eigen::Matrix<double,3,1,0,3,1>::Matrix<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Rhs>>(const Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,3,3,0,3,3>>,Rhs>> &)' being compiled 1> with 1> [ 1> Rhs=Eigen::Matrix<double,3,1,0,3,1> 1> ] 1> 1>Build FAILED. 1> 1>Time Elapsed 00:00:02.40 ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
I assume you are using 3.2? Can you check if the problem also occurs with the development branch? Also, can you check if these lines already fail to compile (with either compiler and Eigen version): Eigen::Vector3d a1; const Eigen::Vector3d a2; a1.head<1>()= a2.tail<1>(); If you can't reproduce this on any other compiler, this is very likely a compiler bug. If there is a simple work-around, we can integrate it (if not, we'd unfortunately have to make this a WONTFIX).
Correct, currently using 3.2.4. The sample code that you provided compiles fine in both compiler versions. However, the issue persists in development version. After a bit of searching I was able to find in their blog a link that lists the breaking changes. The blog http://blogs.msdn.com/b/vcblog/archive/2013/11/18/announcing-the-visual-c-compiler-november-2013-ctp.aspx The link to the document, its a .docx http://aka.ms/I0w822 There is a section there titled "Implicitly declared special member functions". They made some changes that will mark functions as deleted as required by the C++ standard. I wonder if this is such a case ?
Indeed, this is probably related to "Implicitly declared special member functions". In src/Core/util/Macros.h, line 316 we have three different variants of the macro EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR. Currently, in your case it should uses the last version. Could you explicitly try the other ones, especially the one for clang.
The 2nd one generated a different error, while the 3rd compiles fine. I tested this quickly with the dev version. so not sure if there are any other issues. Will do some more testing later on and report back.
So fixing this only requires choosing the correct E_I_A_E_O implementation for MSVC? I wonder, if older MSVC versions have problems with the better (i.e., standard conforming) version? If not, we could simply remove the simple (but wrong) code path: using Base::operator=;
I am not sure about all previous versions but it seems that msvc 2013, not the CTP, also compiles fine with the 3rd definition, aka standard conforming. According to microsoft "Previous versions of Visual C++ would define special member functions even if the definition would be ill-formed." So I would not bet that versions prior to 2013 would work with the 3rd definition. However, that means that changing the macro to #if EIGEN_COMP_MSVC_STRICT && EIGEN_COMP_MSVC < 1800 would work for both msvc 2013 and CTP 2013. I would also assume that it would work for CTP 2015. Hopefully though that does not bring forth other issues.
I should have said that the above change in the macro works fine in the scenarios below : 1)Eigen dev version a) msvc 2013 - OK b) msvc 2013 CTP - OK 1) Eigen 3.2.4 a) msvc 2013 - OK b) msvc 2013 CTP - Issue with MapBase which seem to have been resolved in dev version
Fixed in devel and 3.2 branch (as suggested only for MSVC 2013 and later): https://bitbucket.org/eigen/eigen/commits/45ad4b2fd2 https://bitbucket.org/eigen/eigen/commits/ad0c042b4d Regarding the issue with MapBase, please open a new bug.
I see that there is one already related to MapBase and is marked as resolved http://eigen.tuxfamily.org/bz/show_bug.cgi?id=821
(In reply to Christos from comment #9) > I see that there is one already related to MapBase and is marked as resolved > http://eigen.tuxfamily.org/bz/show_bug.cgi?id=821 That fix should be included in 3.2.4, if that does not fix your problem, please provide an example that fails and re-open that bug.
-- GitLab Migration Automatic Message -- This bug has been migrated to gitlab.com's GitLab instance and has been closed from further activity. You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.com/libeigen/eigen/issues/1000.