+static void print_compound_type(const compound_type_t *type)
+{
+ print_type_qualifiers(type->type.qualifiers);
+
+ if(type->type.type == TYPE_COMPOUND_STRUCT) {
+ fputs("struct ", out);
+ } else {
+ assert(type->type.type == TYPE_COMPOUND_UNION);
+ fputs("union ", out);
+ }
+
+ declaration_t *declaration = type->declaration;
+ symbol_t *symbol = declaration->symbol;
+ if(symbol != NULL) {
+ fputs(symbol->string, out);
+ } else {
+ print_compound_definition(declaration);
+ }
+}
+
+static void print_typedef_type_pre(typedef_type_t *type)
+{
+ fputs(type->declaration->symbol->string, out);
+}
+
+static void print_typeof_type_pre(typeof_type_t *type)
+{
+ fputs("typeof(", out);
+ if(type->expression != NULL) {
+ assert(type->typeof_type == NULL);
+ print_expression(type->expression);
+ } else {
+ print_type(type->typeof_type);
+ }
+ fputc(')', out);
+}
+
+static void intern_print_type_pre(type_t *type)