https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61456
Teresa Johnson <tejohnson at google dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |tejohnson at google dot com --- Comment #2 from Teresa Johnson <tejohnson at google dot com> --- I have another small test case that manifests as a seg fault at runtime, but I believe it is likely the same issue. test.cc: class MyClass { public: virtual void Method1() const {} virtual void Method2() const {} virtual ~MyClass() {} }; int main(void) { MyClass *d = new MyClass; struct MethodStruct { void (MyClass::*method)() const; }; const MethodStruct kTest[] = { {&MyClass::Method1}, {&MyClass::Method2}, }; for (int i = 0; i < 2; ++i) { (d->*kTest[i].method)(); } delete d; } Compiled with "g++ -O2 test.cc -std=gnu++11" it seg faults when trying to invoke method in the for loop. If I make this change: 22c22,23 < (d->*kTest[i].method)(); --- > const auto ptmf = kTest[i].method; > (d->*ptmf)(); the test case passes. I found that the following initializations of the function pointers in kTest are being eliminated by cddce1, and if that is disabled, then they are eliminated by dce1: [test.cc : 19:3] # .MEM_12 = VDEF <.MEM_10> kTestD.2288[0].methodD.2287.__pfnD.2284 = 1B; [test.cc : 19:3] # .MEM_13 = VDEF <.MEM_12> kTestD.2288[0].methodD.2287.__deltaD.2285 = 0; [test.cc : 19:3] # .MEM_14 = VDEF <.MEM_13> kTestD.2288[1].methodD.2287.__pfnD.2284 = 9B; [test.cc : 19:3] # .MEM_15 = VDEF <.MEM_14> kTestD.2288[1].methodD.2287.__deltaD.2285 = 0;