1 // { dg-do compile } 2 3 // Copyright (C) 2003 Free Software Foundation 4 // Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> 5 6 // Member function of class template as friend 7 // Erroneous case: mismatch during specialization 8 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(); 15 }; 16 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(); 26 }; 27 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(); 34 }; 35 36 template <class T> void A<T*>::f(int) 37 { 38 C c; 39 c.ii = 0; // { dg-error "context" } 40 } 41 42 template <class T> template <class U> void A<T*>::g() 43 { 44 C c; 45 c.ii = 0; // { dg-error "context" } 46 } 47 48 template <class T> int A<T*>::h() 49 { 50 C c; 51 c.ii = 0; // { dg-error "context" } 52 return 0; 53 } 54 55 template <class T> void A<T*>::i(char) 56 { 57 C c; 58 c.ii = 0; // { dg-error "context" } 59 } 60 61 template <class T> template <int> void A<T*>::j() 62 { 63 C c; 64 c.ii = 0; // { dg-error "context" } 65 } 66 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(); 73 }; 74 75 void A<char>::f(int) 76 { 77 C c; 78 c.ii = 0; // { dg-error "context" } 79 } 80 81 template <class U> void A<char>::g() 82 { 83 C c; 84 c.ii = 0; // { dg-error "context" } 85 } 86 87 template <> void A<char>::g<int>() 88 { 89 C c; 90 c.ii = 0; // { dg-error "context" } 91 } 92 93 int A<char>::h() 94 { 95 C c; 96 c.ii = 0; // { dg-error "context" } 97 return 0; 98 } 99 100 void A<char>::i(char) 101 { 102 C c; 103 c.ii = 0; // { dg-error "context" } 104 } 105 106 template <int> void A<char>::j() 107 { 108 C c; 109 c.ii = 0; // { dg-error "context" } 110 } 111 112 template <> void A<char>::j<0>() 113 { 114 C c; 115 c.ii = 0; // { dg-error "context" } 116 } 117 118 int main() 119 { 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>(); 135 } 136