1// Test PR 17400. Test case provided by Serge Belyshev. 2 3/* { dg-do compile } */ 4/* { dg-options "-O1" } */ 5 6 7void inc (int &); 8bool dec_test (int &); 9 10struct A 11{ 12 int c; 13 14 friend void AddRef (A * p) 15 { 16 inc (p->c); 17 } 18 19 friend void Release (A * p) 20 { 21 if(dec_test (p->c)) 22 delete p; 23 } 24}; 25 26struct B 27{ 28 B (A *p) : obj(p) 29 { 30 AddRef (obj); 31 } 32 33 ~B() 34 { 35 Release (obj); 36 } 37 38 void swap (B &rhs) 39 { 40 A * tmp = obj; 41 obj = rhs.obj; 42 rhs.obj = tmp; 43 } 44 45 A *obj; 46}; 47 48void bar (A *p1, A* p2) 49{ 50 B px (p1); 51 B px2 (p2); 52 px.swap (px2); 53} 54