Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 .

This commit is contained in:
Tomas Lindquist Olsen 2009-04-29 18:59:39 +02:00
parent 617861ead4
commit ca39bb4f4d
3 changed files with 9 additions and 3 deletions

View file

@ -275,7 +275,7 @@ Expression *BinExp::arrayOp(Scope *sc)
//printf("ftype: %s\n", ftype->toChars()); //printf("ftype: %s\n", ftype->toChars());
fd = new FuncDeclaration(0, 0, Lexer::idPool(name), STCundefined, ftype); fd = new FuncDeclaration(0, 0, Lexer::idPool(name), STCundefined, ftype);
fd->fbody = fbody; fd->fbody = fbody;
fd->protection = PROTprotected; fd->protection = PROTpublic;
fd->linkage = LINKd; fd->linkage = LINKd;
// special attention for array ops // special attention for array ops

View file

@ -1352,6 +1352,12 @@ void DtoOverloadedIntrinsicName(TemplateInstance* ti, TemplateDeclaration* td, s
bool mustDefineSymbol(Dsymbol* s) bool mustDefineSymbol(Dsymbol* s)
{ {
if (FuncDeclaration* fd = s->isFuncDeclaration())
{
if (fd->isArrayOp)
return true;
}
TemplateInstance* tinst = DtoIsTemplateInstance(s); TemplateInstance* tinst = DtoIsTemplateInstance(s);
if (tinst) if (tinst)
{ {

View file

@ -275,9 +275,9 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
assert(fdecl->type->ty == Tfunction); assert(fdecl->type->ty == Tfunction);
TypeFunction* ft = (TypeFunction*)fdecl->type; TypeFunction* ft = (TypeFunction*)fdecl->type;
// array operations are always internal // array operations are always template linkage
if (fdecl->isArrayOp) if (fdecl->isArrayOp)
return llvm::GlobalValue::InternalLinkage; return TEMPLATE_LINKAGE_TYPE;
// intrinsics are always external // intrinsics are always external
if (fdecl->llvmInternal == LLVMintrinsic) if (fdecl->llvmInternal == LLVMintrinsic)
return llvm::GlobalValue::ExternalLinkage; return llvm::GlobalValue::ExternalLinkage;