int a;
float a;
int f( int );
float f( float );

void g()
{
  // selects the same f and a each time
  // but without a cast would be ambiguous
  f( (int)a );
  (int)f( a );
}

[ int ] p;
[ int, double ] p;
[ int, int, int ] p;
[ int, int, int, int ] p;

[ char ] q;
[ int, int ] q;
[ int, int, float ] q;
[ int, int, int, int ] q;

[ int, int ] r( int, int, int, int );

void s()
{
  r( p, q );
  r( [ q, p ] );
  r( r( p, q ), r( q, q ) );
}
