+typedef enum {
+ FUNCNAME_FUNCTION, /**< C99 __func__, older __FUNCTION__ */
+ FUNCNAME_PRETTY_FUNCTION, /**< GNUC __PRETTY_FUNCTION__ */
+ FUNCNAME_FUNCSIG, /**< MS __FUNCSIG__ */
+ FUNCNAME_FUNCDNAME /**< MS __FUNCDNAME__ */
+} funcname_kind_t;
+
+/* convenience macros */
+#define EXPR_BINARY_CASES \
+ case EXPR_BINARY_ADD: \
+ case EXPR_BINARY_SUB: \
+ case EXPR_BINARY_MUL: \
+ case EXPR_BINARY_DIV: \
+ case EXPR_BINARY_MOD: \
+ case EXPR_BINARY_EQUAL: \
+ case EXPR_BINARY_NOTEQUAL: \
+ case EXPR_BINARY_LESS: \
+ case EXPR_BINARY_LESSEQUAL: \
+ case EXPR_BINARY_GREATER: \
+ case EXPR_BINARY_GREATEREQUAL: \
+ case EXPR_BINARY_BITWISE_AND: \
+ case EXPR_BINARY_BITWISE_OR: \
+ case EXPR_BINARY_BITWISE_XOR: \
+ case EXPR_BINARY_LOGICAL_AND: \
+ case EXPR_BINARY_LOGICAL_OR: \
+ case EXPR_BINARY_SHIFTLEFT: \
+ case EXPR_BINARY_SHIFTRIGHT: \
+ case EXPR_BINARY_ASSIGN: \
+ case EXPR_BINARY_MUL_ASSIGN: \
+ case EXPR_BINARY_DIV_ASSIGN: \
+ case EXPR_BINARY_MOD_ASSIGN: \
+ case EXPR_BINARY_ADD_ASSIGN: \
+ case EXPR_BINARY_SUB_ASSIGN: \
+ case EXPR_BINARY_SHIFTLEFT_ASSIGN: \
+ case EXPR_BINARY_SHIFTRIGHT_ASSIGN: \
+ case EXPR_BINARY_BITWISE_AND_ASSIGN: \
+ case EXPR_BINARY_BITWISE_XOR_ASSIGN: \
+ case EXPR_BINARY_BITWISE_OR_ASSIGN: \
+ case EXPR_BINARY_COMMA: \
+ case EXPR_BINARY_BUILTIN_EXPECT: \
+ case EXPR_BINARY_ISGREATER: \
+ case EXPR_BINARY_ISGREATEREQUAL: \
+ case EXPR_BINARY_ISLESS: \
+ case EXPR_BINARY_ISLESSEQUAL: \
+ case EXPR_BINARY_ISLESSGREATER: \
+ case EXPR_BINARY_ISUNORDERED:
+
+#define EXPR_UNARY_CASES \
+ case EXPR_UNARY_NEGATE: \
+ case EXPR_UNARY_PLUS: \
+ case EXPR_UNARY_BITWISE_NEGATE: \
+ case EXPR_UNARY_NOT: \
+ case EXPR_UNARY_DEREFERENCE: \
+ case EXPR_UNARY_TAKE_ADDRESS: \
+ case EXPR_UNARY_POSTFIX_INCREMENT: \
+ case EXPR_UNARY_POSTFIX_DECREMENT: \
+ case EXPR_UNARY_PREFIX_INCREMENT: \
+ case EXPR_UNARY_PREFIX_DECREMENT: \
+ case EXPR_UNARY_CAST: \
+ case EXPR_UNARY_CAST_IMPLICIT: \
+ case EXPR_UNARY_ASSUME: \
+ case EXPR_UNARY_BITFIELD_EXTRACT:
+
+/**
+ * A scope containing declarations.
+ */
+struct scope_t {
+ declaration_t *declarations; /**< List of declarations in this scope. */
+ declaration_t *last_declaration; /**< last declaration in this scope. */
+};
+
+struct expression_base_t {
+ expression_kind_t kind;
+ type_t *type;
+ source_position_t source_position;
+};
+
+struct const_expression_t {
+ expression_base_t base;
+ union {
+ long long int_value;
+ long double float_value;
+ string_t character;
+ wide_string_t wide_character;
+ } v;
+ bool is_ms_noop; /**< True, if this constant is the result
+ of an microsoft __noop operator */
+};
+
+struct string_literal_expression_t {
+ expression_base_t base;
+ string_t value;
+};
+
+struct funcname_expression_t {
+ expression_base_t base;
+ funcname_kind_t kind;
+ string_t value; /**< the value once assigned. */
+};
+
+struct wide_string_literal_expression_t {
+ 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 base;
+ symbol_t *symbol;