1// PR middle-end/48661 2// { dg-do run } 3 4extern "C" void abort (); 5 6__attribute__((noinline)) 7double 8foo (double x, double y) 9{ 10 asm volatile ("" : : : "memory"); 11 return x + y; 12} 13 14__attribute__((noinline, noclone)) 15void 16bar (int x) 17{ 18 if (x != 123) 19 abort (); 20} 21 22struct A 23{ 24 double a1, a2; 25}; 26 27struct B 28{ 29 virtual int m () const = 0 ; 30}; 31 32struct C 33{ 34 virtual ~C () {} 35}; 36 37struct D : virtual public B, public C 38{ 39 explicit D (const A &x) : d(123) { foo (x.a2, x.a1); } 40 int m () const { return d; } 41 int d; 42}; 43 44struct E 45{ 46 E () : d(0) {} 47 virtual void n (const B &x) { d = x.m (); x.m (); x.m (); } 48 int d; 49}; 50 51void 52test () 53{ 54 A a; 55 a.a1 = 0; 56 a.a2 = 1; 57 E p; 58 D q (a); 59 const B &b = q; 60 bar (b.m ()); 61 p.n (b); 62 bar (p.d); 63} 64 65void 66baz () 67{ 68 A a; 69 D p2 (a); 70} 71 72int 73main () 74{ 75 test (); 76 return 0; 77} 78