Files
c3c/test/test_suite/struct/nested_struct_union_init.c3t

110 lines
3.4 KiB
C

// #target: macos-x64
module foob;
import libc;
struct Matrix2x2
{
union
{
float[4] m;
struct {
float m00, m01, m10, m11;
}
}
}
struct Matrix2x2_b
{
union
{
struct {
float m00, m01, m10, m11;
}
float[4] m;
}
}
struct Matrix4x4 {
union {
struct {
float m00, m01, m02, m03;
float m10, m11, m12, m13;
float m20, m21, m22, m23;
float m30, m31, m32, m33;
}
float[16] m;
}
}
struct Matrix3x3 {
union {
struct {
float m00, m01, m02, m10, m11, m12, m20, m21, m22;
}
float[9] m;
}
}
fn void main()
{
Matrix3x3 x = { 1, 2, 3, 4, 5, 6, 7,8 ,9};
Matrix2x2 m = { float[4] { 1, 2, 3, 4 } };
Matrix2x2_b m2 = { 1, 2, 3, 4 };
libc::printf("%f %f %f %f\n", x.m00, x.m[1], x.m10, x.m[3]);
}
/* #expect: foob.ll
%Matrix2x2 = type { %.anon.1 }
%.anon.1 = type { [4 x float] }
%Matrix2x2_b = type { %.anon.2 }
%.anon.2 = type { %.anon.3 }
%.anon.3 = type { float, float, float, float }
%Matrix3x3 = type { %.anon }
%.anon = type { %.anon.0 }
%.anon.0 = type { float, float, float, float, float, float, float, float, float }
define void @foob.main() #0 {
entry:
%x = alloca %Matrix3x3, align 4
%m = alloca %Matrix2x2, align 4
%m2 = alloca %Matrix2x2_b, align 4
%0 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0
%1 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 0
store float 1.000000e+00, ptr %1, align 4
%2 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 1
store float 2.000000e+00, ptr %2, align 4
%3 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 2
store float 3.000000e+00, ptr %3, align 4
%4 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 3
store float 4.000000e+00, ptr %4, align 4
%5 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 4
store float 5.000000e+00, ptr %5, align 4
%6 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 5
store float 6.000000e+00, ptr %6, align 4
%7 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 6
store float 7.000000e+00, ptr %7, align 4
%8 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 7
store float 8.000000e+00, ptr %8, align 4
%9 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 8
store float 9.000000e+00, ptr %9, align 4
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m, ptr align 4 @.__const, i32 16, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m2, ptr align 4 @.__const.16, i32 16, i1 false)
%10 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0
%11 = getelementptr inbounds %.anon.0, ptr %10, i32 0, i32 0
%12 = load float, ptr %11, align 4
%fpfpext = fpext float %12 to double
%13 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0
%14 = getelementptr inbounds [9 x float], ptr %13, i64 0, i64 1
%15 = load float, ptr %14, align 4
%fpfpext1 = fpext float %15 to double
%16 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0
%17 = getelementptr inbounds %.anon.0, ptr %16, i32 0, i32 3
%18 = load float, ptr %17, align 4
%fpfpext2 = fpext float %18 to double
%19 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0
%20 = getelementptr inbounds [9 x float], ptr %19, i64 0, i64 3
%21 = load float, ptr %20, align 4
%fpfpext3 = fpext float %21 to double
%22 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3)
ret void
}