// File: pfnet-research[P]pml/src/parser.cpp
// Function: parser::typed_expr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned long&)
expr_result_t typed_expr(std::string const& input, size_t& pos) {
    auto expr_result = neg_expr_t(input, pos);
    if (expr_result.is_error())
        return expr_result;

    auto colon_token = next_token(input, pos);
    if (colon_token.kind != token_t::kind_t::Colon)
        return expr_result;
    pos = colon_token.pos + colon_token.lexime.size();

    auto type_result = refinement_type(input, pos);
    if (type_result.is_error())
        return type_result.convert<ptr<ast::expr_t>>();

    auto expr = expr_result.ok();
    auto type = type_result.ok();

    return expr_result_t::ok(make<ast::typed_expr_t>(expr, type));
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x180, %rsp            # imm = 0x180
movq %rdi, -0x158(%rbp)
movq %rdi, %rax
movq %rax, -0x150(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq -0x50(%rbp), %rdi
movq %rdi, -0x148(%rbp)
callq 0x3e070
movq -0x148(%rbp), %rdi
callq 0x41970
movb %al, -0x139(%rbp)
jmp 0x3e2e4
movb -0x139(%rbp), %al
testb $0x1, %al
jne 0x3e2f0
jmp 0x3e31f
movq -0x158(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x41990
jmp 0x3e302
movl $0x1, -0x60(%rbp)
jmp 0x3e565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3e57e
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
leaq -0x90(%rbp), %rdi
callq 0x355b0
jmp 0x3e338
cmpl $0x1c, -0x90(%rbp)
je 0x3e370
movq -0x158(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x41990
jmp 0x3e353
movl $0x1, -0x60(%rbp)
jmp 0x3e549
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3e557
movq -0x88(%rbp), %rax
movq %rax, -0x160(%rbp)
leaq -0x80(%rbp), %rdi
callq 0xa280
movq -0x160(%rbp), %rcx
addq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq -0xd0(%rbp), %rdi
callq 0x3ae30
jmp 0x3e3ae
leaq -0xd0(%rbp), %rdi
callq 0x41720
movb %al, -0x161(%rbp)
jmp 0x3e3c2
movb -0x161(%rbp), %al
testb $0x1, %al
jne 0x3e3ce
jmp 0x3e400
movq -0x158(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
callq 0x41e30
jmp 0x3e3e3
movl $0x1, -0x60(%rbp)
jmp 0x3e52d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3e53b
leaq -0x50(%rbp), %rdi
callq 0x419e0
movq %rax, -0x170(%rbp)
jmp 0x3e412
movq -0x170(%rbp), %rsi
leaq -0xe0(%rbp), %rdi
callq 0x13050
leaq -0xd0(%rbp), %rdi
callq 0x417f0
movq %rax, -0x178(%rbp)
jmp 0x3e43a
movq -0x178(%rbp), %rsi
leaq -0x118(%rbp), %rdi
callq 0x15a00
jmp 0x3e44f
leaq -0x138(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
leaq -0x118(%rbp), %rdx
callq 0x3e590
jmp 0x3e46b
leaq -0x128(%rbp), %rdi
movq %rdi, -0x180(%rbp)
leaq -0x138(%rbp), %rsi
callq 0x41e70
movq -0x158(%rbp), %rdi
movq -0x180(%rbp), %rsi
callq 0x41a60
jmp 0x3e49a
leaq -0x128(%rbp), %rdi
callq 0x13080
leaq -0x138(%rbp), %rdi
callq 0x41ea0
movl $0x1, -0x60(%rbp)
leaq -0x118(%rbp), %rdi
callq 0x16120
leaq -0xe0(%rbp), %rdi
callq 0x13080
jmp 0x3e52d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3e51f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3e513
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
leaq -0x128(%rbp), %rdi
callq 0x13080
leaq -0x138(%rbp), %rdi
callq 0x41ea0
leaq -0x118(%rbp), %rdi
callq 0x16120
leaq -0xe0(%rbp), %rdi
callq 0x13080
jmp 0x3e53b
leaq -0xd0(%rbp), %rdi
callq 0x41650
jmp 0x3e549
leaq -0xd0(%rbp), %rdi
callq 0x41650
jmp 0x3e557
leaq -0x90(%rbp), %rdi
callq 0x404f0
jmp 0x3e565
leaq -0x90(%rbp), %rdi
callq 0x404f0
jmp 0x3e57e
leaq -0x50(%rbp), %rdi
callq 0x2ffa0
movq -0x150(%rbp), %rax
addq $0x180, %rsp            # imm = 0x180
popq %rbp
retq
leaq -0x50(%rbp), %rdi
callq 0x2ffa0
movq -0x58(%rbp), %rdi
callq 0xa650