# HG changeset patch # User Tomas Lindquist Olsen # Date 1241024379 -7200 # Node ID 04c36605feb907463a3c8c054480bd20b3bc6a87 # Parent 8fb39f7f1a7ce3be75e3c8a91b44e48c4f3d7c61 Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 . diff -r 8fb39f7f1a7c -r 04c36605feb9 dmd/arrayop.c --- a/dmd/arrayop.c Wed Apr 29 18:39:59 2009 +0200 +++ b/dmd/arrayop.c Wed Apr 29 18:59:39 2009 +0200 @@ -275,7 +275,7 @@ //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 -r 8fb39f7f1a7c -r 04c36605feb9 gen/llvmhelpers.cpp --- a/gen/llvmhelpers.cpp Wed Apr 29 18:39:59 2009 +0200 +++ b/gen/llvmhelpers.cpp Wed Apr 29 18:59:39 2009 +0200 @@ -1352,6 +1352,12 @@ bool mustDefineSymbol(Dsymbol* s) { + if (FuncDeclaration* fd = s->isFuncDeclaration()) + { + if (fd->isArrayOp) + return true; + } + TemplateInstance* tinst = DtoIsTemplateInstance(s); if (tinst) { diff -r 8fb39f7f1a7c -r 04c36605feb9 gen/tollvm.cpp --- a/gen/tollvm.cpp Wed Apr 29 18:39:59 2009 +0200 +++ b/gen/tollvm.cpp Wed Apr 29 18:59:39 2009 +0200 @@ -275,9 +275,9 @@ 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;