// { 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>;