Странная ошибка компиляции: ошибка компилятора или моя? - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть библиотека только для заголовков, и я получаю странную ошибку компиляции.Проблема в том, что я не получаю эту ошибку в типичном минимальном примере и не на всех компиляторах (в macOS все компилируется и работает как чудо).Я не уверен, стоит ли мне что-то беспокоить в моем коде, или это ошибка верхнего уровня.Несмотря на это, я не уверен, как обойти это.

Я получаю следующую ошибку компилятора:

In file included from /home/tdegeus/opt/include/eigen3/Eigen/SparseCore:59:0,
                 from /home/tdegeus/opt/include/eigen3/Eigen/Sparse:26,
                 from /home/tdegeus/opt/include/eigen3/Eigen/Eigen:2,
                 from /home/tdegeus/prog/src/GooseFEM/docs/examples/Statics/Periodic/LinearElasticity/main.cpp:1:
/home/tdegeus/opt/include/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h: In function ‘void Eigen::internal::permute_symm_to_symm(const MatrixType&, Eigen::SparseMatrix<typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex>&, const typename MatrixType::StorageIndex*) [with int SrcMode = 1; int DstMode = 2; MatrixType = Eigen::SparseMatrix<double>; int DestOrder = 0]’:
/home/tdegeus/opt/include/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h:517:6: internal compiler error: in predicate_mem_writes, at tree-if-conv.c:2252
 void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DstOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm)
      ^~~~~~~~~~~~~~~~~~~~
0xb3530b predicate_mem_writes
    /ssoft/spack/paien/spack.v2/var/spack/stage/gcc-7.3.0-drb5cfgzldhzbrs6lyzk7xdqqcixbxhb/gcc-7.3.0/gcc/tree-if-conv.c:2252
0xb3530b combine_blocks
    /ssoft/spack/paien/spack.v2/var/spack/stage/gcc-7.3.0-drb5cfgzldhzbrs6lyzk7xdqqcixbxhb/gcc-7.3.0/gcc/tree-if-conv.c:2377
0xb359bb tree_if_conversion(loop*)
    /ssoft/spack/paien/spack.v2/var/spack/stage/gcc-7.3.0-drb5cfgzldhzbrs6lyzk7xdqqcixbxhb/gcc-7.3.0/gcc/tree-if-conv.c:2883
0xb3663b execute
    /ssoft/spack/paien/spack.v2/var/spack/stage/gcc-7.3.0-drb5cfgzldhzbrs6lyzk7xdqqcixbxhb/gcc-7.3.0/gcc/tree-if-conv.c:2961
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.

, которая исчезает, если я комментирую эту строку (очевидно, нарушая функциональность):

m_solver.compute(m_ACuu);

Обратите внимание:

Eigen::SparseMatrix<double> m_ACuu;
Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> m_solver;

Я попробовал минимальный пример:

#include <iostream>
#include <iomanip>
#include <math.h>
#include <vector>
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <Eigen/SparseCholesky>

int main()
{
  size_t N = 11;

  // allocate system
  Eigen::SparseMatrix<double> A(N,N);
  Eigen::VectorXd f(N);

  // set force
  f         *= 0.0;
  f((N-1)/2) = 1.0;

  // construct list of Triplets (row,col,data) that from the matrix "A"
  std::vector<Eigen::Triplet<double>> Atr;
  // - first equation
  Atr.push_back(Eigen::Triplet<double>(0,0,+2.0));
  Atr.push_back(Eigen::Triplet<double>(0,1,-1.0));
  // - body
  for ( size_t i=1; i<N-1; ++i ) {
    Atr.push_back(Eigen::Triplet<double>(i,i-1,-1.0));
    Atr.push_back(Eigen::Triplet<double>(i,i  ,+2.0));
    Atr.push_back(Eigen::Triplet<double>(i,i+1,-1.0));
  }
  // - last equation
  Atr.push_back(Eigen::Triplet<double>(N-1,N-2,-1.0));
  Atr.push_back(Eigen::Triplet<double>(N-1,N-1,+2.0));

  // build matrix from Triplets
  A.setFromTriplets(Atr.begin(),Atr.end());

  // solve the linear system
  // - define solver (according to type above)
  Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> solver;
  // - analyze the system, and factorize (one could solve different right-hand-sides)
  // solver.analyzePattern(A);
  solver.factorize(A);
  // - solve "A * x = f"
  Eigen::VectorXd u = solver.solve(f);

  // print to screen
  std::cout << A << std::endl;
  std::cout << u << std::endl;

  return 0;
}

Скомпилирован на той же системе с теми же библиотеками и с похожими параметрами:

g++ -march=native -O3 test.cpp

Ноэто компилируется и работает как шарм!?

Обратите внимание, что я пробовал несколько версий Eigen, включая 3.3.90.

Редактировать

Также обратите внимание, что эта проблема возникает с

g++ --version
g++ (GCC) 7.3.0

, но исчезла для

g++ (GCC) 6.4.0
...