+ return type;
+}
+
+static
+void parse_declarator(declaration_t *declaration, storage_class_t storage_class,
+ type_t *type, int may_be_abstract)
+{
+ declarator_part *part
+ = parse_inner_declarator(declaration, may_be_abstract);
+
+ if(part != NULL) {
+ declaration->type = construct_declarator_type(part, type);
+ declaration->storage_class = storage_class;
+ obstack_free(&temp_obst, part);
+ }
+}
+
+static
+type_t *parse_abstract_declarator(type_t *base_type)
+{
+ declarator_part *part = parse_inner_declarator(NULL, 1);
+
+ type_t *result = construct_declarator_type(part, base_type);
+ obstack_free(&temp_obst, part);
+
+ return result;
+}
+
+static void record_declaration(declaration_t *declaration)
+{
+ if(last_declaration != NULL) {
+ last_declaration->next = declaration;
+ } else {
+ if(context != NULL)
+ context->declarations = declaration;
+ }
+ last_declaration = declaration;
+}
+
+static
+void maybe_push_declaration(declaration_t *declaration)
+{