PR c++/81917 - ICE with void_t and partial specialization.
[official-gcc.git] / gcc / testsuite / g++.dg / opt / pr82159-2.C
blobc9797105562e82eb943cd34625d6705436421bc4
1 // PR c++/82159
2 // { dg-do compile }
3 // { dg-options "" }
4 // { dg-additional-options "-Wno-return-type" }
6 template <typename T> struct D { T e; };
7 struct F : D<int[0]> {
8   F(const F &);
9 };
10 struct G : F {
11   template <class T> G operator-(T);
13 template <class T> struct I {
14   typedef typename T::template J<I> ak;
16 template <class T> struct K { typename I<T>::ak an; };
17 struct H {
18   G l;
20 struct C {
21   ~C();
23 template <class T> struct M : T {
24   template <typename U, typename V> M(U, V);
25   H h;
26   virtual void foo() { T::bar(&h); }
28 template <int, typename> class A;
29 template <class> struct B {
30   typedef int BT;
31   struct BC {};
32   template <class T> struct BD {
33     G g;
34     BD(BT, T n) : g(n.l - 0) {}
35   };
36   B(BT, BC);
38 template <typename> struct O;
39 template <int T, typename U>
40 struct O<B<A<T, U> > > : public B<A<T, U> >::BC {};
41 struct L : B<A<2, double> > {
42   struct P : C {
43     void bar(H *x) {
44       BT a;
45       BD<H>(a, *x);
46     }
47   };
48   template <typename U, typename V> L(U x, V n) : B(x, n) {}
49   int ll;
50   virtual int baz() { M<P>(this, ll); }
52 template <typename> class Q {
53   O<B<A<2, double> > > q;
54   virtual L baz() { L(0, q); }
56 template <template <class> class T> struct R {
57   R() { T<int>(); }
59 struct S {
60   template <class> class J : R<Q> {};
62 void foo() { K<S> c; }
64 int main() {
65   return 0;