mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-08-18 20:30:05 +02:00
Merge pull request #560 from klickverbot/assoc-literal
Return undef instead of null on toConstElem failure.
This commit is contained in:
@@ -237,9 +237,15 @@ public:
|
|||||||
virtual elem *toElem(IRState *irs);
|
virtual elem *toElem(IRState *irs);
|
||||||
elem *toElemDtor(IRState *irs);
|
elem *toElemDtor(IRState *irs);
|
||||||
#if IN_LLVM
|
#if IN_LLVM
|
||||||
|
/// Emits an LLVM constant corresponding to the expression.
|
||||||
|
///
|
||||||
|
/// Due to the current implementation of AssocArrayLiteralExp::toElem,the
|
||||||
|
/// implementations have to be able to handle being called on expressions
|
||||||
|
/// that are not actually constant. In such a case, an LLVM undef of the
|
||||||
|
/// expected type should be returned (_not_ null).
|
||||||
virtual llvm::Constant *toConstElem(IRState *irs);
|
virtual llvm::Constant *toConstElem(IRState *irs);
|
||||||
virtual void cacheLvalue(IRState* irs);
|
|
||||||
|
|
||||||
|
virtual void cacheLvalue(IRState* irs);
|
||||||
llvm::Value* cachedLvalue;
|
llvm::Value* cachedLvalue;
|
||||||
|
|
||||||
virtual AssignExp* isAssignExp() { return NULL; }
|
virtual AssignExp* isAssignExp() { return NULL; }
|
||||||
|
|||||||
27
gen/toir.cpp
27
gen/toir.cpp
@@ -652,8 +652,8 @@ LLConstant* AddExp::toConstElem(IRState* p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
error("expression '%s' is not a constant", toChars());
|
error("expression '%s' is not a constant", toChars());
|
||||||
fatal();
|
if (!global.gag) fatal();
|
||||||
return NULL;
|
return llvm::UndefValue::get(DtoType(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to remove a MulExp by a constant value of baseSize from e. Returns
|
/// Tries to remove a MulExp by a constant value of baseSize from e. Returns
|
||||||
@@ -766,8 +766,8 @@ LLConstant* MinExp::toConstElem(IRState* p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
error("expression '%s' is not a constant", toChars());
|
error("expression '%s' is not a constant", toChars());
|
||||||
fatal();
|
if (!global.gag) fatal();
|
||||||
return NULL;
|
return llvm::UndefValue::get(DtoType(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
DValue* MinExp::toElem(IRState* p)
|
DValue* MinExp::toElem(IRState* p)
|
||||||
@@ -1231,7 +1231,7 @@ Lerr:
|
|||||||
error("cannot cast %s to %s at compile time", e1->type->toChars(), type->toChars());
|
error("cannot cast %s to %s at compile time", e1->type->toChars(), type->toChars());
|
||||||
if (!global.gag)
|
if (!global.gag)
|
||||||
fatal();
|
fatal();
|
||||||
return NULL;
|
return llvm::UndefValue::get(DtoType(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -1290,11 +1290,7 @@ llvm::Constant* SymOffExp::toConstElem(IRState* p)
|
|||||||
IF_LOG Logger::println("SymOffExp::toConstElem: %s @ %s", toChars(), type->toChars());
|
IF_LOG Logger::println("SymOffExp::toConstElem: %s @ %s", toChars(), type->toChars());
|
||||||
LOG_SCOPE;
|
LOG_SCOPE;
|
||||||
|
|
||||||
// We might get null here due to the hackish implementation of
|
|
||||||
// AssocArrayLiteralExp::toElem.
|
|
||||||
llvm::Constant* base = DtoConstSymbolAddress(loc, var);
|
llvm::Constant* base = DtoConstSymbolAddress(loc, var);
|
||||||
if (!base) return 0;
|
|
||||||
|
|
||||||
llvm::Constant* result;
|
llvm::Constant* result;
|
||||||
if (offset == 0)
|
if (offset == 0)
|
||||||
{
|
{
|
||||||
@@ -1462,7 +1458,8 @@ LLConstant* AddrExp::toConstElem(IRState* p)
|
|||||||
else if (e1->op == TOKslice)
|
else if (e1->op == TOKslice)
|
||||||
{
|
{
|
||||||
error("non-constant expression '%s'", toChars());
|
error("non-constant expression '%s'", toChars());
|
||||||
fatal();
|
if (!global.gag) fatal();
|
||||||
|
return llvm::UndefValue::get(DtoType(type));
|
||||||
}
|
}
|
||||||
// not yet supported
|
// not yet supported
|
||||||
else
|
else
|
||||||
@@ -2872,7 +2869,8 @@ LLConstant* FuncExp::toConstElem(IRState* p)
|
|||||||
{
|
{
|
||||||
assert(fd->tok == TOKdelegate || fd->tok == TOKreserved);
|
assert(fd->tok == TOKdelegate || fd->tok == TOKreserved);
|
||||||
error("delegate literals as constant expressions are not yet allowed");
|
error("delegate literals as constant expressions are not yet allowed");
|
||||||
return 0;
|
if (!global.gag) fatal();
|
||||||
|
return llvm::UndefValue::get(DtoType(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need to actually codegen the function here, as literals are not added
|
// We need to actually codegen the function here, as literals are not added
|
||||||
@@ -3557,5 +3555,10 @@ llvm::Constant* Expression::toConstElem(IRState * p)
|
|||||||
error("expression '%s' is not a constant", toChars());
|
error("expression '%s' is not a constant", toChars());
|
||||||
if (!global.gag)
|
if (!global.gag)
|
||||||
fatal();
|
fatal();
|
||||||
return NULL;
|
|
||||||
|
// Do not return null here, as AssocArrayLiteralExp::toElem determines
|
||||||
|
// whether it can allocate the needed arrays statically by just invoking
|
||||||
|
// toConstElem on its key/value expressions, and handling the null value
|
||||||
|
// consequently would require error-prone adaptions in all other code.
|
||||||
|
return llvm::UndefValue::get(DtoType(type));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user