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