DMD Issue 5416 - null should have a type of its own

This commit is contained in:
Alexey Prokhin
2011-12-15 13:31:39 +04:00
parent 88cff99bd4
commit edc4a5f003
7 changed files with 21 additions and 4 deletions

View File

@@ -106,6 +106,7 @@ enum TY
Ttuple,
Tslice,
Treturn,
Tnull,
TMAX
};

View File

@@ -96,6 +96,8 @@ void ReturnStatement::toIR(IRState* p)
if (!exp && (p->topfunc() == p->mainFunc)) {
v = LLConstant::getNullValue(p->mainFunc->getReturnType());
} else {
if (exp->op == TOKnull)
exp->type = p->func()->type->next;
#if DMDV2
DValue* dval = 0;
// call postblit if necessary

View File

@@ -1551,7 +1551,7 @@ DValue* CmpExp::toElem(IRState* p)
LLValue* eval = 0;
if (t->isintegral() || t->ty == Tpointer)
if (t->isintegral() || t->ty == Tpointer || t->ty == Tnull)
{
llvm::ICmpInst::Predicate cmpop;
bool skip = false;
@@ -1677,7 +1677,7 @@ DValue* EqualExp::toElem(IRState* p)
// the Tclass catches interface comparisons, regular
// class equality should be rewritten as a.opEquals(b) by this time
if (t->isintegral() || t->ty == Tpointer || t->ty == Tclass)
if (t->isintegral() || t->ty == Tpointer || t->ty == Tclass || t->ty == Tnull)
{
Logger::println("integral or pointer or interface");
llvm::ICmpInst::Predicate cmpop;

View File

@@ -95,6 +95,7 @@ LLType* DtoType(Type* t)
}
// pointers
case Tnull:
case Tpointer:
{
t->irtype = new IrTypePointer(t);

View File

@@ -380,7 +380,11 @@ void DtoDeclareTypeInfo(TypeInfoDeclaration* tid)
void TypeInfoDeclaration::llvmDefine()
{
assert(0 && "cannot generate generic typeinfo");
Logger::println("TypeInfoDeclaration::llvmDefine() %s", toChars());
LOG_SCOPE;
RTTIBuilder b(Type::typeinfo);
b.finalize(ir.irGlobal);
}
/* ========================================================================= */

View File

@@ -137,7 +137,7 @@ llvm::Type * IrTypeBasic::basic2llvm(Type* t)
//////////////////////////////////////////////////////////////////////////////
IrTypePointer::IrTypePointer(Type * dt)
: IrType(dt, pointer2llvm(dt))
: IrType(dt, dt->ty == Tnull ? null2llvm(dt) : pointer2llvm(dt))
{
}
@@ -160,6 +160,13 @@ llvm::Type * IrTypePointer::pointer2llvm(Type * dt)
return llvm::PointerType::get(elemType, 0);
}
llvm::Type* IrTypePointer::null2llvm(Type* dt)
{
assert(dt->ty == Tnull && "not null type");
LLType* elemType = llvm::Type::getInt8Ty(llvm::getGlobalContext());
return llvm::PointerType::get(elemType, 0);
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

View File

@@ -105,6 +105,8 @@ public:
protected:
///
llvm::Type* pointer2llvm(Type* t);
///
llvm::Type* null2llvm(Type* t);
};
//////////////////////////////////////////////////////////////////////////////