// File: kelwinfc[P]ci4721-Fernandez-Gyomrey/src/AST/check.cpp
// Function: AST_un_op::fill_and_check(symbol_table*)
void AST_un_op::fill_and_check(symbol_table* st){
    expr->fill_and_check(st);
    
    if ( expr->type == BOOLEAN ){
        if ( oper_type == NOT ){
            type = BOOLEAN;
        } else {
            // Reportar error de argumento booleano y operando menos unario
            logger->buf << "Operando de tipo boolean, esperado float o int.";
            logger->error(line, column);
        }
    } else if ( expr->type == INT || expr->type == FLOAT ){
        
        if ( oper_type == NEG ){
            type = expr->type;
        } else {
            // Reportar error de argumento numero y operando negacion
            logger->buf << "Operando de tipo '" << (expr->type == INT ? "int": "float")
                        << "', esperado boolean.";
            logger->error(line, column);
        }
    } else {
        // Reportar error de tipo de argumento
        logger->buf << "Operando de tipo '" << types.types[expr->type]->name
                    << "', esperado '" << (oper_type == NOT ? "boolean": "float o int")
                    << "'.";
        logger->error(line, column);
    }
}

// Assembly:
subq $0x28, %rsp
movq %rdi, 0x20(%rsp)
movq %rsi, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0x50(%rax), %rdi
movq 0x18(%rsp), %rsi
movq (%rdi), %rax
callq *0x8(%rax)
movq 0x10(%rsp), %rax
movq 0x50(%rax), %rax
cmpl $0x6, 0x10(%rax)
jne 0xbe1c
movq 0x10(%rsp), %rax
cmpl $0x1, 0x48(%rax)
jne 0xbddf
movq 0x10(%rsp), %rax
movl $0x6, 0x10(%rax)
jmp 0xbe17
leaq 0x626f2(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x38, %rdi
addq $0x10, %rdi
leaq 0x46a00(%rip), %rsi     # 0x527f8
callq 0x6370
movq 0x10(%rsp), %rax
leaq 0x626cf(%rip), %rcx     # 0x6e4d8
movq (%rcx), %rdi
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
callq 0x2f440
jmp 0xbf7e
movq 0x10(%rsp), %rax
movq 0x50(%rax), %rax
cmpl $0x3, 0x10(%rax)
je 0xbe3e
movq 0x10(%rsp), %rax
movq 0x50(%rax), %rax
cmpl $0x4, 0x10(%rax)
jne 0xbecf
movq 0x10(%rsp), %rax
cmpl $0x0, 0x48(%rax)
jne 0xbe5a
movq 0x10(%rsp), %rax
movq 0x50(%rax), %rcx
movl 0x10(%rcx), %ecx
movl %ecx, 0x10(%rax)
jmp 0xbeca
leaq 0x62677(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x38, %rdi
addq $0x10, %rdi
leaq 0x469b5(%rip), %rsi     # 0x52828
callq 0x6370
movq %rax, %rdi
movq 0x10(%rsp), %rax
movq 0x50(%rax), %rax
movl 0x10(%rax), %ecx
leaq 0x469ad(%rip), %rsi     # 0x5283b
leaq 0x469df(%rip), %rax     # 0x52874
cmpl $0x3, %ecx
cmoveq %rax, %rsi
callq 0x6370
movq %rax, %rdi
leaq 0x46996(%rip), %rsi     # 0x52841
callq 0x6370
movq 0x10(%rsp), %rax
leaq 0x6261c(%rip), %rcx     # 0x6e4d8
movq (%rcx), %rdi
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
callq 0x2f440
jmp 0xbf7c
leaq 0x62602(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x38, %rdi
addq $0x10, %rdi
leaq 0x46940(%rip), %rsi     # 0x52828
callq 0x6370
movq %rax, %rcx
movq 0x10(%rsp), %rax
movq %rcx, 0x8(%rsp)
movq 0x50(%rax), %rax
movslq 0x10(%rax), %rsi
leaq 0x625d7(%rip), %rdi     # 0x6e4e0
callq 0x1fc90
movq 0x8(%rsp), %rdi
movq (%rax), %rsi
addq $0x8, %rsi
callq 0x6340
movq %rax, %rdi
leaq 0x4692d(%rip), %rsi     # 0x52856
callq 0x6370
movq %rax, %rdi
movq 0x10(%rsp), %rax
movl 0x48(%rax), %ecx
leaq 0x4692c(%rip), %rsi     # 0x5286c
leaq 0x4691d(%rip), %rax     # 0x52864
cmpl $0x1, %ecx
cmoveq %rax, %rsi
callq 0x6370
movq %rax, %rdi
leaq 0x4b75a(%rip), %rsi     # 0x576b7
callq 0x6370
movq 0x10(%rsp), %rax
leaq 0x6256a(%rip), %rcx     # 0x6e4d8
movq (%rcx), %rdi
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
callq 0x2f440
jmp 0xbf7e
addq $0x28, %rsp
retq
nopw %cs:(%rax,%rax)