// File: /workspace/github_cpp_makefile_star2_O1/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 0x1df0c(%rip), %rdi     # 0x242a0
leaq 0x161bd(%rip), %rsi     # 0x1c558
callq 0x30b0
testl %eax, %eax
je 0x63bb
leaq 0x1def5(%rip), %rdi     # 0x242a0
leaq 0x161ad(%rip), %rsi     # 0x1c55f
callq 0x30b0
testl %eax, %eax
jne 0x63d3
leaq 0x1dede(%rip), %rsi     # 0x242a0
leaq -0xa8(%rbp), %rdi
callq 0x3110
callq 0x5790
movq -0x60(%rbp), %rbx
leaq 0x10(%rbx), %rax
movq %rax, -0x88(%rbp)
movq %rax, (%rbx)
movq $0x0, 0x8(%rbx)
movb $0x0, 0x10(%rbx)
leaq 0x1dea8(%rip), %rdi     # 0x242a0
leaq 0x16167(%rip), %rsi     # 0x1c566
callq 0x30b0
testl %eax, %eax
je 0x6731
xorps %xmm0, %xmm0
leaq -0x80(%rbp), %rax
movaps %xmm0, (%rax)
movq $0x0, 0x10(%rax)
leaq -0x40(%rbp), %r14
leaq 0x1de77(%rip), %r12     # 0x242a0
leaq 0x16aa7(%rip), %rbx     # 0x1ced7
leaq 0x16033(%rip), %r13     # 0x1c46a
xorl %r15d, %r15d
movq %r12, %rdi
leaq 0x16127(%rip), %rsi     # 0x1c56b
callq 0x30b0
testl %eax, %eax
je 0x64b1
callq 0x6257
testb %al, %al
jne 0x64b1
movq %r12, %rdi
leaq 0x15d71(%rip), %rsi     # 0x1c1d1
callq 0x30b0
testl %eax, %eax
je 0x64b1
movq %r12, %rdi
leaq 0x15d78(%rip), %rsi     # 0x1c1eb
callq 0x30b0
testl %eax, %eax
je 0x64b1
movq %r12, %rdi
movq %rbx, %rsi
callq 0x30b0
testl %eax, %eax
je 0x64b1
movq %r12, %rdi
movq %r13, %rsi
callq 0x30b0
testl %eax, %eax
je 0x64b1
movq %r12, %rdi
leaq 0x15d37(%rip), %rsi     # 0x1c1db
callq 0x30b0
testl %eax, %eax
jne 0x6694
movq %r12, %rdi
movq %rbx, %rsi
callq 0x30b0
testl %eax, %eax
je 0x653d
movq %r12, %rdi
movq %r13, %rsi
callq 0x30b0
testl %eax, %eax
je 0x6593
movq %r12, %rdi
leaq 0x15cfe(%rip), %rsi     # 0x1c1db
callq 0x30b0
testl %eax, %eax
je 0x65fc
movl 0x1dda8(%rip), %eax     # 0x24298
movl %eax, -0x58(%rbp)
movq %r14, -0x50(%rbp)
movq 0x1dda2(%rip), %rsi     # 0x242a0
movq 0x1dda3(%rip), %rdx     # 0x242a8
addq %rsi, %rdx
leaq -0x50(%rbp), %rdi
callq 0x16d2e
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x19270
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x6533
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
callq 0x5790
jmp 0x643a
movl 0x1dd55(%rip), %eax     # 0x24298
movl %eax, -0x58(%rbp)
movq %r14, -0x50(%rbp)
movq 0x1dd4f(%rip), %rsi     # 0x242a0
movq 0x1dd50(%rip), %rdx     # 0x242a8
addq %rsi, %rdx
leaq -0x50(%rbp), %rdi
callq 0x16d2e
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x19270
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x6586
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
incl %r15d
callq 0x5790
jmp 0x643a
testl %r15d, %r15d
jg 0x65a6
leaq 0x15fd2(%rip), %rdi     # 0x1c571
xorl %eax, %eax
callq 0x1585f
movl 0x1dcec(%rip), %eax     # 0x24298
movl %eax, -0x58(%rbp)
movq %r14, -0x50(%rbp)
movq 0x1dce6(%rip), %rsi     # 0x242a0
movq 0x1dce7(%rip), %rdx     # 0x242a8
addq %rsi, %rdx
leaq -0x50(%rbp), %rdi
callq 0x16d2e
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x19270
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x65ef
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
decl %r15d
callq 0x5790
jmp 0x643a
cmpl $0x1, %r15d
jg 0x6610
leaq 0x15f79(%rip), %rdi     # 0x1c582
xorl %eax, %eax
callq 0x1585f
movl 0x1dc82(%rip), %eax     # 0x24298
movl %eax, -0x58(%rbp)
leaq -0x50(%rbp), %rdi
movq %r13, %rsi
leaq -0x29(%rbp), %rdx
callq 0x1567c
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x19270
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x664b
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
movl 0x1dc47(%rip), %eax     # 0x24298
movl %eax, -0x58(%rbp)
leaq -0x50(%rbp), %rdi
movq %r13, %rsi
leaq -0x29(%rbp), %rdx
callq 0x1567c
leaq -0x80(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x19270
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x6686
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
addl $-0x2, %r15d
callq 0x5790
jmp 0x643a
movq -0x80(%rbp), %r12
movq -0x78(%rbp), %r13
cmpq %r13, %r12
je 0x6726
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 0x16d2e
cmpl $0x1, -0x58(%rbp)
jne 0x66f3
cmpl $0x1, %r15d
jne 0x66f3
movq -0x60(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x66f3
movq -0x60(%rbp), %rdi
leaq 0x15b8f(%rip), %rsi     # 0x1c27d
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 0x671d
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
addq $0x28, %r12
cmpq %r13, %r12
jne 0x66ac
leaq -0x80(%rbp), %rdi
callq 0x15932
jmp 0x6745
leaq 0x1db68(%rip), %rsi     # 0x242a0
movq %rbx, %rdi
callq 0x3110
callq 0x5790
leaq 0x15e05(%rip), %rsi     # 0x1c551
movq -0x60(%rbp), %rdi
callq 0x30b0
testl %eax, %eax
jne 0x6775
movq -0x60(%rbp), %rdi
movq 0x8(%rdi), %rdx
leaq 0x16779(%rip), %rcx     # 0x1cee1
movl $0x3, %r8d
xorl %esi, %esi
callq 0x32a0
movq -0xa8(%rbp), %rdi
leaq -0x98(%rbp), %rax
cmpq %rax, %rdi
je 0x6797
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 0x67f5
movq %rax, %rbx
jmp 0x6813
jmp 0x67d4
jmp 0x67cf
jmp 0x67d4
jmp 0x67cf
jmp 0x67cf
jmp 0x67d4
jmp 0x67cf
jmp 0x67d4
jmp 0x67cf
jmp 0x67d4
jmp 0x67cf
jmp 0x67cf
movq %rax, %rbx
jmp 0x67ec
movq %rax, %rbx
movq -0x50(%rbp), %rdi
cmpq %r14, %rdi
je 0x67ec
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x31d0
leaq -0x80(%rbp), %rdi
callq 0x15932
movq -0x60(%rbp), %rax
movq (%rax), %rdi
movq -0x88(%rbp), %rax
cmpq %rax, %rdi
je 0x6813
movq (%rax), %rsi
incq %rsi
callq 0x31d0
movq -0xa8(%rbp), %rdi
leaq -0x98(%rbp), %rax
cmpq %rax, %rdi
je 0x6835
movq -0x98(%rbp), %rsi
incq %rsi
callq 0x31d0
movq %rbx, %rdi
callq 0x3320