context has_q( type T )
{
  T q( T );
};

forall( type z | has_q( z ) )
void f()
{
  context has_r( type T, type U )
  {
    T r( T, T (T,U) );
  };
  
  extern type x, y | has_r( x, y );
  
}