diff --git a/gen/dibuilder.cpp b/gen/dibuilder.cpp index e63733a973..4cd8f16a96 100644 --- a/gen/dibuilder.cpp +++ b/gen/dibuilder.cpp @@ -834,8 +834,7 @@ ldc::DISubprogram ldc::DIBuilder::EmitSubProgram(FuncDeclaration *fd) { #endif ); #if LDC_LLVM_VER >= 308 - if (fd->fbody) - DtoFunction(fd)->setSubprogram(SP); + DtoFunction(fd)->setSubprogram(SP); #endif return SP; } diff --git a/gen/functions.cpp b/gen/functions.cpp index ff13065759..cc78249ab2 100644 --- a/gen/functions.cpp +++ b/gen/functions.cpp @@ -921,15 +921,24 @@ void DtoDefineFunction(FuncDeclaration *fd, bool linkageAvailableExternally) { return; } - IrFunction *irFunc = getIrFunc(fd); + IrFunction *const irFunc = getIrFunc(fd); + llvm::Function *const func = irFunc->getLLVMFunc(); - // debug info - irFunc->diSubprogram = gIR->DBuilder.EmitSubProgram(fd); + if (!func->empty()) { + warning(fd->loc, + "skipping definition of function `%s` due to previous definition " + "for the same mangled name: %s", + fd->toPrettyChars(), mangleExact(fd)); + return; + } if (!fd->fbody) { return; } + // debug info + irFunc->diSubprogram = gIR->DBuilder.EmitSubProgram(fd); + IF_LOG Logger::println("Doing function body for: %s", fd->toChars()); gIR->funcGenStates.emplace_back(new FuncGenState(*irFunc, *gIR)); auto &funcGen = gIR->funcGen(); @@ -940,7 +949,6 @@ void DtoDefineFunction(FuncDeclaration *fd, bool linkageAvailableExternally) { const auto f = static_cast(fd->type->toBasetype()); IrFuncTy &irFty = irFunc->irFty; - llvm::Function *func = irFunc->getLLVMFunc(); const auto lwc = lowerFuncLinkage(fd); if (linkageAvailableExternally) {