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;