TYPE_INVALID,
TYPE_ERROR,
TYPE_ATOMIC,
+ TYPE_COMPLEX,
+ TYPE_IMAGINARY,
TYPE_COMPOUND_STRUCT,
TYPE_COMPOUND_UNION,
TYPE_ENUM,
};
struct atomic_type_t {
- type_base_t type;
+ type_base_t base;
+ atomic_type_kind_t akind;
+};
+
+struct complex_type_t {
+ type_base_t base;
+ atomic_type_kind_t akind;
+};
+
+struct imaginary_type_t {
+ type_base_t base;
atomic_type_kind_t akind;
};
struct builtin_type_t {
- type_base_t type;
+ type_base_t base;
symbol_t *symbol;
type_t *real_type;
};
struct pointer_type_t {
- type_base_t type;
+ type_base_t base;
type_t *points_to;
};
struct array_type_t {
- type_base_t type;
+ type_base_t base;
type_t *element_type;
expression_t *size_expression;
size_t size;
};
struct function_type_t {
- type_base_t type;
+ type_base_t base;
type_t *return_type;
function_parameter_t *parameters;
unsigned variadic : 1;
};
struct compound_type_t {
- type_base_t type;
+ type_base_t base;
/** the declaration of the compound type, the scope of the declaration
* contains the compound entries. */
declaration_t *declaration;
};
struct enum_type_t {
- type_base_t type;
+ type_base_t base;
/** the declaration of the enum type. You can find the enum entries by
* walking the declaration->next list until you don't find
* STORAGE_CLASS_ENUM_ENTRY declarations anymore */
};
struct typedef_type_t {
- type_base_t type;
+ type_base_t base;
declaration_t *declaration;
type_t *resolved_type;
};
struct typeof_type_t {
- type_base_t type;
+ type_base_t base;
expression_t *expression;
type_t *typeof_type;
type_t *resolved_type;
};
struct bitfield_type_t {
- type_base_t type;
- type_t *base;
+ type_base_t base;
+ type_t *base_type;
expression_t *size;
};
type_kind_t kind;
type_base_t base;
atomic_type_t atomic;
+ complex_type_t complex;
+ imaginary_type_t imaginary;
builtin_type_t builtin;
pointer_type_t pointer;
array_type_t array;
};
type_t *make_atomic_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
+type_t *make_complex_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
+type_t *make_imaginary_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
type_t *make_pointer_type(type_t *points_to, type_qualifiers_t qualifiers);
type_t *make_array_type(type_t *element_type, size_t size,
type_qualifiers_t qualifiers);