+struct classify_type_expression_t {
+ expression_base_t base;
+ expression_t *type_expression;
+};
+
+union expression_t {
+ expression_kind_t kind;
+ expression_base_t base;
+ const_expression_t conste;
+ funcname_expression_t funcname;
+ string_literal_expression_t string;
+ wide_string_literal_expression_t wide_string;
+ compound_literal_expression_t compound_literal;
+ builtin_symbol_expression_t builtin_symbol;
+ builtin_constant_expression_t builtin_constant;
+ builtin_prefetch_expression_t builtin_prefetch;
+ reference_expression_t reference;
+ call_expression_t call;
+ unary_expression_t unary;
+ binary_expression_t binary;
+ select_expression_t select;
+ array_access_expression_t array_access;
+ typeprop_expression_t typeprop;
+ offsetof_expression_t offsetofe;
+ va_start_expression_t va_starte;
+ va_arg_expression_t va_arge;
+ conditional_expression_t conditional;
+ statement_expression_t statement;
+ classify_type_expression_t classify_type;
+};
+
+typedef enum {
+ STORAGE_CLASS_NONE,
+ STORAGE_CLASS_EXTERN,
+ STORAGE_CLASS_STATIC,
+ STORAGE_CLASS_TYPEDEF,
+ STORAGE_CLASS_AUTO,
+ STORAGE_CLASS_REGISTER,
+ STORAGE_CLASS_ENUM_ENTRY,
+ STORAGE_CLASS_THREAD,
+ STORAGE_CLASS_THREAD_EXTERN,
+ STORAGE_CLASS_THREAD_STATIC,
+} storage_class_tag_t;
+
+typedef enum {
+ NAMESPACE_NORMAL,
+ NAMESPACE_STRUCT,
+ NAMESPACE_UNION,
+ NAMESPACE_ENUM,
+ NAMESPACE_LABEL,
+} namespace_t;
+
+typedef enum {
+ INITIALIZER_VALUE,
+ INITIALIZER_LIST,
+ INITIALIZER_STRING,
+ INITIALIZER_WIDE_STRING,
+ INITIALIZER_DESIGNATOR
+} initializer_kind_t;
+
+struct initializer_base_t {
+ initializer_kind_t kind;
+};
+
+struct initializer_value_t {
+ initializer_base_t base;
+ expression_t *value;
+};
+
+struct initializer_list_t {
+ initializer_base_t base;
+ size_t len;
+ initializer_t *initializers[];
+};
+
+struct initializer_string_t {
+ initializer_base_t base;
+ string_t string;
+};
+
+struct initializer_wide_string_t {
+ initializer_base_t base;
+ wide_string_t string;
+};
+
+struct initializer_designator_t {
+ initializer_base_t base;
+ designator_t *designator;
+};
+
+union initializer_t {
+ initializer_kind_t kind;
+ initializer_base_t base;
+ initializer_value_t value;
+ initializer_list_t list;
+ initializer_string_t string;
+ initializer_wide_string_t wide_string;
+ initializer_designator_t designator;
+};
+
+/**
+ * GNU attributes.
+ */
+typedef enum gnu_attribute_kind_t {
+ GNU_AK_CONST,
+ GNU_AK_VOLATILE,
+ GNU_AK_CDECL,
+ GNU_AK_STDCALL,
+ GNU_AK_FASTCALL,
+ GNU_AK_DEPRECATED,
+ GNU_AK_NOINLINE,
+ GNU_AK_NORETURN,
+ GNU_AK_NAKED,
+ GNU_AK_PURE,
+ GNU_AK_ALWAYS_INLINE,
+ GNU_AK_MALLOC,
+ GNU_AK_WEAK,
+ GNU_AK_CONSTRUCTOR,
+ GNU_AK_DESTRUCTOR,
+ GNU_AK_NOTHROW,
+ GNU_AK_TRANSPARENT_UNION,
+ GNU_AK_COMMON,
+ GNU_AK_NOCOMMON,
+ GNU_AK_PACKED,
+ GNU_AK_SHARED,
+ GNU_AK_NOTSHARED,
+ GNU_AK_USED,
+ GNU_AK_UNUSED,
+ GNU_AK_NO_INSTRUMENT_FUNCTION,
+ GNU_AK_WARN_UNUSED_RESULT,
+ GNU_AK_LONGCALL,
+ GNU_AK_SHORTCALL,
+ GNU_AK_LONG_CALL,
+ GNU_AK_SHORT_CALL,
+ GNU_AK_FUNCTION_VECTOR,
+ GNU_AK_INTERRUPT,
+ GNU_AK_INTERRUPT_HANDLER,
+ GNU_AK_NMI_HANDLER,
+ GNU_AK_NESTING,
+ GNU_AK_NEAR,
+ GNU_AK_FAR,
+ GNU_AK_SIGNAL,
+ GNU_AK_EIGTHBIT_DATA,
+ GNU_AK_TINY_DATA,
+ GNU_AK_SAVEALL,
+ GNU_AK_FLATTEN,
+ GNU_AK_SSEREGPARM,
+ GNU_AK_EXTERNALLY_VISIBLE,
+ GNU_AK_RETURN_TWICE,
+ GNU_AK_MAY_ALIAS,
+ GNU_AK_MS_STRUCT,
+ GNU_AK_GCC_STRUCT,
+ GNU_AK_DLLIMPORT,
+ GNU_AK_DLLEXPORT,
+ GNU_AK_ALIGNED,
+ GNU_AK_ALIAS,
+ GNU_AK_SECTION,
+ GNU_AK_FORMAT,
+ GNU_AK_FORMAT_ARG,
+ GNU_AK_WEAKREF,
+ GNU_AK_NONNULL,
+ GNU_AK_TLS_MODEL,
+ GNU_AK_VISIBILITY,
+ GNU_AK_REGPARM,
+ GNU_AK_MODEL,
+ GNU_AK_MODE,
+ GNU_AK_TRAP_EXIT,
+ GNU_AK_SP_SWITCH,
+ GNU_AK_SENTINEL,
+ GNU_AK_LAST
+} gnu_attribute_kind_t;
+
+/**
+ * Extended microsoft modifier.
+ */
+typedef enum {
+ DM_DLLIMPORT = (1 << 0),
+ DM_DLLEXPORT = (1 << 1),
+ DM_THREAD = (1 << 2),
+ DM_NAKED = (1 << 3),
+ DM_MICROSOFT_INLINE = (1 << 4),
+ DM_FORCEINLINE = (1 << 5),
+ DM_SELECTANY = (1 << 6),
+ DM_NOTHROW = (1 << 7),
+ DM_NOVTABLE = (1 << 8),
+ DM_NORETURN = (1 << 9),
+ DM_NOINLINE = (1 << 10),
+ DM_RESTRICT = (1 << 11),
+ DM_NOALIAS = (1 << 12)
+} decl_modifier_t;
+
+typedef unsigned short decl_modifiers_t;
+
+struct declaration_t {
+ unsigned char namespc;
+ unsigned char declared_storage_class;
+ unsigned char storage_class;
+ unsigned char alignment; /**< Alignment of the declaration, 0 for default. */
+ decl_modifiers_t decl_modifiers; /**< MS __declspec modifiers. */
+ const char *deprecated_string; /**< MS deprecated string if any. */
+ symbol_t *get_property_sym; /**< MS get property. */
+ symbol_t *put_property_sym; /**< MS put property. */
+ unsigned int address_taken : 1;
+ unsigned int is_inline : 1;
+ unsigned int used : 1; /**< Set if the declaration is used. */
+ unsigned int deprecated : 1; /**< Microsoft or GNU deprecated attribute. */
+ type_t *type;
+ symbol_t *symbol;
+ source_position_t source_position;
+ union {
+ bool complete; /**< used to indicate wether struct/union types are already defined or if just the name is declared */
+ statement_t *statement;
+ initializer_t *initializer;
+ expression_t *enum_value;
+ } init;
+ scope_t scope; /**< The scope that this declaration opens. */
+ scope_t *parent_scope; /**< The parent scope where this declaration lives. */
+
+ /** next declaration in a scope */
+ declaration_t *next;
+ /** next declaration with same symbol */
+ declaration_t *symbol_next;
+
+ /* the following fields are used in ast2firm module */
+ unsigned char declaration_kind;
+ union {
+ unsigned int value_number;
+ ir_entity *entity;
+ ir_node *block;
+ ir_node *vla_base;
+ tarval *enum_val;
+ ir_type *irtype;
+ } v;