From ca39bb4f4daf262b720afe750d7cef21e337b9a3 Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Wed, 29 Apr 2009 18:59:39 +0200 Subject: [PATCH] Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 . --- dmd/arrayop.c | 2 +- gen/llvmhelpers.cpp | 6 ++++++ gen/tollvm.cpp | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/dmd/arrayop.c b/dmd/arrayop.c index 77b866fb..7212e5eb 100644 --- a/dmd/arrayop.c +++ b/dmd/arrayop.c @@ -275,7 +275,7 @@ Expression *BinExp::arrayOp(Scope *sc) //printf("ftype: %s\n", ftype->toChars()); fd = new FuncDeclaration(0, 0, Lexer::idPool(name), STCundefined, ftype); fd->fbody = fbody; - fd->protection = PROTprotected; + fd->protection = PROTpublic; fd->linkage = LINKd; // special attention for array ops diff --git a/gen/llvmhelpers.cpp b/gen/llvmhelpers.cpp index 46ee4745..d641e981 100644 --- a/gen/llvmhelpers.cpp +++ b/gen/llvmhelpers.cpp @@ -1352,6 +1352,12 @@ void DtoOverloadedIntrinsicName(TemplateInstance* ti, TemplateDeclaration* td, s bool mustDefineSymbol(Dsymbol* s) { + if (FuncDeclaration* fd = s->isFuncDeclaration()) + { + if (fd->isArrayOp) + return true; + } + TemplateInstance* tinst = DtoIsTemplateInstance(s); if (tinst) { diff --git a/gen/tollvm.cpp b/gen/tollvm.cpp index 8d8103ce..686a1f25 100644 --- a/gen/tollvm.cpp +++ b/gen/tollvm.cpp @@ -275,9 +275,9 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym) assert(fdecl->type->ty == Tfunction); TypeFunction* ft = (TypeFunction*)fdecl->type; - // array operations are always internal + // array operations are always template linkage if (fdecl->isArrayOp) - return llvm::GlobalValue::InternalLinkage; + return TEMPLATE_LINKAGE_TYPE; // intrinsics are always external if (fdecl->llvmInternal == LLVMintrinsic) return llvm::GlobalValue::ExternalLinkage;