+ EXPR_STATEMENT,
+
+ EXPR_UNARY_FIRST,
+ EXPR_UNARY_NEGATE = EXPR_UNARY_FIRST,
+ EXPR_UNARY_PLUS,
+ EXPR_UNARY_BITWISE_NEGATE,
+ EXPR_UNARY_NOT,
+ EXPR_UNARY_DEREFERENCE,
+ EXPR_UNARY_TAKE_ADDRESS,
+ EXPR_UNARY_POSTFIX_INCREMENT,
+ EXPR_UNARY_POSTFIX_DECREMENT,
+ EXPR_UNARY_PREFIX_INCREMENT,
+ EXPR_UNARY_PREFIX_DECREMENT,
+ EXPR_UNARY_CAST,
+ EXPR_UNARY_CAST_IMPLICIT, /**< compiler generated cast */
+ EXPR_UNARY_ASSUME, /**< MS __assume() */
+ EXPR_UNARY_LAST = EXPR_UNARY_ASSUME,
+
+ EXPR_BINARY_FIRST,
+ EXPR_BINARY_ADD = EXPR_BINARY_FIRST,
+ EXPR_BINARY_SUB,
+ EXPR_BINARY_MUL,
+ EXPR_BINARY_DIV,
+ EXPR_BINARY_MOD,
+ EXPR_BINARY_EQUAL,
+ EXPR_BINARY_NOTEQUAL,
+ EXPR_BINARY_LESS,
+ EXPR_BINARY_LESSEQUAL,
+ EXPR_BINARY_GREATER,
+ EXPR_BINARY_GREATEREQUAL,
+ EXPR_BINARY_BITWISE_AND,
+ EXPR_BINARY_BITWISE_OR,
+ EXPR_BINARY_BITWISE_XOR,
+ EXPR_BINARY_LOGICAL_AND,
+ EXPR_BINARY_LOGICAL_OR,
+ EXPR_BINARY_SHIFTLEFT,
+ EXPR_BINARY_SHIFTRIGHT,
+ EXPR_BINARY_ASSIGN,
+ EXPR_BINARY_MUL_ASSIGN,
+ EXPR_BINARY_DIV_ASSIGN,
+ EXPR_BINARY_MOD_ASSIGN,
+ EXPR_BINARY_ADD_ASSIGN,
+ EXPR_BINARY_SUB_ASSIGN,
+ EXPR_BINARY_SHIFTLEFT_ASSIGN,
+ EXPR_BINARY_SHIFTRIGHT_ASSIGN,
+ EXPR_BINARY_BITWISE_AND_ASSIGN,
+ EXPR_BINARY_BITWISE_XOR_ASSIGN,
+ EXPR_BINARY_BITWISE_OR_ASSIGN,
+ EXPR_BINARY_COMMA,
+
+ EXPR_BINARY_BUILTIN_EXPECT,
+ EXPR_BINARY_ISGREATER,
+ EXPR_BINARY_ISGREATEREQUAL,
+ EXPR_BINARY_ISLESS,
+ EXPR_BINARY_ISLESSEQUAL,
+ EXPR_BINARY_ISLESSGREATER,
+ EXPR_BINARY_ISUNORDERED,
+ EXPR_BINARY_LAST = EXPR_BINARY_ISUNORDERED,
+} expression_kind_t;
+
+typedef enum funcname_kind_t {
+ 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:
+
+/**
+ * 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;
+#ifndef NDEBUG
+ bool transformed;
+#endif
+};