+/* Binstore
+ *
+ * An assignment including a binary expression with the source as left operand.
+ * Eg. a += b; is a binstore { INSTR_STORE, INSTR_ADD, a, b }
+ */
+struct ast_binstore_s
+{
+ ast_expression_common expression;
+
+ int opstore;
+ int opbin;
+ ast_expression *dest;
+ ast_expression *source;
+};
+ast_binstore* ast_binstore_new(lex_ctx ctx,
+ int storeop,
+ int op,
+ ast_expression *left,
+ ast_expression *right);
+void ast_binstore_delete(ast_binstore*);
+
+bool ast_binstore_codegen(ast_binstore*, ast_function*, bool lvalue, ir_value**);
+
+/* Unary
+ *
+ * Regular unary expressions: not,neg
+ */
+struct ast_unary_s
+{
+ ast_expression_common expression;
+
+ int op;
+ ast_expression *operand;
+};
+ast_unary* ast_unary_new(lex_ctx ctx,
+ int op,
+ ast_expression *expr);
+void ast_unary_delete(ast_unary*);
+
+bool ast_unary_codegen(ast_unary*, ast_function*, bool lvalue, ir_value**);
+
+/* Return
+ *
+ * Make sure 'return' only happens at the end of a block, otherwise the IR
+ * will refuse to create further instructions.
+ * This should be honored by the parser.
+ */
+struct ast_return_s
+{
+ ast_expression_common expression;
+ ast_expression *operand;
+};
+ast_return* ast_return_new(lex_ctx ctx,
+ ast_expression *expr);
+void ast_return_delete(ast_return*);
+
+bool ast_return_codegen(ast_return*, ast_function*, bool lvalue, ir_value**);
+