Если включить -Wall -O3 для selfadjointView
, то gcc11 начинает громко ругаться, ну а так как у меня -Werror ещё включён, то становится ещё грустнее. На gcc10 всё работает, только что проверил. Ругается, что warning: ‘result’ may be used uninitialized
, а переменной result ни в коде нет, ни в Eigen/src/Core/products/SelfadjointMatrixVector.h
. Версия Eigen 3.3.9
#include "Eigen/Core"
using matrix_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic,
Eigen::Dynamic>;
using vector_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic, 1>;
inline double braMket (
const vector_t &bra,
const matrix_t &M,
const vector_t &ket)
{
const auto H = M.selfadjointView<Eigen::Lower> ();
return std::real (ket.dot (bra.transpose ()*H));
}
double bilinear_form (
const vector_t &v,
const matrix_t &m)
{
return braMket (v, m, v);
}
luke@yaviniv:~/eigen-gcc11$ gcc -v
Reading specs from /usr/lib64/gcc/x86_64-slackware-linux/11.2.0/specs
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-slackware-linux/11.2.0/lto-wrapper
Target: x86_64-slackware-linux
Configured with: ../configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man --infodir=/usr/info --enable-shared --enable-bootstrap --enable-languages=ada,brig,c,c++,d,fortran,go,lto,objc,obj-c++ --enable-threads=posix --enable-checking=release --enable-objc-gc --with-system-zlib --enable-libstdcxx-dual-abi --with-default-libstdcxx-abi=new --disable-libstdcxx-pch --disable-libunwind-exceptions --enable-__cxa_atexit --disable-libssp --enable-gnu-unique-object --enable-plugin --enable-lto --disable-install-libiberty --disable-werror --with-gnu-ld --with-isl --verbose --with-arch-directory=amd64 --disable-gtktest --enable-clocale=gnu --disable-multilib --target=x86_64-slackware-linux --build=x86_64-slackware-linux --host=x86_64-slackware-linux
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.2.0 (GCC)
luke@yaviniv:~/eigen-gcc11$ pkg-config --modversion eigen3
3.3.9
luke@yaviniv:~/eigen-gcc11$ g++ -c initialize.cpp -o initialize.o $(pkg-config eigen3 --cflags) -Wall
luke@yaviniv:~/eigen-gcc11$ g++ -c initialize.cpp -o initialize.o $(pkg-config eigen3 --cflags) -Wall -O3
In file included from /usr/include/eigen3/Eigen/Core:503,
from initialize.cpp:1:
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h: In function ‘static void Eigen::internal::selfadjoint_product_impl<Lhs, LhsMode, false, Rhs, 0, true>::run(Dest&, const Lhs&, const Rhs&, const Scalar&) [with Dest = Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1> >; Lhs = Eigen::Transpose<const Eigen::Matrix<std::complex<double>, -1, -1> >; int LhsMode = 2; Rhs = Eigen::Transpose<const Eigen::Transpose<const Eigen::Matrix<std::complex<double>, -1, 1> > >]’:
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:227:7: warning: ‘result’ may be used uninitialized [-Wmaybe-uninitialized]
225 | internal::selfadjoint_matrix_vector_product<Scalar, Index, (internal::traits<ActualLhsTypeCleaned>::Flags&RowMajorBit) ? RowMajor : ColMajor,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
226 | int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>::run
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
227 | (
| ^
228 | lhs.rows(), // size
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
229 | &lhs.coeffRef(0,0), lhs.outerStride(), // lhs info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
230 | actualRhsPtr, // rhs info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
231 | actualDestPtr, // result info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
232 | actualAlpha // scale factor
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
233 | );
| ~
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:39:24: note: by argument 4 of type ‘const std::complex<double>*’ to ‘static void Eigen::internal::selfadjoint_matrix_vector_product<Scalar, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs, Version>::run(Index, const Scalar*, Index, const Scalar*, Scalar*, Scalar) [with Scalar = std::complex<double>; Index = long int; int StorageOrder = 1; int UpLo = 2; bool ConjugateLhs = false; bool ConjugateRhs = false; int Version = 0]’ declared here
39 | EIGEN_DONT_INLINE void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
luke@yaviniv:~/eigen-gcc11$
На арче такая же беда.
Upd. Баг подтвердили, выражение упростили до просто умножения вектора на матрицу: https://godbolt.org/z/PGjP3rz91