1203181Smarcel// Bug: g++ expanded b->member() multiple times, causing the optimizer to 2203181Smarcel// decide that things weren't related and optimize 'die' into an infinite 3203181Smarcel// loop. 4203181Smarcel 5203181Smarcelstruct A { 6203181Smarcel virtual ~A() { } 7203181Smarcel void f (bool) { } 8203181Smarcel}; 9203181Smarcel 10203181Smarceltypedef void (A::*pmf_void)(); 11203181Smarceltypedef void (A::*pmf_bool)(bool); 12203181Smarcel 13203181Smarcelstruct B { 14203181Smarcel ~B() {} 15203181Smarcel pmf_void member() const { return mbr; } 16203181Smarcel pmf_void mbr; 17203181Smarcel}; 18203181Smarcel 19203181SmarcelA *a; 20203181SmarcelB *b; 21203181Smarcel 22203181Smarcelvoid die (bool param) { 23203181Smarcel pmf_bool pmf = (pmf_bool)(b->member()); 24203181Smarcel (a->*pmf)(param); 25203181Smarcel} 26203181Smarcel 27203181Smarcelint main () 28203181Smarcel{ 29203181Smarcel A a2; 30203181Smarcel B b2; 31203181Smarcel 32203181Smarcel b2.mbr = reinterpret_cast<pmf_void>(&A::f); 33203181Smarcel 34203181Smarcel a = &a2; 35203181Smarcel b = &b2; 36203181Smarcel 37203181Smarcel die (true); 38203181Smarcel} 39203181Smarcel