PR c++/81917 - ICE with void_t and partial specialization.
[official-gcc.git] / gcc / testsuite / g++.dg / template / memfriend7.C
blobe6bf12f96546cace26d15e8aa57dc9fd666b7280
1 // { dg-do compile }
3 // Copyright (C) 2003 Free Software Foundation
4 // Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
6 // Member function of class template as friend
7 // Erroneous case: mismatch during specialization
9 template <class T> struct A {
10   template <class U> void f(U);
11   void g();
12   void h();
13   void i(int);
14   template <T t> void j();
17 class C {
18   int ii;                               // { dg-message "private" }
19   template <class U> template <class V>
20     friend void A<U>::f(V);
21   template <class U> friend void A<U>::g();
22   template <class U> friend void A<U>::h();
23   template <class U> friend void A<U>::i(int);
24   template <class U> template <U t>
25     friend void A<U>::j();
28 template <class T> struct A<T*> {
29   void f(int);
30   template <class U> void g();
31   int h();
32   void i(char);
33   template <int> void j();
36 template <class T> void A<T*>::f(int)
38   C c;
39   c.ii = 0;                             // { dg-error "context" }
42 template <class T> template <class U> void A<T*>::g()
44   C c;
45   c.ii = 0;                             // { dg-error "context" }
48 template <class T> int A<T*>::h()
50   C c;
51   c.ii = 0;                             // { dg-error "context" }
52   return 0;
55 template <class T> void A<T*>::i(char)
57   C c;
58   c.ii = 0;                             // { dg-error "context" }
61 template <class T> template <int> void A<T*>::j()
63   C c;
64   c.ii = 0;                             // { dg-error "context" }
67 template <> struct A<char> {
68   void f(int);
69   template <class U> void g();
70   int h();
71   void i(char);
72   template <int> void j();
75 void A<char>::f(int)
77   C c;
78   c.ii = 0;                             // { dg-error "context" }
81 template <class U> void A<char>::g()
83   C c;
84   c.ii = 0;                             // { dg-error "context" }
87 template <> void A<char>::g<int>()
89   C c;
90   c.ii = 0;                             // { dg-error "context" }
93 int A<char>::h()
95   C c;
96   c.ii = 0;                             // { dg-error "context" }
97   return 0;
100 void A<char>::i(char)
102   C c;
103   c.ii = 0;                             // { dg-error "context" }
106 template <int> void A<char>::j()
108   C c;
109   c.ii = 0;                             // { dg-error "context" }
112 template <> void A<char>::j<0>()
114   C c;
115   c.ii = 0;                             // { dg-error "context" }
118 int main()
120   A<int *> a1;
121   a1.f(0);                              // { dg-message "required" }
122   a1.g<char>();                         // { dg-message "required" }
123   a1.g<int>();                          // { dg-message "required" }
124   a1.h();                               // { dg-message "required" }
125   a1.i('a');                            // { dg-message "required" }
126   a1.j<1>();                            // { dg-message "required" }
127   A<char> a2;
128   a2.f(0);
129   a2.g<char>();                         // { dg-message "required" }
130   a2.g<int>();
131   a2.h();
132   a2.i('a');
133   a2.j<1>();                            // { dg-message "required" }
134   a2.j<0>();