1 // Bug: g++ expanded b->member() multiple times, causing the optimizer to 2 // decide that things weren't related and optimize 'die' into an infinite 3 // loop. 4 5 struct A { ~AA6 virtual ~A() { } fA7 void f (bool) { } 8 }; 9 10 typedef void (A::*pmf_void)(); 11 typedef void (A::*pmf_bool)(bool); 12 13 struct B { ~BB14 ~B() {} memberB15 pmf_void member() const { return mbr; } 16 pmf_void mbr; 17 }; 18 19 A *a; 20 B *b; 21 die(bool param)22void die (bool param) { 23 pmf_bool pmf = (pmf_bool)(b->member()); 24 (a->*pmf)(param); 25 } 26 main()27int main () 28 { 29 A a2; 30 B b2; 31 32 b2.mbr = reinterpret_cast<pmf_void>(&A::f); 33 34 a = &a2; 35 b = &b2; 36 37 die (true); 38 } 39