- switch (map) {
- case BITS(VOID):
- case BITS(CHAR):
- case BITS(SIGNED, CHAR):
- case BITS(UNSIGNED, CHAR):
- case BITS(SHORT):
- case BITS(SIGNED, SHORT):
- case BITS(SHORT, INT):
- case BITS(SIGNED, SHORT, INT):
- case BITS(UNSIGNED, SHORT):
- case BITS(UNSIGNED, SHORT, INT):
- case BITS(INT):
- case BITS(SIGNED):
- case BITS(SIGNED, INT):
- case BITS(UNSIGNED):
- case BITS(UNSIGNED, INT):
- case BITS(LONG):
- case BITS(SIGNED, LONG):
- case BITS(SIGNED, LONG, INT):
- case BITS(UNSIGNED, LONG):
- case BITS(UNSIGNED, LONG, INT):
- case BITS(LLONG, LONG):
- case BITS(SIGNED, LLONG, LONG):
- case BITS(SIGNED, LLONG, LONG, INT):
- case BITS(UNSIGNED, LLONG, LONG):
- case BITS(UNSIGNED, LLONG, LONG, INT):
- case BITS(BOOL):
- case BITS(FLOAT):
- case BITS(DOUBLE):
- case BITS(LONG, DOUBLE):
- case BITS(FLOAT, COMPLEX):
- case BITS(DOUBLE, COMPLEX):
- case BITS(LONG, DOUBLE, COMPLEX):
- case BITS(STRUCT):
- case BITS(UNION):
- case BITS(ENUM):
- case BITS(IDENT):
+ if (!d->u.function.parameters)
+ return false; /* e.g., int f() */
+ if (d->u.function.parameters->next)
+ return false; /* e.g., int (x, y) */
+ if (d->u.function.variadic)
+ return false; /* e.g., int (x, ...) */
+
+ if (d->u.function.parameters->specifiers->type != CDECL_TYPE_IDENT)
+ return false; /* e.g. int (int) */
+ if (d->u.function.parameters->specifiers->next)
+ return false; /* e.g. int (size_t const) */
+ if (d->u.function.parameters->declarators->type == CDECL_DECL_POINTER)
+ return false; /* e.g. int (x *) */
+
+ return true;
+}
+
+static int
+simplify_functions(struct cdecl_declarator **p, struct cdecl_declarator *d)
+{
+ struct cdecl_declarator *new;
+
+ if (!function_is_reducible(d))