diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index 5a8c3c7..4fdd0d8 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -97,9 +97,15 @@ void ModuleBuilder::buildStatement(shared_ptr statement) { void ModuleBuilder::buildFunction(shared_ptr statement) { // function types llvm::Type *returnType = typeForValueType(statement->getReturnValueType()); + if (returnType == nullptr) + return; vector argTypes; - for (pair> &arg : statement->getArguments()) - argTypes.push_back(typeForValueType(arg.second)); + for (pair> &arg : statement->getArguments()) { + llvm::Type *argType = typeForValueType(arg.second); + if (argType == nullptr) + return; + argTypes.push_back(argType); + } // build function declaration llvm::FunctionType *funType = llvm::FunctionType::get(returnType, argTypes, false); @@ -274,7 +280,10 @@ void ModuleBuilder::buildMetaExternFunction(shared_ptrgetReturnValueType()), types, false); + llvm::Type *returnType = typeForValueType(statement->getReturnValueType()); + if (returnType == nullptr) + return; + llvm::FunctionType *funType = llvm::FunctionType::get(returnType, types, false); llvm::Function *fun = llvm::Function::Create(funType, llvm::GlobalValue::ExternalLinkage, statement->getName(), module.get()); if (!setFun(statement->getName(), fun)) return; @@ -663,6 +672,11 @@ llvm::InlineAsm *ModuleBuilder::getRawFun(string name) { } llvm::Type *ModuleBuilder::typeForValueType(shared_ptr valueType, int count) { + if (valueType == nullptr) { + markError(0, 0, "Missing type"); + return nullptr; + } + switch (valueType->getKind()) { case ValueTypeKind::NONE: return typeVoid; @@ -684,7 +698,6 @@ llvm::Type *ModuleBuilder::typeForValueType(shared_ptr valueType, int if (valueType->getValueArg() > 0) count = valueType->getValueArg(); return llvm::ArrayType::get(typeForValueType(valueType->getSubType(), count), count); - return nullptr; } } } diff --git a/src/Logger.cpp b/src/Logger.cpp index 6cfbd4f..d5ca83d 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -203,6 +203,9 @@ string Logger::toString(TokenKind tokenKind) { } string Logger::toString(shared_ptr valueType) { + if (valueType == nullptr) + return "{INVALID}"; + switch (valueType->getKind()) { case ValueTypeKind::NONE: return "NONE";