blob: e6bf12f96546cace26d15e8aa57dc9fd666b7280 [file] [log] [blame]
// { dg-do compile }
// Copyright (C) 2003 Free Software Foundation
// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
// Member function of class template as friend
// Erroneous case: mismatch during specialization
template <class T> struct A {
template <class U> void f(U);
void g();
void h();
void i(int);
template <T t> void j();
};
class C {
int ii; // { dg-message "private" }
template <class U> template <class V>
friend void A<U>::f(V);
template <class U> friend void A<U>::g();
template <class U> friend void A<U>::h();
template <class U> friend void A<U>::i(int);
template <class U> template <U t>
friend void A<U>::j();
};
template <class T> struct A<T*> {
void f(int);
template <class U> void g();
int h();
void i(char);
template <int> void j();
};
template <class T> void A<T*>::f(int)
{
C c;
c.ii = 0; // { dg-error "context" }
}
template <class T> template <class U> void A<T*>::g()
{
C c;
c.ii = 0; // { dg-error "context" }
}
template <class T> int A<T*>::h()
{
C c;
c.ii = 0; // { dg-error "context" }
return 0;
}
template <class T> void A<T*>::i(char)
{
C c;
c.ii = 0; // { dg-error "context" }
}
template <class T> template <int> void A<T*>::j()
{
C c;
c.ii = 0; // { dg-error "context" }
}
template <> struct A<char> {
void f(int);
template <class U> void g();
int h();
void i(char);
template <int> void j();
};
void A<char>::f(int)
{
C c;
c.ii = 0; // { dg-error "context" }
}
template <class U> void A<char>::g()
{
C c;
c.ii = 0; // { dg-error "context" }
}
template <> void A<char>::g<int>()
{
C c;
c.ii = 0; // { dg-error "context" }
}
int A<char>::h()
{
C c;
c.ii = 0; // { dg-error "context" }
return 0;
}
void A<char>::i(char)
{
C c;
c.ii = 0; // { dg-error "context" }
}
template <int> void A<char>::j()
{
C c;
c.ii = 0; // { dg-error "context" }
}
template <> void A<char>::j<0>()
{
C c;
c.ii = 0; // { dg-error "context" }
}
int main()
{
A<int *> a1;
a1.f(0); // { dg-message "required" }
a1.g<char>(); // { dg-message "required" }
a1.g<int>(); // { dg-message "required" }
a1.h(); // { dg-message "required" }
a1.i('a'); // { dg-message "required" }
a1.j<1>(); // { dg-message "required" }
A<char> a2;
a2.f(0);
a2.g<char>(); // { dg-message "required" }
a2.g<int>();
a2.h();
a2.i('a');
a2.j<1>(); // { dg-message "required" }
a2.j<0>();
}