mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-25 17:13:14 +01:00
Make static int[] a = [1, 2]; a[0] = 4; not segfault
by making the array data ptr a non-const global variable.
This commit is contained in:
@@ -317,7 +317,9 @@ LLConstant* DtoConstArrayInitializer(ArrayInitializer* arrinit)
|
||||
return constarr;
|
||||
|
||||
// for dynamic array we need to make a global with the data, so we have a pointer for the dynamic array
|
||||
LLGlobalVariable* gvar = new LLGlobalVariable(constarr->getType(), true, LLGlobalValue::InternalLinkage, constarr, ".constarray", gIR->module);
|
||||
// Important: don't make the gvar constant, since this const initializer might
|
||||
// be used as an initializer for a static T[] - where modifying contents is allowed.
|
||||
LLGlobalVariable* gvar = new LLGlobalVariable(constarr->getType(), false, LLGlobalValue::InternalLinkage, constarr, ".constarray", gIR->module);
|
||||
LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) };
|
||||
|
||||
LLConstant* gep = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2);
|
||||
|
||||
@@ -2405,7 +2405,9 @@ LLConstant* ArrayLiteralExp::toConstElem(IRState* p)
|
||||
return initval;
|
||||
|
||||
// for dynamic arrays we need to put the initializer in a global, and build a constant dynamic array reference with the .ptr field pointing into this global
|
||||
LLConstant* globalstore = new LLGlobalVariable(arrtype, true, LLGlobalValue::InternalLinkage, initval, ".dynarrayStorage", p->module);
|
||||
// Important: don't make the global constant, since this const initializer might
|
||||
// be used as an initializer for a static T[] - where modifying contents is allowed.
|
||||
LLConstant* globalstore = new LLGlobalVariable(arrtype, false, LLGlobalValue::InternalLinkage, initval, ".dynarrayStorage", p->module);
|
||||
LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) };
|
||||
LLConstant* globalstorePtr = llvm::ConstantExpr::getGetElementPtr(globalstore, idxs, 2);
|
||||
|
||||
|
||||
9
tests/mini/mutablearrayinit.d
Normal file
9
tests/mini/mutablearrayinit.d
Normal file
@@ -0,0 +1,9 @@
|
||||
void main()
|
||||
{
|
||||
static int[] b = [1, 2];
|
||||
b[0] = 2;
|
||||
|
||||
typedef int[] ia = [1,2];
|
||||
static ia a;
|
||||
a[0] = 5;
|
||||
}
|
||||
Reference in New Issue
Block a user