// File: /workspace/github_cpp_makefile_star2_O2/CobaltXII[P]cxcc/./semantic/semantic_analyzer.hpp
// Function: semantic_analyzer_t::expand_ast(expression_t*&)
void expand_ast(expression_t*& expression) {
		if (expression->type == et_indexing) {
			// Convert an indexing expression to an unary expression that
			// takes the value of the addition of the index to the array. For
			// example:
			//     x[y] -> *(x + y)
			expand_ast(expression->indexing.array);
			expand_ast(expression->indexing.index);
			expression_t* array = expression->indexing.array;
			expression_t* index = expression->indexing.index;
			expression = new expression_t(
				(unary_expression_t){
					new expression_t(
						(binary_expression_t){
							array,
							index,
							bi_addition
						},
						0, 0
					),
					un_value_of
				},
				0, 0
			);
			expression->return_type = {array->return_type.pointer_depth - 1};
		} else if (expression->type == et_function_call) {
			function_call_expression_t& expr = expression->function_call;
			for (int i = 0; i < expr.arguments.size(); i++) {
				expand_ast(expr.arguments[i]);
			}
		} else if (expression->type == et_binary) {
			expand_ast(expression->binary.left_operand);
			expand_ast(expression->binary.right_operand);
			if (expression->binary.binary_operator == bi_addition_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_addition}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_subtraction_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_subtraction}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_multiplication_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_multiplication}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_division_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_division}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_modulo_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_modulo}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_and_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_and}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_or_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_or}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_xor_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_xor}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_left_shift_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_left_shift}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_right_shift_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_right_shift}, 0, 0), bi_assignment}, 0, 0);
			}
			expression->return_type = expression->binary.left_operand->return_type;
		} else if (expression->type == et_unary) {
			expand_ast(expression->unary.operand);
		}
	}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x210, %rsp            # imm = 0x210
movq %rsi, %rbx
movq %rdi, %r14
leaq 0x2de9(%rip), %rax      # 0x101f4
movq (%rbx), %r15
movl (%r15), %ecx
addl $-0x4, %ecx
cmpl $0x3, %ecx
ja 0xdb72
movslq (%rax,%rcx,4), %rcx
addq %rax, %rcx
jmpq *%rcx
addq $0x108, %r15            # imm = 0x108
movq %r15, %rbx
jmp 0xd40b
addq $0xa8, %r15
movq %r14, %rdi
movq %r15, %rsi
callq 0xd3ee
movl $0xb0, %esi
addq (%rbx), %rsi
movq %r14, %rdi
callq 0xd3ee
movq (%rbx), %rax
movq 0xa8(%rax), %r12
movq 0xb0(%rax), %r13
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r12, 0x1f8(%rsp)
movq %r13, 0x200(%rsp)
andl $0x0, 0x208(%rsp)
movq 0x208(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x1f8(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r14, %rdi
movq %r15, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x9b12
movq %r14, (%rbx)
movq 0x8(%r12), %rax
decq %rax
movq %rax, 0x8(%r14)
jmp 0xdb72
addq $0xf0, %r15
movq %r14, %rdi
movq %r15, %rsi
callq 0xd3ee
movl $0xf8, %esi
addq (%rbx), %rsi
movq %r14, %rdi
callq 0xd3ee
movq (%rbx), %r12
movl 0x100(%r12), %eax
addl $-0x6, %eax
cmpl $0x16, %eax
ja 0xdb61
leaq 0x2ce2(%rip), %rcx      # 0x10204
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0x1e0(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0x1c8(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0x1d0(%rsp)
andl $0x0, 0x1d8(%rsp)
movq 0x1d8(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x1c8(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0x1e8(%rsp)
movl $0x5, 0x1f0(%rsp)
movq 0x1f0(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x1e0(%rsp), %xmm0
jmp 0xdb4b
xorl %ebx, %ebx
xorl %r12d, %r12d
movq 0xd8(%r15), %rsi
movq 0xe0(%r15), %rax
subq %rsi, %rax
sarq $0x3, %rax
cmpq %r12, %rax
jbe 0xdb72
addq %rbx, %rsi
movq %r14, %rdi
callq 0xd3ee
incq %r12
addq $0x8, %rbx
jmp 0xd5cc
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0x180(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0x168(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0x170(%rsp)
movl $0x2, 0x178(%rsp)
movq 0x178(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x168(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0x188(%rsp)
movl $0x5, 0x190(%rsp)
movq 0x190(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x180(%rsp), %xmm0
jmp 0xdb4b
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0xf0(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0xd8(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0xe0(%rsp)
movl $0x13, 0xe8(%rsp)
movq 0xe8(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0xd8(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0xf8(%rsp)
movl $0x5, 0x100(%rsp)
movq 0x100(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0xf0(%rsp), %xmm0
jmp 0xdb4b
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0x1b0(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0x198(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0x1a0(%rsp)
movl $0x1, 0x1a8(%rsp)
movq 0x1a8(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x198(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0x1b8(%rsp)
movl $0x5, 0x1c0(%rsp)
movq 0x1c0(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x1b0(%rsp), %xmm0
jmp 0xdb4b
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0xc0(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0xa8(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0xb0(%rsp)
movl $0x14, 0xb8(%rsp)
movq 0xb8(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0xa8(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0xc8(%rsp)
movl $0x5, 0xd0(%rsp)
movq 0xd0(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0xc0(%rsp), %xmm0
jmp 0xdb4b
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0x90(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0x78(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0x80(%rsp)
movl $0x15, 0x88(%rsp)
movq 0x88(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x78(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0x98(%rsp)
movl $0x5, 0xa0(%rsp)
movq 0xa0(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x90(%rsp), %xmm0
jmp 0xdb4b
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0x150(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0x138(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0x140(%rsp)
movl $0x3, 0x148(%rsp)
movq 0x148(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x138(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0x158(%rsp)
movl $0x5, 0x160(%rsp)
movq 0x160(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x150(%rsp), %xmm0
jmp 0xdb4b
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0x120(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0x108(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0x110(%rsp)
movl $0x4, 0x118(%rsp)
movq 0x118(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x108(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0x128(%rsp)
movl $0x5, 0x130(%rsp)
movq 0x130(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x120(%rsp), %xmm0
jmp 0xdb4b
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0x30(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0x18(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0x20(%rsp)
movl $0x1a, 0x28(%rsp)
movq 0x28(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x18(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0x38(%rsp)
movl $0x5, 0x40(%rsp)
movq 0x40(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x30(%rsp), %xmm0
jmp 0xdb4b
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r14
movq 0xf0(%r12), %r13
movq %r13, 0x60(%rsp)
movl $0x118, %edi            # imm = 0x118
callq 0x2240
movq %rax, %r15
movq %r13, 0x48(%rsp)
movq 0xf8(%r12), %rax
movq %rax, 0x50(%rsp)
movl $0x19, 0x58(%rsp)
movq 0x58(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x48(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r15, 0x68(%rsp)
movl $0x5, 0x70(%rsp)
movq 0x70(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x60(%rsp), %xmm0
movups %xmm0, (%rsp)
movq %r14, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x7bc8
movq %r14, (%rbx)
movq %r14, %r12
movq 0xf0(%r12), %rax
movq 0x8(%rax), %rax
movq %rax, 0x8(%r12)
addq $0x210, %rsp            # imm = 0x210
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
jmp 0xdb97
jmp 0xdb97
jmp 0xdb97
jmp 0xdb97
jmp 0xdb97
jmp 0xdb97
jmp 0xdb97
jmp 0xdb97
jmp 0xdb97
jmp 0xdb97
movq %rax, %rbx
movl $0x118, %esi            # imm = 0x118
movq %r14, %rdi
callq 0x2250
movq %rbx, %rdi
callq 0x2390
nop