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