mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-04 09:00:33 +03:00

I noticed that an `align(N) class ...` seems to be totally ignored; i.e., it has no effect on `Type::alignment()` and neither on `ClassDeclaration::alignsize()`. I checked the paddings too (and the tests cover them as well); they seem fine already, both inbetween header and payload (and for both D and C++ classes, the latter missing the monitor field) as well as inbetween base payload and derived payload.
41 lines
1.3 KiB
D
41 lines
1.3 KiB
D
// RUN: %ldc -output-ll -of=%t.ll %s && FileCheck %s < %t.ll
|
|
// RUN: %ldc -run %s
|
|
|
|
struct S16 { align(16) int a; }
|
|
|
|
class D { align(32) int d = 0xDD; }
|
|
// CHECK: %align_class.D = type { [5 x i8*]*, i8*, [{{(16|24)}} x i8], i32 }
|
|
class E : D { S16 s16 = S16(0xEE); }
|
|
// CHECK: %align_class.E = type { [5 x i8*]*, i8*, [{{(16|24)}} x i8], i32, [12 x i8], %align_class.S16 }
|
|
class F : D { align(64) int f = 0xFF; }
|
|
// CHECK: %align_class.F = type { [5 x i8*]*, i8*, [{{(16|24)}} x i8], i32, [28 x i8], i32 }
|
|
|
|
extern(C++) class CppClass { align(32) int a = 0xAA; }
|
|
// CHECK: %align_class.CppClass = type { [0 x i8*]*, [{{(24|28)}} x i8], i32 }
|
|
|
|
void main()
|
|
{
|
|
scope d = new D;
|
|
// CHECK: = alloca %align_class.D, align 32
|
|
static assert(D.d.offsetof == 32);
|
|
assert(d.d == 0xDD);
|
|
|
|
scope e = new E;
|
|
// CHECK: = alloca %align_class.E, align 32
|
|
static assert(E.d.offsetof == 32);
|
|
assert(e.d == 0xDD);
|
|
static assert(E.s16.offsetof == 48);
|
|
assert(e.s16.a == 0xEE);
|
|
|
|
scope f = new F;
|
|
// CHECK: = alloca %align_class.F, align 64
|
|
static assert(F.d.offsetof == 32);
|
|
assert(f.d == 0xDD);
|
|
static assert(F.f.offsetof == 64);
|
|
assert(f.f == 0xFF);
|
|
|
|
scope cppClass = new CppClass;
|
|
// CHECK: = alloca %align_class.CppClass, align 32
|
|
static assert(CppClass.a.offsetof == 32);
|
|
assert(cppClass.a == 0xAA);
|
|
}
|