mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-11 18:33:14 +01:00
DMD Issue 5416 - null should have a type of its own
This commit is contained in:
@@ -106,6 +106,7 @@ enum TY
|
||||
Ttuple,
|
||||
Tslice,
|
||||
Treturn,
|
||||
Tnull,
|
||||
TMAX
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -95,6 +95,7 @@ LLType* DtoType(Type* t)
|
||||
}
|
||||
|
||||
// pointers
|
||||
case Tnull:
|
||||
case Tpointer:
|
||||
{
|
||||
t->irtype = new IrTypePointer(t);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -105,6 +105,8 @@ public:
|
||||
protected:
|
||||
///
|
||||
llvm::Type* pointer2llvm(Type* t);
|
||||
///
|
||||
llvm::Type* null2llvm(Type* t);
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user