// File: /workspace/github_cpp_makefile_star2_O1/onlyuser[P]Sandbox/test_c/c++14/main2.cpp
// Function: main
int main(int argc, char** argv)
{
    //===============
    // lhs_lvalue_ref
    //===============

    // non-const
    std::cout << "lhs_lvalue_ref(rhs_lvalue_ref())" << std::endl;
    lhs_lvalue_ref(rhs_lvalue_ref());

    std::cout << "lhs_lvalue_ref(rhs_rvalue())" << std::endl;
    std::cout << "\terror: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’" << std::endl;
    //lhs_lvalue_ref(rhs_rvalue());

    std::cout << "lhs_lvalue_ref(rhs_rvalue_ref())" << std::endl;
    std::cout << "\terror: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘std::remove_reference<Foo>::type {aka Foo}’" << std::endl;
    //lhs_lvalue_ref(rhs_rvalue_ref());

    // const
    std::cout << "lhs_const_lvalue_ref(rhs_lvalue_ref())" << std::endl;
    lhs_const_lvalue_ref(rhs_lvalue_ref());

    std::cout << "lhs_const_lvalue_ref(rhs_rvalue())" << std::endl;
    lhs_const_lvalue_ref(rhs_rvalue());

    std::cout << "lhs_const_lvalue_ref(rhs_rvalue_ref())" << std::endl;
    lhs_const_lvalue_ref(rhs_rvalue_ref());

    //===========
    // lhs_rvalue
    //===========

    // non-const
    std::cout << "lhs_rvalue(rhs_lvalue_ref())" << std::endl;
    lhs_rvalue(rhs_lvalue_ref());

    std::cout << "lhs_rvalue(rhs_rvalue())" << std::endl;
    lhs_rvalue(rhs_rvalue());

    std::cout << "lhs_rvalue(rhs_rvalue_ref())" << std::endl;
    lhs_rvalue(rhs_rvalue_ref());

    // const
    std::cout << "lhs_const_rvalue(rhs_lvalue_ref())" << std::endl;
    lhs_const_rvalue(rhs_lvalue_ref());

    std::cout << "lhs_const_rvalue(rhs_rvalue())" << std::endl;
    lhs_const_rvalue(rhs_rvalue());

    std::cout << "lhs_const_rvalue(rhs_rvalue_ref())" << std::endl;
    lhs_const_rvalue(rhs_rvalue_ref());

    //===============
    // lhs_rvalue_ref
    //===============

    // non-const
    std::cout << "lhs_rvalue_ref(rhs_lvalue_ref())" << std::endl;
    std::cout << "\terror: cannot bind ‘Foo’ lvalue to ‘Foo&&’" << std::endl;
    //lhs_rvalue_ref(rhs_lvalue_ref());

    std::cout << "lhs_rvalue_ref(rhs_rvalue())" << std::endl;
    lhs_rvalue_ref(rhs_rvalue());

    std::cout << "lhs_rvalue_ref(rhs_rvalue_ref())" << std::endl;
    lhs_rvalue_ref(rhs_rvalue_ref());

    // const
    std::cout << "lhs_const_rvalue_ref(rhs_lvalue_ref())" << std::endl;
    std::cout << "\terror: cannot bind ‘Foo’ lvalue to ‘const Foo&&’" << std::endl;
    //lhs_const_rvalue_ref(rhs_lvalue_ref());

    std::cout << "lhs_const_rvalue_ref(rhs_rvalue())" << std::endl;
    lhs_const_rvalue_ref(rhs_rvalue());

    std::cout << "lhs_const_rvalue_ref(rhs_rvalue_ref())" << std::endl;
    lhs_const_rvalue_ref(rhs_rvalue_ref());

    //=================
    // lhs_unversal_ref
    //=================

    // non-const
    std::cout << "lhs_unversal_ref(rhs_lvalue_ref())" << std::endl;
    lhs_unversal_ref(rhs_lvalue_ref());

    std::cout << "lhs_unversal_ref(rhs_rvalue())" << std::endl;
    lhs_unversal_ref(rhs_rvalue());

    std::cout << "lhs_unversal_ref(rhs_rvalue_ref())" << std::endl;
    lhs_unversal_ref(rhs_rvalue_ref());

    // const
    std::cout << "lhs_const_unversal_ref(rhs_lvalue_ref())" << std::endl;
    std::cout << "\terror: cannot bind ‘Foo’ lvalue to ‘const Foo&&’" << std::endl;
    //lhs_const_unversal_ref(rhs_lvalue_ref());

    std::cout << "lhs_const_unversal_ref(rhs_rvalue())" << std::endl;
    std::cout << "\terror: no matching function for call to ‘forward(const Foo&)" << std::endl;
    //lhs_const_unversal_ref(rhs_rvalue());

    std::cout << "lhs_const_unversal_ref(rhs_rvalue_ref())" << std::endl;
    std::cout << "\terror: no matching function for call to ‘forward(const Foo&)’" << std::endl;
    //lhs_const_unversal_ref(rhs_rvalue_ref());

    return 0;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq 0x2a81(%rip), %rbx      # 0x3fd8
leaq 0xc07(%rip), %rsi       # 0x2165
movl $0x20, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x121c
callq 0x1260
leaq 0xbe3(%rip), %rsi       # 0x2186
movl $0x1c, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0xbc5(%rip), %rsi       # 0x21a3
movl $0x69, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0xbf4(%rip), %rsi       # 0x220d
movl $0x20, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0xbda(%rip), %rsi       # 0x222e
movl $0x90, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0xc30(%rip), %rsi       # 0x22bf
movl $0x26, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x121c
callq 0x132c
leaq 0xc12(%rip), %rsi       # 0x22e6
movl $0x22, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x132c
leaq 0xbf5(%rip), %rsi       # 0x2309
movl $0x26, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x132c
leaq 0xbdc(%rip), %rsi       # 0x2330
movl $0x1c, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x121c
callq 0x12a4
leaq 0xbb4(%rip), %rsi       # 0x234d
movl $0x18, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x12a4
leaq 0xb8d(%rip), %rsi       # 0x2366
movl $0x1c, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x12a4
leaq 0xb6a(%rip), %rsi       # 0x2383
movl $0x22, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x121c
callq 0x1370
leaq 0xb48(%rip), %rsi       # 0x23a6
movl $0x1e, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x1370
leaq 0xb27(%rip), %rsi       # 0x23c5
movl $0x22, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x1370
leaq 0xb0a(%rip), %rsi       # 0x23e8
movl $0x20, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0xaf0(%rip), %rsi       # 0x2409
movl $0x33, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0xae9(%rip), %rsi       # 0x243d
movl $0x1c, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x12e8
leaq 0xac6(%rip), %rsi       # 0x245a
movl $0x20, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x12e8
leaq 0xaa7(%rip), %rsi       # 0x247b
movl $0x26, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0xa93(%rip), %r14       # 0x24a2
movl $0x39, %edx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0xa8f(%rip), %rsi       # 0x24dc
movl $0x22, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x13b4
leaq 0xa72(%rip), %rsi       # 0x24ff
movl $0x26, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x13b4
leaq 0xa59(%rip), %rsi       # 0x2526
movl $0x22, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
callq 0x121c
leaq 0x2564(%rip), %rdi      # 0x4071
callq 0x1d04
leaq 0xa30(%rip), %rsi       # 0x2549
movl $0x1e, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0x7(%rsp), %rdi
callq 0x1d4d
leaq 0xa0a(%rip), %rsi       # 0x2568
movl $0x22, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0x6(%rsp), %rdi
callq 0x1d4d
leaq 0x9e8(%rip), %rsi       # 0x258b
movl $0x28, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
movl $0x39, %edx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0x99f(%rip), %rsi       # 0x25b4
movl $0x24, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0x989(%rip), %rsi       # 0x25d9
movl $0x3f, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0x98e(%rip), %rsi       # 0x2619
movl $0x28, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
leaq 0x97c(%rip), %rsi       # 0x2642
movl $0x42, %edx
movq %rbx, %rdi
callq 0x1080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x1070
movsbl %al, %esi
movq %rbx, %rdi
callq 0x1030
movq %rax, %rdi
callq 0x1050
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %r14
retq