1 // { dg-do run { target i?86-*-* x86_64-*-* } }
2 // { dg-require-effective-target ilp32 }
3 // { dg-require-effective-target fpic }
4 // { dg-options "-mtune=generic -O2 -fpic" }
5 class G {};
6 
7 struct N {
8   N *a;
9 };
10 
11 struct V {
12   typedef N *W;
13   W *m, *n;
sV14   int s() const { return int(n - m); }
15   const W &operator[](int x) const { return *(m + x); }
16 };
17 
18 struct H;
19 
20 struct J {
21   N *c;
22   H *d;
JJ23   J(N *x, H *y) : c(x), d(y) {}
24 };
25 
26 struct K {
27   const N *c;
28   const H *d;
KK29   K(const N *x, const H *y) : c(x), d(y) {}
KK30   K(const J &x) : c(x.c), d(x.d) {}
31 };
32 
33 struct H {
34   V e;
35   int f;
36 
uH37   J u()
38   {
39     for (int x = 0; x < e.s(); ++x)
40       if (e[x])
41         return J(e[x], this);
42     return v();
43   }
vH44   J v() { return J((N*)64, this); }
45 };
46 
47 struct I {
48   H d;
uI49   J u() { return d.u(); }
vI50   J v() { return d.v(); }
51 };
52 
53 struct bar {
~barbar54   virtual ~bar() {}
55 };
56 
57 struct E {
58   K g;
EE59   E(K x) : g(x) {}
60 };
61 
62 struct foo : public bar {
63   K h;
64   E i;
foofoo65   foo(const K x, const E &y) : h(x), i(y) {}
66 };
67 
68 struct A {
69   I *l;
70   foo *baz() const;
71 };
72 
baz()73 foo *A::baz() const
74 {
75   return new foo(l->u(), E(l->v()));
76 }
77 
78 A x;
79 I i;
80 foo *f;
81 
main()82 int main ()
83 {
84   x.l = &i;
85   f = x.baz();
86   if (f->h.c != f->i.g.c || f->h.d != f->i.g.d)
87     return 1;
88   return 0;
89 }
90