static int type_visited = 0;
static bool print_implicit_array_size = false;
-static void intern_print_type_pre(const type_t *type, bool top);
-static void intern_print_type_post(const type_t *type, bool top);
+static void intern_print_type_pre(const type_t *type);
+static void intern_print_type_post(const type_t *type);
typedef struct atomic_type_properties_t atomic_type_properties_t;
struct atomic_type_properties_t {
* Print the first part (the prefix) of a type.
*
* @param type The type to print.
- * @param top true, if this is the top type, false if it's an embedded type.
*/
-static void print_function_type_pre(const function_type_t *type, bool top)
+static void print_function_type_pre(const function_type_t *type)
{
switch (type->linkage) {
case LINKAGE_INVALID:
if (type->base.qualifiers != 0)
fputc(' ', out);
- intern_print_type_pre(type->return_type, false);
+ intern_print_type_pre(type->return_type);
switch (type->calling_convention) {
case CC_CDECL: fputs("__cdecl ", out); break;
case CC_THISCALL: fputs("__thiscall ", out); break;
case CC_DEFAULT: break;
}
-
- /* don't emit parenthesis if we're the toplevel type... */
- if (!top)
- fputc('(', out);
}
/**
* Print the second part (the postfix) of a type.
*
* @param type The type to print.
- * @param top true, if this is the top type, false if it's an embedded type.
*/
static void print_function_type_post(const function_type_t *type,
- const scope_t *parameters, bool top)
+ const scope_t *parameters)
{
- /* don't emit parenthesis if we're the toplevel type... */
- if (!top)
- fputc(')', out);
-
fputc('(', out);
bool first = true;
if (parameters == NULL) {
}
fputc(')', out);
- intern_print_type_post(type->return_type, false);
+ intern_print_type_post(type->return_type);
}
/**
*/
static void print_pointer_type_pre(const pointer_type_t *type)
{
- intern_print_type_pre(type->points_to, false);
+ type_t const *const points_to = type->points_to;
+ intern_print_type_pre(points_to);
+ if (points_to->kind == TYPE_ARRAY || points_to->kind == TYPE_FUNCTION)
+ fputs(" (", out);
variable_t *const variable = type->base_variable;
if (variable != NULL) {
fputs(" __based(", out);
}
/**
- * Prints the prefix part of a reference type.
+ * Prints the postfix part of a pointer type.
*
- * @param type The reference type.
+ * @param type The pointer type.
*/
-static void print_reference_type_pre(const reference_type_t *type)
+static void print_pointer_type_post(const pointer_type_t *type)
{
- intern_print_type_pre(type->refers_to, false);
- fputc('&', out);
+ type_t const *const points_to = type->points_to;
+ if (points_to->kind == TYPE_ARRAY || points_to->kind == TYPE_FUNCTION)
+ fputc(')', out);
+ intern_print_type_post(points_to);
}
/**
- * Prints the postfix part of a pointer type.
+ * Prints the prefix part of a reference type.
*
- * @param type The pointer type.
+ * @param type The reference type.
*/
-static void print_pointer_type_post(const pointer_type_t *type)
+static void print_reference_type_pre(const reference_type_t *type)
{
- intern_print_type_post(type->points_to, false);
+ type_t const *const refers_to = type->refers_to;
+ intern_print_type_pre(refers_to);
+ if (refers_to->kind == TYPE_ARRAY || refers_to->kind == TYPE_FUNCTION)
+ fputs(" (", out);
+ fputc('&', out);
}
/**
*/
static void print_reference_type_post(const reference_type_t *type)
{
- intern_print_type_post(type->refers_to, false);
+ type_t const *const refers_to = type->refers_to;
+ if (refers_to->kind == TYPE_ARRAY || refers_to->kind == TYPE_FUNCTION)
+ fputc(')', out);
+ intern_print_type_post(refers_to);
}
/**
*/
static void print_array_type_pre(const array_type_t *type)
{
- intern_print_type_pre(type->element_type, false);
+ intern_print_type_pre(type->element_type);
}
/**
print_expression(type->size_expression);
}
fputc(']', out);
- intern_print_type_post(type->element_type, false);
+ intern_print_type_post(type->element_type);
}
/**
{
fputs(" : ", out);
print_expression(type->size_expression);
- intern_print_type_post(type->base_type, false);
+ intern_print_type_post(type->base_type);
}
/**
* Prints the prefix part of a type.
*
* @param type The type.
- * @param top true if we print the toplevel type, false else.
*/
-static void intern_print_type_pre(const type_t *const type, const bool top)
+static void intern_print_type_pre(const type_t *const type)
{
switch(type->kind) {
case TYPE_ERROR:
fputs(type->builtin.symbol->string, out);
return;
case TYPE_FUNCTION:
- print_function_type_pre(&type->function, top);
+ print_function_type_pre(&type->function);
return;
case TYPE_POINTER:
print_pointer_type_pre(&type->pointer);
print_reference_type_pre(&type->reference);
return;
case TYPE_BITFIELD:
- intern_print_type_pre(type->bitfield.base_type, top);
+ intern_print_type_pre(type->bitfield.base_type);
return;
case TYPE_ARRAY:
print_array_type_pre(&type->array);
* Prints the postfix part of a type.
*
* @param type The type.
- * @param top true if we print the toplevel type, false else.
*/
-static void intern_print_type_post(const type_t *const type, const bool top)
+static void intern_print_type_post(const type_t *const type)
{
switch(type->kind) {
case TYPE_FUNCTION:
- print_function_type_post(&type->function, NULL, top);
+ print_function_type_post(&type->function, NULL);
return;
case TYPE_POINTER:
print_pointer_type_post(&type->pointer);
return;
}
- intern_print_type_pre(type, true);
+ intern_print_type_pre(type);
if (symbol != NULL) {
fputc(' ', out);
fputs(symbol->string, out);
}
if (type->kind == TYPE_FUNCTION) {
- print_function_type_post(&type->function, parameters, true);
+ print_function_type_post(&type->function, parameters);
} else {
- intern_print_type_post(type, true);
+ intern_print_type_post(type);
}
}
type = typedef_type->typedefe->type;
continue;
}
- case TYPE_TYPEOF: {
+ case TYPE_TYPEOF:
qualifiers |= type->base.qualifiers;
modifiers |= type->base.modifiers;
-
- const typeof_type_t *typeof_type = &type->typeoft;
- if (typeof_type->typeof_type != NULL) {
- type = typeof_type->typeof_type;
- } else {
- type = typeof_type->expression->base.type;
- }
+ type = type->typeoft.typeof_type;
continue;
- }
default:
break;
}
else
type = typedef_type->typedefe->type;
continue;
- case TYPE_TYPEOF: {
- const typeof_type_t *typeof_type = &type->typeoft;
- if (typeof_type->typeof_type != NULL) {
- type = typeof_type->typeof_type;
- } else {
- type = typeof_type->expression->base.type;
- }
+ case TYPE_TYPEOF:
+ type = type->typeoft.typeof_type;
continue;
- }
case TYPE_ARRAY:
if (skip_array_type) {
type = type->array.element_type;