// { dg-do assemble } template <class T> bool f(T); template <class T> struct S1 { typedef T X; friend bool f<>(const S1&); }; template <class T> struct S2 { }; template <class T> struct S2<S1<T> > { typedef typename S1<T>::X Y; }; template <class T> typename S2<S1<T> >::Y f(const S1<T>&); template struct S1<int>;