// File: /workspace/github_cpp_makefile_star2_O3/yanlinlin82[P]icpp/icpp.cpp
// Function: parse_type_name[abi:cxx11]()
string parse_type_name()
{
	string prefix;
	if (token == "static" || token == "extern") {
		prefix = token;
		next(); // skip this prefix
	}
	string type_name;
	if (token == "auto") {
		type_name = token; next();
	} else {
		vector<pair<token_type, string>> a;
		int angle_bracket = 0;
		while (token == "const" || is_built_in_type() ||
				token == "*" || token == "&" ||
				token == "<" || token == ">" || token == ">>") {
			if (token == "<") {
				++angle_bracket;
				a.push_back(make_pair(type, token));
				next();
			} else if (token == ">") {
				if (--angle_bracket < 0) { err("unexpected '>'!\n"); }
				a.push_back(make_pair(type, token));
				next();
			} else if (token == ">>") {
				if (angle_bracket < 2) { err("unexpected '>>'!\n"); }
				angle_bracket -= 2;
				a.push_back(make_pair(type, ">"));
				a.push_back(make_pair(type, ">"));
				next();
			} else {
				a.push_back(make_pair(type, token));
				next();
			}
		}
		token_type last_token_type = unknown;
		for (auto e : a) {
			if (e.first == symbol && last_token_type == symbol && !type_name.empty()) {
				type_name += " ";
			}
			type_name += e.second;
			last_token_type = e.first;
		}
	}
	if (type_name == "size_t") { // TODO: support typedef
		type_name = "int";
	}
	return type_name;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x88, %rsp
movq %rdi, -0x60(%rbp)
leaq -0x98(%rbp), %rax
movq %rax, -0x10(%rax)
movq $0x0, -0x8(%rax)
movb $0x0, (%rax)
leaq 0x1cfd1(%rip), %rdi     # 0x232a0
leaq 0x15282(%rip), %rsi     # 0x1b558
callq 0x30b0
testl %eax, %eax
je 0x62f6
leaq 0x1cfba(%rip), %rdi     # 0x232a0
leaq 0x15272(%rip), %rsi     # 0x1b55f
callq 0x30b0
testl %eax, %eax
jne 0x630e
leaq 0x1cfa3(%rip), %rsi     # 0x232a0
leaq -0xa8(%rbp), %rdi
callq 0x3110
callq 0x572d
movq -0x60(%rbp), %rbx
leaq 0x10(%rbx), %rax
movq %rax, -0x88(%rbp)
movq %rax, (%rbx)
movq $0x0, 0x8(%rbx)
movb $0x0, 0x10(%rbx)
leaq 0x1cf6d(%rip), %rdi     # 0x232a0
leaq 0x1522c(%rip), %rsi     # 0x1b566
callq 0x30b0
testl %eax, %eax
je 0x666c
xorps %xmm0, %xmm0
leaq -0x80(%rbp), %rax
movaps %xmm0, (%rax)
movq $0x0, 0x10(%rax)
leaq -0x40(%rbp), %r14
leaq 0x1cf3c(%rip), %r12     # 0x232a0
leaq 0x15b6c(%rip), %rbx     # 0x1bed7
leaq 0x150f8(%rip), %r13     # 0x1b46a
xorl %r15d, %r15d
movq %r12, %rdi
leaq 0x151ec(%rip), %rsi     # 0x1b56b
callq 0x30b0
testl %eax, %eax
je 0x63ec
callq 0x6192
testb %al, %al
jne 0x63ec
movq %r12, %rdi
leaq 0x14e36(%rip), %rsi     # 0x1b1d1
callq 0x30b0
testl %eax, %eax
je 0x63ec
movq %r12, %rdi
leaq 0x14e3d(%rip), %rsi     # 0x1b1eb
callq 0x30b0
testl %eax, %eax
je 0x63ec
movq %r12, %rdi
movq %rbx, %rsi
callq 0x30b0
testl %eax, %eax
je 0x63ec
movq %r12, %rdi
movq %r13, %rsi
callq 0x30b0
testl %eax, %eax
je 0x63ec
movq %r12, %rdi
leaq 0x14dfc(%rip), %rsi     # 0x1b1db
callq 0x30b0
testl %eax, %eax
jne 0x65cf
movq %r12, %rdi
movq %rbx, %rsi
callq 0x30b0
testl %eax, %eax
je 0x6478
movq %r12, %rdi
movq %r13, %rsi
callq 0x30b0
testl %eax, %eax
je 0x64ce
movq %r12, %rdi
leaq 0x14dc3(%rip), %rsi     # 0x1b1db
callq 0x30b0
testl %eax, %eax
je 0x6537
movl 0x1ce6d(%rip), %eax     # 0x23298
movl %eax, -0x58(%rbp)
movq %r14, -0x50(%rbp)
movq 0x1ce67(%rip), %rsi     # 0x232a0
movq 0x1ce68(%rip), %rdx     # 0x232a8
addq %rsi, %rdx
leaq -0x50(%rbp), %rdi
callq 0x16942
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x18e6e
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x646e
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
callq 0x572d
jmp 0x6375
movl 0x1ce1a(%rip), %eax     # 0x23298
movl %eax, -0x58(%rbp)
movq %r14, -0x50(%rbp)
movq 0x1ce14(%rip), %rsi     # 0x232a0
movq 0x1ce15(%rip), %rdx     # 0x232a8
addq %rsi, %rdx
leaq -0x50(%rbp), %rdi
callq 0x16942
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x18e6e
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x64c1
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
incl %r15d
callq 0x572d
jmp 0x6375
testl %r15d, %r15d
jg 0x64e1
leaq 0x15097(%rip), %rdi     # 0x1b571
xorl %eax, %eax
callq 0x1546f
movl 0x1cdb1(%rip), %eax     # 0x23298
movl %eax, -0x58(%rbp)
movq %r14, -0x50(%rbp)
movq 0x1cdab(%rip), %rsi     # 0x232a0
movq 0x1cdac(%rip), %rdx     # 0x232a8
addq %rsi, %rdx
leaq -0x50(%rbp), %rdi
callq 0x16942
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x18e6e
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x652a
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
decl %r15d
callq 0x572d
jmp 0x6375
cmpl $0x1, %r15d
jg 0x654b
leaq 0x1503e(%rip), %rdi     # 0x1b582
xorl %eax, %eax
callq 0x1546f
movl 0x1cd47(%rip), %eax     # 0x23298
movl %eax, -0x58(%rbp)
leaq -0x50(%rbp), %rdi
movq %r13, %rsi
leaq -0x29(%rbp), %rdx
callq 0x1528c
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x18e6e
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x6586
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
movl 0x1cd0c(%rip), %eax     # 0x23298
movl %eax, -0x58(%rbp)
leaq -0x50(%rbp), %rdi
movq %r13, %rsi
leaq -0x29(%rbp), %rdx
callq 0x1528c
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x18e6e
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x65c1
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
addl $-0x2, %r15d
callq 0x572d
jmp 0x6375
movq -0x80(%rbp), %r12
movq -0x78(%rbp), %r13
cmpq %r13, %r12
je 0x6661
leaq -0x50(%rbp), %rbx
xorl %r15d, %r15d
movl (%r12), %eax
movl %eax, -0x58(%rbp)
movq %r14, -0x50(%rbp)
movq 0x8(%r12), %rsi
movq 0x10(%r12), %rdx
addq %rsi, %rdx
movq %rbx, %rdi
callq 0x16942
cmpl $0x1, -0x58(%rbp)
jne 0x662e
cmpl $0x1, %r15d
jne 0x662e
movq -0x60(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x662e
movq -0x60(%rbp), %rdi
leaq 0x14c54(%rip), %rsi     # 0x1b27d
callq 0x3360
movq -0x50(%rbp), %rsi
movq -0x48(%rbp), %rdx
movq -0x60(%rbp), %rdi
callq 0x30c0
movl -0x58(%rbp), %r15d
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x6658
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
addq $0x28, %r12
cmpq %r13, %r12
jne 0x65e7
leaq -0x80(%rbp), %rdi
callq 0x15542
jmp 0x6680
leaq 0x1cc2d(%rip), %rsi     # 0x232a0
movq %rbx, %rdi
callq 0x3110
callq 0x572d
leaq 0x14eca(%rip), %rsi     # 0x1b551
movq -0x60(%rbp), %rdi
callq 0x30b0
testl %eax, %eax
jne 0x66b0
movq -0x60(%rbp), %rdi
movq 0x8(%rdi), %rdx
leaq 0x1583e(%rip), %rcx     # 0x1bee1
movl $0x3, %r8d
xorl %esi, %esi
callq 0x32a0
movq -0xa8(%rbp), %rdi
leaq -0x98(%rbp), %rax
cmpq %rax, %rdi
je 0x66d2
movq -0x98(%rbp), %rsi
incq %rsi
callq 0x31d0
movq -0x60(%rbp), %rax
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
jmp 0x6730
movq %rax, %rbx
jmp 0x674e
jmp 0x670f
jmp 0x670a
jmp 0x670f
jmp 0x670a
jmp 0x670a
jmp 0x670f
jmp 0x670a
jmp 0x670f
jmp 0x670a
jmp 0x670f
jmp 0x670a
jmp 0x670a
movq %rax, %rbx
jmp 0x6727
movq %rax, %rbx
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x6727
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
leaq -0x80(%rbp), %rdi
callq 0x15542
movq -0x60(%rbp), %rax
movq (%rax), %rdi
movq -0x88(%rbp), %rax
cmpq %rax, %rdi
je 0x674e
movq (%rax), %rsi
incq %rsi
callq 0x31d0
movq -0xa8(%rbp), %rdi
leaq -0x98(%rbp), %rax
cmpq %rax, %rdi
je 0x6770
movq -0x98(%rbp), %rsi
incq %rsi
callq 0x31d0
movq %rbx, %rdi
callq 0x3320