.
[official-gcc.git] / gcc / testsuite / g++.dg / ipa / devirt-52.C
blob5c736c4037a160969857122dcb11bf35b0590a9e
1 // PR middle-end/77259
2 // { dg-do compile { target c++11 } }
3 // { dg-options "-O2" }
4 // { dg-additional-options "-Wno-return-type" }
6 template <typename, typename = int> class A;
7 template <typename, typename> struct A
9   A (A &&);
11 template <typename S, typename T, typename U>
12 A<S> operator+(S *, const A<T, U> &);
13 template <typename S, typename T, typename U>
14 void operator+(const A<T, U> &, S *);
15 struct B
17   template <typename V> B (V);
19 template <typename V> V foo (B) {}
20 class C;
21 template <typename> struct D
23   C *operator->() { return d; }
24   C *d;
26 struct C
28   virtual A<int> bar ();
30 struct E
32   ~E ();
33   virtual A<char> bar (const B &) const;
35 template <typename> struct F : E
38 template <typename W> struct F<D<W>> : E
40   A<char> bar (const B &) const try
41     {
42       D<W> a = baz ();
43     }
44   catch (int)
45     {
46     }
47   D<W> baz () const
48   {
49     D<C> b = foo<D<C>>(0);
50     "" + b->bar () + "";
51   }
53 struct G : F<D<int>>
55   G (int);
57 void test () { G (0); }