context addable( otype T ) {
	T ?+?( T,T );
	T ?=?( T*, T);
};

otype List1( otype T | addable( T ) ) = struct { T data; List1( T ) *next; } *;
typedef List1( int ) ListOfIntegers;
//List1( int ) li;
ListOfIntegers li;
int f( List1( int ) ( (*g ))( int ) );
[int] h( * List1( int ) p );							// new declaration syntax

struct( otype T ) S2 { T i; };							// actual definition
struct( int ) S3 v1, *p;								// expansion and instantiation
struct( otype T )( int ) S24 { T i; } v2;				// actual definition, expansion and instantiation
struct( otype T )( int ) { T i; } v2;					// anonymous actual definition, expansion and instantiation

struct( otype T | addable( T ) ) node { T data; struct( T ) node *next; };
otype List( otype T ) = struct( T ) node *;
List( int ) my_list;

otype Complex | addable( Complex );

int main() {
	(struct( int ) node)my_list;
}

// Local Variables: //
// tab-width: 4 //
// End: //
