奇怪的编译错误:编译器错误还是我自己的?

时间:2019-04-17 10:14:59

标签: c++ gcc eigen3

我有仅标头的库,并且遇到最奇怪的编译错误。进行中的问题是,我没有在一个代表性的最小示例中得到此错误,而不是在所有编译器上都没有(在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

0 个答案:

没有答案