1 // { dg-do compile }
2 // { dg-options "-O2 -std=gnu++11" }
3 
4 template <class reference_type> class A
5 {
6   reference_type *m_pBody;
7 public:
A(const A &)8   A (const A &) { m_pBody->acquire (); }
9 };
10 class B;
11 class C
12 {
13 protected:
14   B *_pInterface;
15 };
16 template <class interface_type> class I : C
17 {
18 public:
19   I (interface_type *);
20 };
21 class B
22 {
23 public:
24   virtual void acquire ();
25 };
26 class D
27 {
28 protected:
29   void acquire ();
30 };
31 template <class Ifc1> class J : D, public Ifc1
32 {
33   void
acquire()34   acquire ()
35   {
36     D::acquire ();
37   }
38 };
39 class K : B
40 {
41 };
42 class L;
43 class F
44 {
45   A<L> m_pDocument;
46   F (A<L> const &, int &&);
47 };
48 class XUnoTunnel;
49 class XEventTarget;
50 template <class, class> class WeakImplHelper3 : D, B
51 {
52   void
acquire()53   acquire ()
54   {
55     D::acquire ();
56   }
57 };
58 template <class> class G
59 {
60 public:
61   void
acquire()62   acquire ()
63   {
64     WeakImplHelper3<XUnoTunnel, XEventTarget> ();
65   }
66 };
67 struct H
68 {
HH69   H ()
70       : mxAttribList (new J<B>), mxCurrentHandler (0), mxDocHandler (0),
71         mxTokenHandler (0)
72   {
73   }
74   I<J<B> > mxAttribList;
75   I<int> mxCurrentHandler;
76   I<int> mxDocHandler;
77   I<int> mxTokenHandler;
78 };
79 class L : public G<int>
80 {
81 };
82 class M : public J<K>
83 {
84 public:
85   M ();
86 };
I(interface_type * p1)87 template <class interface_type> I<interface_type>::I (interface_type *p1)
88 {
89   B *a = static_cast<B *> (static_cast<void *> (p1));
90   _pInterface = a;
91   _pInterface->acquire ();
92 }
F(A<L> const & p1,int &&)93 F::F (A<L> const &p1, int &&) : m_pDocument (p1) { I<K> (new M); }
94