ldc/tests/codegen/const_struct.d
2017-10-07 14:06:17 +02:00

52 lines
1.8 KiB
D

// RUN: %ldc -c -output-ll -of=%t.ll %s && FileCheck %s < %t.ll
// RUN: %ldc -run %s
struct S0 { uint x; }
struct S1 { S0 y; this(this) { y.x = 1; } }
struct S2 { S1[3] z; }
struct C0 { int *x; }
void testNested() {
int x;
// The 'x' here is accessed via the nested context pointer
struct N1 { ~this() { ++x; } }
struct N0 { N1[3] x; }
{ N0 n; }
assert(x == 3);
}
// CHECK: @.immutablearray{{.*}} = internal constant [4 x i32]
// CHECK: @.immutablearray{{.*}} = internal constant [2 x float]
// CHECK: @.immutablearray{{.*}} = internal constant [2 x double]
// CHECK: @.immutablearray{{.*}} = internal constant [2 x { i{{32|64}}, i8* }]
// CHECK: @.immutablearray{{.*}} = internal constant [1 x %const_struct.S2]
// CHECK: @.immutablearray{{.*}} = internal constant [2 x i32*] {{.*}}globVar
// CHECK: @.immutablearray{{.*}} = internal constant [2 x void ()*] {{.*}}Dmain
void main () {
// Simple types
immutable int[] aA = [ 1, 2, 3, 4 ];
immutable float[] aB = [ 3.14, 3.33 ];
immutable double[] aC = [ 3.14, 3.33 ];
immutable string[] aD = [ "one", "two" ];
// Complex type
immutable S2[] aE = [ { [ { { 42 } }, { { 43 } }, { { 44 } } ] } ];
// Complex type with non-constant initializer
// CHECK: %.gc_mem = call { i{{32|64}}, i8* } @_d_newarrayU
// CHECK-SAME: @{{.*}}_D29TypeInfo_yAS12const_struct2C06__initZ
immutable C0[] aF = [ { new int(42) }, { new int(24) } ];
// Pointer types
static immutable int globVar;
immutable auto globalVariables = [ &globVar, &globVar ];
immutable auto functionPointers = [ &main, &main ];
// Pointer arrays with non-const initializer
immutable int localVar;
immutable auto locA = [ &localVar, &localVar ];
// CHECK: %.gc_mem{{.*}} = call { i{{32|64}}, i8* } @_d_newarrayU
// CHECK-SAME: @{{.*}}_D13TypeInfo_yAPi6__initZ
testNested();
}