int ?=?( int*, int );
float ?=?( float*, float );
int * ?=?( int **, int * );
float * ?=?( float **, float * );
char ?=?( char*, char );
void (* ?=?( void (**)(void), void (*)(void) ))(void);

void g1()
{
  forall( type T ) T f( T );
  void f( int );
  void h( void (*p)(void) );
  
  int x;
  void (*y)(void);
  char z;
  float w;
  
  f( x );
  f( y );
  f( z );
  f( w );
  h( f( y ) );
}

void g2()
{
  forall( type T ) void f( T, T );
  forall( type T, type U ) void f( T, U );
  
  int x;
  float y;
  int *z;
  float *w;
  
  f( x, y );
  f( z, w );
  f( x, z );
}
