// 
// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
//
// The contents of this file are covered under the licence agreement in the
// file "LICENCE" distributed with Cforall.
// 
// functions.c -- 
// 
// Author           : Peter A. Buhr
// Created On       : Wed Aug 17 08:39:58 2016
// Last Modified By : Peter A. Buhr
// Last Modified On : Wed Jan 17 22:44:12 2018
// Update Count     : 12
// 

// 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" otype 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) {}

// function prototypes

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

const double bar1(), bar2( int ), bar3( double );		// C version
[const double] foo(), foo( int ), foo( double ) { return 3.0; } // CFA version
struct S { int i; };
[S] rtn( int ) {}


[int] f(
	int ( int, int p ),
	[int](int)
	) {
	int (* (* pc)[][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 (* f), T t ) {
	T (T);
}

// errors

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

// Local Variables: //
// tab-width: 4 //
// compile-command: "cfa functions.c" //
// End: //
