EXPR_VA_START,
EXPR_VA_ARG,
EXPR_STATEMENT,
+ EXPR_LABEL_ADDRESS, /**< GCC extension &&label operator */
EXPR_UNARY_FIRST,
EXPR_UNARY_NEGATE = EXPR_UNARY_FIRST,
struct scope_t {
declaration_t *declarations; /**< List of declarations in this scope. */
declaration_t *last_declaration; /**< last declaration in this scope. */
+ scope_t *parent; /**< points to the parent scope. */
+ unsigned depth; /**< while parsing, the depth of this scope in the scope stack. */
+ bool is_parameter; /**< Set if this scope is a parameter scope. */
};
struct expression_base_t {
struct reference_expression_t {
expression_base_t base;
declaration_t *declaration;
+ bool is_outer_ref; /**< Set, if this referenced a variable
+ outside of an inner function */
};
struct call_argument_t {
struct select_expression_t {
expression_base_t base;
expression_t *compound;
- symbol_t *symbol;
-
declaration_t *compound_entry;
};
expression_base_t base;
expression_t *array_ref;
expression_t *index;
- bool flipped; /* index/ref was written in a 5[a] way */
+ bool flipped; /**< index/ref was written in a 5[a] way */
};
struct typeprop_expression_t {
expression_t *type_expression;
};
+struct label_address_expression_t {
+ expression_base_t base;
+ declaration_t *declaration;
+};
+
union expression_t {
expression_kind_t kind;
expression_base_t base;
conditional_expression_t conditional;
statement_expression_t statement;
classify_type_expression_t classify_type;
+ label_address_expression_t label_address;
};
typedef enum storage_class_tag_t {
NAMESPACE_UNION,
NAMESPACE_ENUM,
NAMESPACE_LABEL,
+ NAMESPACE_LOCAL_LABEL
} namespace_t;
typedef enum initializer_kind_t {
DM_NOALIAS = 1 << 12,
DM_PACKED = 1 << 13,
DM_TRANSPARENT_UNION = 1 << 14,
- DM_PURE = 1 << 15,
- DM_CONSTRUCTOR = 1 << 16,
- DM_DESTRUCTOR = 1 << 17,
- DM_USED = 1 << 18,
- DM_CDECL = 1 << 19,
- DM_FASTCALL = 1 << 20,
- DM_STDCALL = 1 << 21,
- DM_THISCALL = 1 << 22
+ DM_CONST = 1 << 15,
+ DM_PURE = 1 << 16,
+ DM_CONSTRUCTOR = 1 << 17,
+ DM_DESTRUCTOR = 1 << 18,
+ DM_UNUSED = 1 << 19,
+ DM_USED = 1 << 20,
+ DM_CDECL = 1 << 21,
+ DM_FASTCALL = 1 << 22,
+ DM_STDCALL = 1 << 23,
+ DM_THISCALL = 1 << 24,
+ DM_DEPRECATED = 1 << 25
} decl_modifier_t;
typedef unsigned decl_modifiers_t;
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 address_taken : 1; /**< Set if the address of this declaration was taken. */
unsigned int is_inline : 1;
unsigned int used : 1; /**< Set if the declaration is used. */
- unsigned int deprecated : 1; /**< Microsoft or GNU deprecated attribute. */
+ unsigned int implicit : 1; /**< Set for implicit (not found in source code) declarations. */
+ unsigned int need_closure : 1; /**< Inner function needs closure. */
+ unsigned int goto_to_outer : 1; /**< Inner function has goto to outer function. */
type_t *type;
+ il_size_t offset; /**< The offset of this member inside a compound. */
symbol_t *symbol;
+ string_t *asm_name; /**< GCC extension: ASM label. */
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 */
+ bool complete; /**< used to indicate whether struct/union types are already defined or if just the name is declared */
statement_t *statement;
initializer_t *initializer;
expression_t *enum_value;
STATEMENT_DO_WHILE,
STATEMENT_FOR,
STATEMENT_ASM,
- STATEMENT_MS_TRY,
- STATEMENT_LEAVE
+ STATEMENT_MS_TRY, /**< MS __try/__finally or __try/__except */
+ STATEMENT_LEAVE /**< MS __leave */
} statement_kind_t;
struct statement_base_t {
statement_kind_t kind;
statement_t *next;
source_position_t source_position;
+ statement_t *parent;
+ bool reachable;
#ifndef NDEBUG
bool transformed;
#endif
};
struct switch_statement_t {
- statement_base_t base;
+ statement_base_t base;
expression_t *expression;
statement_t *body;
- case_label_statement_t *first_case, *last_case;
+ case_label_statement_t *first_case, *last_case; /**< List of all cases, including default. */
+ case_label_statement_t *default_label; /**< The default label if existent. */
+ unsigned long default_proj_nr; /**< The Proj-number for the default Proj. */
};
struct goto_statement_t {
statement_base_t base;
- declaration_t *label; /**< The destination label. */
- goto_statement_t *next; /**< links all goto statements of a function */
+ declaration_t *label; /**< The destination label. */
+ expression_t *expression; /**< The expression for an assigned goto. */
+ goto_statement_t *next; /**< links all goto statements of a function */
+ bool outer_fkt_jmp; /**< Set if this goto jump to an outer function. */
};
struct case_label_statement_t {
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. */
+ 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. */
+ case_label_statement_t *next; /**< link to the next case label in switch */
statement_t *statement;
- case_label_statement_t *next; /**< link to the next case label in switch */
+ long first_case; /**< The folded value of expression. */
+ long last_case; /**< The folded value of end_range. */
+ bool is_bad; /**< If set marked as bad to suppress warnings. */
+ bool is_empty_range; /**< If set marked this as an empty range. */
};
struct label_statement_t {
expression_t *step;
statement_t *body;
scope_t scope;
+ bool condition_reachable:1;
+ bool step_reachable:1;
};
struct asm_argument_t {