// ANSI function definitions

void h(void) {}

int f (
    int (void),
    int (int),
    int ((void)),
    int ((int)),
    void g(void)
  ) {
    (*g)();
    g();
    g = h;
}

int f1() {}
int (f2()) {}
int (*f3())() {}
int *((f4())) {}
int ((*f5()))() {}
int *f6() {}
int *(f7)() {}
int **f8() {}
int * const *(f9)() {}
int (*f10())[] {}
int (*f11())[][3] {}
int ((*f12())[])[3] {}

// "implicit int" type specifier (not ANSI)

fII1( int i ) {}
const fII2( int i ) {}
extern fII3( int i ) {}
extern const fII4( int i ) {}

*fII5() {}
const *fII6() {}
const long *fII7() {}
static const long *fII8() {}
const static long *fII9() {}

// K&R function definitions

fO1( i ) int i; {}
int fO2( i ) int i; {}
const fO3( i ) int i; {}
extern fO4( i ) int i; {}
extern const fO5( i ) int i; {}

// Cforall extensions

[] f( );
[int] f( );
[] f(int);
[int] f(int);
[] f( ) {}
[int] f( ) {}
[] f(int) {}
[int] f(int) {}

[int x] f( );
[] f(int x);
[int x] f(int x);
[int x] f( ) {}
[] f(int x) {}
[int x] f(int x) {}

[int, int x] f( );
[] f(int, int x);
[int, int x] f(int, int x);
[int, int x] f( ) {}
[] f(int, int x) {}
[int, int x] f(int, int x) {}

[int, int x, int] f( );
[] f(int, int x, int);
[int, int x, int] f(int, int x, int);
[int, int x, int] f( ) {}
[] f(int, int x, int) {}
[int, int x, int] f(int, int x, int) {}

[int, int x, * int y] f( );
[] f(int, int x, * int y);
[int, int x, * int y] f(int, int x, * int y);
[int, int x, * int y] f( ) {}
[] f(int, int x, * int y) {}
[int, int x, * int y] f(int, int x, * int y) {}

[ int ] f11( int ), f12;  // => int f11( int ), f12( int );

[int] f(
	int ( int, int p ),
	[int](int)
    ) {
    int (*(*p)[][10])[][3];
    * [][10] * [][3] int p;
    * [] * [int](int) p;
}

static const int *f1() {}
static [ const int ] f2() {}
static inline [ const * int ] f3() {}
static inline [ const [ * int, int ] ] f4() {}
static [ const [ * int, const int ] ] f5() {}

// unnamed parameter

int f(
    int (),

    int *(),
    int **(),
    int * const *(),
    int * const * const (),

    int ([]),
    int ([10]),

    int *([]),
    int *([10]),
    int **([]),
    int **([10]),
    int * const *([]),
    int * const *([10]),
    int * const * const ([]),
    int * const * const ([10])
    );

int f(
    int (),

    int *(),
    int **(),
    int * const *(),
    int * const * const (),

    int ([]),
    int ([10]),

    int *([]),
    int *([10]),
    int **([]),
    int **([10]),
    int * const *([]),
    int * const *([10]),
    int * const * const ([]),
    int * const * const ([10])
    ) {
}

typedef int T;

int f( T (T), T T ) {
    T (T);
}

// errors

//int f()[] {}
//int (f[])() {}
//int f[]() {}
//int ((*f15())())[] {}
