+ [[int (x)()], [declare x as function returning int], [int x()]])
+
+# Check that function reduction does not occur in english parses
+SIMPLE_DECLS(
+ [[int (x)], [type function (x) returning int], [], [declare x as int]])
+
+SIMPLE_DECLS(
+ [[[int x[]]], [declare x as array of int]],
+ [[[int []]], [type array of int]])
+
+SIMPLE_DECLS(
+ [[[int x[n]]], [declare x as variable-length array n of int]],
+ [[[int x[*]]], [declare x as variable-length array of int]],
+ [[[int [n]]], [type variable-length array n of int]],
+ [[[int [*]]], [type variable-length array of int]])
+
+SIMPLE_DECLS(
+ [[int f(a, b)], [declare f as function (a, b) returning int]],
+ [[int f(int, b)], [declare f as function (int, b) returning int]],
+ [[int f(a, int)], [declare f as function (a, int) returning int]],
+ [[int (a, b)], [type function (a, b) returning int]],
+ [[int (int, b)], [type function (int, b) returning int]],
+ [[int (a, int)], [type function (a, int) returning int]])
+
+SIMPLE_DECLS(
+ [[int f(a, b, ...)], [declare f as function (a, b, ...) returning int]],
+ [[int f(int, b, ...)], [declare f as function (int, b, ...) returning int]],
+ [[int f(a, int, ...)], [declare f as function (a, int, ...) returning int]],
+ [[int (a, b, ...)], [type function (a, b, ...) returning int]],
+ [[int (int, b, ...)], [type function (int, b, ...) returning int]],
+ [[int (a, int, ...)], [type function (a, int, ...) returning int]])
+
+SIMPLE_DECLS(
+ [[[int f(int (*)[])]],
+ [declare f as function (pointer to array of int) returning int]],
+ [[[int f(int (*)[][1])]],
+ [declare f as function (pointer to array of array 1 of int) returning int]],
+ [[[int f(int (*)())]],
+ [declare f as function (pointer to function returning int) returning int]],
+ [[[int f(a (*)[])]],
+ [declare f as function (pointer to array of a) returning int]],
+ [[[int f(a (*)[][1])]],
+ [declare f as function (pointer to array of array 1 of a) returning int]],
+ [[[int f(a (*)())]],
+ [declare f as function (pointer to function returning a) returning int]],
+ [[[int (int (*)[])]],
+ [type function (pointer to array of int) returning int]],
+ [[[int (int (*)[][1])]],
+ [type function (pointer to array of array 1 of int) returning int]],
+ [[[int (int (*)())]],
+ [type function (pointer to function returning int) returning int]],
+ [[[int (a (*)[])]],
+ [type function (pointer to array of a) returning int]],
+ [[[int (a (*)[][1])]],
+ [type function (pointer to array of array 1 of a) returning int]],
+ [[[int (a (*)())]],
+ [type function (pointer to function returning a) returning int]])
+
+SIMPLE_DECLS_EXPLAIN(
+ [[[int f(int ([]))]],
+ [declare f as function (array of int) returning int],
+ [[int f(int [])]]],
+ [[[int f(a ([]))]],
+ [declare f as function (array of a) returning int],
+ [[int f(a [])]]],
+ [[[int f(int (()))]],
+ [declare f as function (function returning int) returning int],
+ [[int f(int ())]]],
+ [[[int f(a (()))]],
+ [declare f as function (function returning a) returning int],
+ [[int f(a ())]]],
+ [[[int (int ([]))]],
+ [type function (array of int) returning int],
+ [[int (int [])]]],
+ [[[int (a ([]))]],
+ [type function (array of a) returning int],
+ [[int (a [])]]],
+ [[[int (int (()))]],
+ [type function (function returning int) returning int],
+ [[int (int ())]]],
+ [[[int (a (()))]],
+ [type function (function returning a) returning int],
+ [[int (a ())]]])
+
+SIMPLE_DECLS_EXPLAIN(
+ [[int ((int))], [type function (int) returning int], [int (int)]],
+ [[int (x(int))], [declare x as function (int) returning int], [int x(int)]],
+ [[int (())], [type function returning int], [int ()]])
+
+SIMPLE_DECLS_EXPLAIN(
+ [[int (x())], [declare x as function returning int], [int x()]],
+ [[int ((x)())], [declare x as function returning int], [int x()]])
+
+# Test that english-only keywords are not rejected as idenfitiers in C mode.
+SIMPLE_DECLS_EXPLAIN(
+ [[[of array[]]], [declare array as array of of]],
+ [[[returning as(function)]],
+ [declare as as function (function) returning returning]],
+ [[[pointer *declare]], [declare declare as pointer to pointer]],
+ [[[type to]], [declare to as type]])
+
+# Test the explain command with multiple declarators, which produces
+# multiple lines of English output.
+SIMPLE_DECLS_EXPLAIN(
+ [[int x, y], [m4_n([declare x as int])declare y as int]])
+
+# Check output spacing around qualified pointers
+SIMPLE_DECLS_DECLARE(
+ [[[int (* const)[]]], [type const pointer to array of int]],
+ [[[int (* volatile const)()]],
+ [type volatile const pointer to function returning int]],
+ [[[int (int * restrict const)]],
+ [type function (restrict const pointer to int) returning int]],
+ [[[int * const x]], [declare x as const pointer to int]],
+ [[[int * volatile * restrict x]],
+ [declare x as restrict pointer to volatile pointer to int]])
+
+# Test the simplify command with multiple declarators. This is the only
+# command in cdecl99 which will print a single C declaration with more than
+# one full declarator.
+SIMPLE_DECLS_SIMPLIFY(
+ [[int x, y], [int x, y]],
+ [[int (x), ((y))], [int x, y]])