mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-11 18:33:14 +01:00
Previously, we just had a hack to make ref foreach statements work. This commit enables them to work in other cases as well, like the implicit __result variable for functions with out-contracts (which is such a magic ref variable for ref-returning functions). Fixes DMD testcase 'testcontracts'.
81 lines
2.4 KiB
C++
81 lines
2.4 KiB
C++
#include "gen/llvm.h"
|
|
#include "declaration.h"
|
|
#include "gen/irstate.h"
|
|
#include "ir/irvar.h"
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
IrVar::IrVar(VarDeclaration* var)
|
|
{
|
|
V = var;
|
|
value = NULL;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
IrGlobal::IrGlobal(VarDeclaration* v): IrVar(v)
|
|
{
|
|
type = NULL;
|
|
constInit = NULL;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
IrLocal::IrLocal(VarDeclaration* v) : IrVar(v)
|
|
{
|
|
nestedIndex = -1;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
IrParameter::IrParameter(VarDeclaration* v) : IrLocal(v), arg(0), isVthis(false)
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
IrField::IrField(VarDeclaration* v) : IrVar(v)
|
|
{
|
|
assert(V->ir.irField == NULL && "field for this variable already exists");
|
|
V->ir.irField = this;
|
|
|
|
if (v->aggrIndex)
|
|
{
|
|
index = v->aggrIndex;
|
|
unionOffset = 0;
|
|
}
|
|
else
|
|
{
|
|
index = 0;
|
|
unionOffset = v->offset;
|
|
}
|
|
constInit = NULL;
|
|
}
|
|
|
|
extern LLConstant* get_default_initializer(
|
|
VarDeclaration* vd,
|
|
Initializer* init);
|
|
|
|
llvm::Constant * IrField::getDefaultInit()
|
|
{
|
|
if (constInit)
|
|
return constInit;
|
|
constInit = get_default_initializer(V, V->init);
|
|
return constInit;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|