// File: /workspace/github_c_makefile_star2_O0/thiagok00[P]INF1715-Compilers/TabelaSimbolos.c
// Function: checa_tipo_cmdatr
static void checa_tipo_cmdatr(Simbolo *s, CMD *cmd, int nivelEscopo) {
  tipa_variavel(s,cmd->u.atr.var,nivelEscopo);
  tipa_expressao(s,cmd->u.atr.exp,nivelEscopo);

  if(cmd->u.atr.var->tipo->tipo_base == bVoid && cmd->u.atr.exp->tipo->tipo_base == bVoid){
    printf("[Erro] atribuicao invalida de tipo \"%s\" para tipo \"%s\"\n",getStringTipo(cmd->u.atr.exp->tipo),getStringTipo(cmd->u.atr.var->tipo));
    exit(1);
  }

  if(cmd->u.atr.var->tipo->tag == base && cmd->u.atr.exp->tipo->tag == base) {
    int resp = cmp_tipo_base(cmd->u.atr.exp->tipo, cmd->u.atr.var->tipo);
    if (resp < 0){
      //promove tipo da expressao para o tipo da variavel
      Exp *expas;
      expas = promove_tipo(cmd->u.atr.exp,cmd->u.atr.var->tipo->tipo_base);
      expas->u.expnewas.exp = cmd->u.atr.exp;
      cmd->u.atr.exp = expas;
    }
    if (resp > 0) {
      //tipo da expressao é mais expressivo que da variavel, nao converte
      printf("[Erro] atribuicao invalida de tipo \"%s\" para tipo \"%s\"\n",getStringTipo(cmd->u.atr.exp->tipo),getStringTipo(cmd->u.atr.var->tipo));
      exit(1);
    }
  }
  else if (cmd->u.atr.var->tipo->tag == array && cmd->u.atr.exp->tipo->tag == array) {
    if(cmp_tipo_array(cmd->u.atr.var->tipo,cmd->u.atr.exp->tipo) != 0){
      printf("[Erro] atribuicao invalida de tipo \"%s\" para tipo \"%s\"\n",getStringTipo(cmd->u.atr.exp->tipo),getStringTipo(cmd->u.atr.var->tipo));
      exit(1);
    }
  }
  else {
    printf("[Erro] atribuicao invalida de tipo \"%s\" para tipo \"%s\"\n",getStringTipo(cmd->u.atr.exp->tipo),getStringTipo(cmd->u.atr.var->tipo));
    exit(1);
  }
  return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x63e0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x6310
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x0, 0x4(%rax)
jne 0x60e4
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x0, 0x4(%rax)
jne 0x60e4
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq -0x28(%rbp), %rsi
movq %rax, %rdx
leaq 0x4638(%rip), %rdi      # 0xa70b
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x0, (%rax)
jne 0x61c0
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x0, (%rax)
jne 0x61c0
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rsi
callq 0x6580
movl %eax, -0x18(%rbp)
cmpl $0x0, -0x18(%rbp)
jge 0x6170
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movl 0x4(%rax), %esi
callq 0x6610
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x10(%rax)
cmpl $0x0, -0x18(%rbp)
jle 0x61bb
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq -0x30(%rbp), %rsi
movq %rax, %rdx
leaq 0x4561(%rip), %rdi      # 0xa70b
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
jmp 0x6292
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x1, (%rax)
jne 0x624b
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x1, (%rax)
jne 0x624b
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rsi
callq 0x66f0
cmpl $0x0, %eax
je 0x6249
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq -0x38(%rbp), %rsi
movq %rax, %rdx
leaq 0x44d3(%rip), %rdi      # 0xa70b
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
jmp 0x6290
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq -0x40(%rbp), %rsi
movq %rax, %rdx
leaq 0x448c(%rip), %rdi      # 0xa70b
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
jmp 0x6292
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax,%rax)