EXPR_INVALID,
EXPR_REFERENCE,
EXPR_CONST,
+ EXPR_CHAR_CONST,
EXPR_STRING_LITERAL,
EXPR_WIDE_STRING_LITERAL,
+ EXPR_COMPOUND_LITERAL,
EXPR_CALL,
EXPR_CONDITIONAL,
EXPR_SELECT,
case EXPR_UNARY_BITFIELD_EXTRACT:
struct scope_t {
- declaration_t *declarations; /**< List of declarations in this scope. */
+ declaration_t *declarations; /**< List of declarations in this scope. */
+ declaration_t *last_declaration;
};
struct expression_base_t {
expression_kind_t kind;
- type_t *datatype;
+ type_t *type;
source_position_t source_position;
};
struct const_expression_t {
- expression_base_t expression;
+ expression_base_t base;
union {
- long long int_value;
- long double float_value;
+ long long int_value;
+ long double float_value;
+ string_t chars;
} v;
};
struct string_literal_expression_t {
- expression_base_t expression;
+ expression_base_t base;
string_t value;
};
struct wide_string_literal_expression_t {
- expression_base_t expression;
+ expression_base_t base;
wide_string_t value;
};
+struct compound_literal_expression_t {
+ expression_base_t base;
+ type_t *type;
+ initializer_t *initializer;
+};
+
struct builtin_symbol_expression_t {
- expression_base_t expression;
+ expression_base_t base;
symbol_t *symbol;
};
struct builtin_constant_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *value;
};
struct builtin_prefetch_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *adr;
expression_t *rw;
expression_t *locality;
};
struct reference_expression_t {
- expression_base_t expression;
+ expression_base_t base;
symbol_t *symbol;
declaration_t *declaration;
};
};
struct call_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *function;
call_argument_t *arguments;
};
struct unary_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *value;
};
struct binary_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *left;
expression_t *right;
};
struct select_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *compound;
symbol_t *symbol;
};
struct array_access_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *array_ref;
expression_t *index;
bool flipped; /* index/ref was written in a 5[a] way */
};
struct typeprop_expression_t {
- expression_base_t expression;
+ expression_base_t base;
type_t *type;
expression_t *tp_expression;
};
struct designator_t {
- symbol_t *symbol;
- expression_t *array_access;
- designator_t *next;
+ source_position_t source_position;
+ symbol_t *symbol;
+ expression_t *array_index;
+ designator_t *next;
};
struct offsetof_expression_t {
- expression_base_t expression;
+ expression_base_t base;
type_t *type;
designator_t *designator;
};
struct va_start_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *ap;
declaration_t *parameter;
};
struct va_arg_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *ap;
};
struct conditional_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *condition;
expression_t *true_expression;
expression_t *false_expression;
};
struct statement_expression_t {
- expression_base_t expression;
+ expression_base_t base;
statement_t *statement;
};
struct classify_type_expression_t {
- expression_base_t expression;
+ expression_base_t base;
expression_t *type_expression;
};
const_expression_t conste;
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;
typedef enum {
STORAGE_CLASS_NONE,
- STORAGE_CLASS_TYPEDEF,
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_THREAD_STATIC,
} storage_class_tag_t;
typedef enum {
INITIALIZER_VALUE,
INITIALIZER_LIST,
INITIALIZER_STRING,
- INITIALIZER_WIDE_STRING
+ INITIALIZER_WIDE_STRING,
+ INITIALIZER_DESIGNATOR
} initializer_kind_t;
struct initializer_base_t {
};
struct initializer_value_t {
- initializer_base_t initializer;
+ initializer_base_t base;
expression_t *value;
};
struct initializer_list_t {
- initializer_base_t initializer;
+ initializer_base_t base;
size_t len;
initializer_t *initializers[];
};
struct initializer_string_t {
- initializer_base_t initializer;
+ initializer_base_t base;
string_t string;
};
struct initializer_wide_string_t {
- initializer_base_t initializer;
+ 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_list_t list;
initializer_string_t string;
initializer_wide_string_t wide_string;
+ initializer_designator_t designator;
};
typedef enum {
struct declaration_t {
unsigned char namespc;
+ unsigned char declared_storage_class;
unsigned char storage_class;
decl_modifiers_t modifiers;
unsigned int address_taken : 1;
declaration_t *next;
/** next declaration with same symbol */
declaration_t *symbol_next;
- /** next variable/parameter in function scope/global scope */
- declaration_t *next_var;
/* the following fields are used in ast2firm module */
unsigned char declaration_kind;
ir_entity *entity;
ir_node *block;
tarval *enum_val;
+ ir_type *irtype;
} v;
};
};
struct return_statement_t {
- statement_base_t statement;
- expression_t *return_value;
+ statement_base_t base;
+ expression_t *value;
};
struct compound_statement_t {
- statement_base_t statement;
+ statement_base_t base;
statement_t *statements;
scope_t scope;
};
struct declaration_statement_t {
- statement_base_t statement;
+ statement_base_t base;
declaration_t *declarations_begin;
declaration_t *declarations_end;
};
struct if_statement_t {
- statement_base_t statement;
+ statement_base_t base;
expression_t *condition;
statement_t *true_statement;
statement_t *false_statement;
};
struct switch_statement_t {
- statement_base_t statement;
+ statement_base_t base;
expression_t *expression;
statement_t *body;
case_label_statement_t *first_case, *last_case;
};
struct goto_statement_t {
- statement_base_t statement;
+ statement_base_t base;
declaration_t *label; /**< The destination label. */
goto_statement_t *next; /**< links all goto statements of a function */
};
struct case_label_statement_t {
- statement_base_t statement;
- expression_t *expression;
- statement_t *label_statement;
- case_label_statement_t *next; /**< link to the next case label in the switch */
+ statement_base_t base;
+ expression_t *expression; /**< The case label expression, NULL for default label. */
+ expression_t *end_range; /**< For GNUC case a .. b: the end range expression, NULL else. */
+ statement_t *statement;
+ case_label_statement_t *next; /**< link to the next case label in switch */
};
struct label_statement_t {
- statement_base_t statement;
+ statement_base_t base;
declaration_t *label;
- statement_t *label_statement;
- label_statement_t *next; /**< links all label statements of a function */
+ statement_t *statement;
+ label_statement_t *next; /**< links all label statements of a function */
};
struct expression_statement_t {
- statement_base_t statement;
+ statement_base_t base;
expression_t *expression;
};
struct while_statement_t {
- statement_base_t statement;
+ statement_base_t base;
expression_t *condition;
statement_t *body;
};
struct do_while_statement_t {
- statement_base_t statement;
+ statement_base_t base;
expression_t *condition;
statement_t *body;
};
struct for_statement_t {
- statement_base_t statement;
+ statement_base_t base;
expression_t *initialisation;
expression_t *condition;
expression_t *step;
};
struct asm_statement_t {
- statement_base_t statement;
+ statement_base_t base;
string_t asm_text;
asm_constraint_t *inputs;
asm_constraint_t *outputs;