+static int
+normalize_specs(struct cdecl_declarator **p, struct cdecl_declarator *d)
+{
+ struct cdecl_function *func;
+ struct cdecl_pointer *ptr;
+
+ switch (d->type) {
+ case CDECL_DECL_POINTER:
+ ptr = &d->u.pointer;
+ ptr->qualifiers = cdecl__normalize_specs(ptr->qualifiers);
+ break;
+ case CDECL_DECL_FUNCTION:
+ func = &d->u.function;
+ for (struct cdecl *i = func->parameters; i; i = i->next)
+ i->specifiers = cdecl__normalize_specs(i->specifiers);
+ break;
+ }
+
+ return 0;
+}
+
+static int
+check_qualifiers(struct cdecl_declarator **p, struct cdecl_declarator *d)
+{
+ struct cdecl_declspec *spec;
+ struct cdecl_pointer *ptr;
+
+ if (!d->child || d->child->type != CDECL_DECL_POINTER)
+ return 0;
+
+ ptr = &d->child->u.pointer;
+ for (spec = ptr->qualifiers; spec; spec = spec->next) {
+ if (spec->type == CDECL_QUAL_RESTRICT
+ && d->type == CDECL_DECL_FUNCTION) {
+ fprintf(stderr, "function pointers cannot be restrict-qualified\n");
+ return -1;
+ }
+ }
+
+ return 0;
+}
+