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 select_expression_t {
expression_base_t base;
expression_t *compound;
- symbol_t *symbol;
-
declaration_t *compound_entry;
};
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 {
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 implicit : 1; /**< Set for implicit (not found in source code) declarations. */
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 {
};
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 */
};
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 {