1 /* { dg-do compile } */
2 /* { dg-options "-O3 -c -w" } */
3 
4 template <class> class A;
5 template <class R> struct VirtualMatrice {
m_fn1VirtualMatrice6   virtual bool m_fn1(int) const { return true; }
7   struct B {
8     A<R> x;
BVirtualMatrice::B9     B(VirtualMatrice *p1, A<R> p2) : x(p2) { p1->m_fn1(0) ?: throw; }
10   };
11   void operator*(A<R> p1) { B(this, p1); }
12   ~VirtualMatrice();
13 }
14 ;
15 template <class> class A {
16 public:
17   operator int *();
18   A(int *, long);
19 };
20 
21 class G : public A<int> {
22 public:
23   G(long);
24 };
25 int typedef Complex;
26 template <class> class H : VirtualMatrice<int> {};
27 template <class> class C;
28 template <> class C<int> : H<Complex>, VirtualMatrice<Complex> {
m_fn1(int)29   bool m_fn1(int) const { return true; }
30 };
31 template <class K, class Mat>
DoIdoAction(int,int,A<K> p3,A<K>,A<K>,A<K>,Mat,Mat & p8)32 void DoIdoAction(int, int, A<K> p3, A<K>, A<K>, A<K>, Mat, Mat &p8) {
33   p8 *p3;
34 }
35 
36 class D {
37   typedef int K;
38   class F {
39     int operator()() const;
40   };
41 };
operator()42 int D::F::operator()() const {
43   VirtualMatrice<K> *a;
44   VirtualMatrice<K> b, &B = *a;
45   G c(0), g(1);
46   int d, e, f;
47   A<K> h(&g[f], 0), i(&g[e], 0), j(&g[d], 0);
48   DoIdoAction(0, 3, h, i, j, c, b, B);
49 }
50