[Bug c++/82801] New: Internal compiler error with Eigen and __attribute__((always_inline, flatten))

awllee at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Nov 1 23:32:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82801

            Bug ID: 82801
           Summary: Internal compiler error with Eigen and
                    __attribute__((always_inline, flatten))
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: awllee at gmail dot com
  Target Milestone: ---

Created attachment 42519
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42519&action=edit
compressed compiler_error.ii

This internal compiler error involves a minimal call to the Eigen-3.3.4
template library. It works using clang and homebrewed GCC 7.2.0 on OSX, but
fails on Linux with GCC 7.2.0. It works using ICC on Linux.

Exact version of GCC: 7.2.0

System type: Linux, Ubuntu 16.04

GCC configure options: --enable-languages=c,c++ --disable-multilib

the complete command line that triggers the bug:
g++ -g -O1 -I/home/al17824/local/eigen-3.3.4 compiler_error.cpp -o
compiler_error

compiler output:
compiler_error.cpp:31:1: internal compiler error: Segmentation fault
 }
 ^
0xb1272f crash_signal
        /home/al17824/objdir/../gcc-7.2.0/gcc/toplev.c:337
0x1168f51 ipa_inline
        /home/al17824/objdir/../gcc-7.2.0/gcc/ipa-inline.c:2422
0x1168f51 execute
        /home/al17824/objdir/../gcc-7.2.0/gcc/ipa-inline.c:2845

preprocessed file attached.

Code is fairly simple; most changes lead to the compiler succeeding.

#include <Eigen/Core>
#include <iostream>

class A {
 public:
  virtual double bar() const = 0;
};

class B : public A {
 public:
  double bar() const;
};

__attribute__((always_inline, flatten))
inline double B::bar() const {
  Eigen::Matrix<double, 1, 1> v;
  return 0.0;
}

inline double foo(const B& c) {
  return c.bar();
}

void testError() {
  B model;
  std::cout << foo(model) << std::endl;
}

int main() {
  testError();
}


More information about the Gcc-bugs mailing list