From ab167179462bde5b63d3198ff2c385aac5936ee8 Mon Sep 17 00:00:00 2001 From: Eduardo Garre Date: Sun, 31 Oct 2021 10:03:17 +0100 Subject: [PATCH] Resuelvo errata #3: Error al asignar un valor negativo a una variable de tipo entero. https://github.com/eduardogarre/lenguaje/issues/3 --- "\303\261/constructor.cpp" | 46 +++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git "a/\303\261/constructor.cpp" "b/\303\261/constructor.cpp" index 9c6ec33..c88b27a 100644 --- "a/\303\261/constructor.cpp" +++ "b/\303\261/constructor.cpp" @@ -2372,11 +2372,55 @@ namespace Ñ { Ñ::ResultadoLlvm resultado; Ñ::OperaciónUnaria* op = (Ñ::OperaciónUnaria*)nodo; + if(nodo->ramas.size() < 1) + { + resultado.error("Operación unaria mal construida."); + resultado.posición(nodo->posición()); + return resultado; + } Ñ::Nodo* hijo = nodo->ramas[0]; llvm::Value* valor; llvm::Value* valorFinal; - if(op->operación == "@") + if(op->operación == "-") + { + if(hijo == nullptr) + { + resultado.error("No puedo negar el valor."); + resultado.posición(nodo->posición()); + return resultado; + } + + Ñ::ResultadoLlvm rValor = construyeLDA(hijo); + if(rValor.error()) + { + return rValor; + } + + valor = rValor.valor(); + + if(valor == nullptr) + { + resultado.error("No puedo negar el valor."); + resultado.posición(nodo->posición()); + return resultado; + } + + auto valorCero = llvm::ConstantInt::get(valor->getType(), 0, false); + valorFinal = entorno->constructorLlvm.CreateSub(valorCero, valor, "negativiza"); + + if(valorFinal == nullptr) + { + resultado.error("Error al intentar negar el valor."); + resultado.posición(nodo->posición()); + return resultado; + } + + resultado.éxito(); + resultado.valor(valorFinal); + return resultado; + } + else if(op->operación == "@") { if(hijo == nullptr) {