int ?=?( int*, int );
float ?=?( float*, float );
double ?=?( double*, double );

forall( type T, type U | { U f(T); } ) U g(T);
float f( int );
double f( int );
void i( float );

void h()
{
  int a;
  i( g( a ) );
}

context has_f_and_j( type T, type U )
{
  U f( T );
  U j( T, U );
};

float j( int, float );
forall( type T, type U | has_f_and_j( T, U ) ) U k( T );

void l()
{
  int b;
  i( k( b ) );
}
