extern func void printf(char* c, ...); struct ExtraSimple { int a; int b; struct c { double e; double f0; double f1; double f; double j; } struct { int r; int s; } union { double o0; int o1; } int g; } func void testSimple() { ExtraSimple a = { c.j = 3.3 }; a.c.j = 3.4; printf("a = %d, c.e = %f, c.f = %f, c.j = %f, g = %d, o0 = %f, r = %d, s = %d\n", a.a, a.c.e, a.c.f, a.c.j, a.g, a.o0, a.r, a.s); } // #expect: pointer_access.ll %pointer_access.ExtraSimple = type { i32, i32, %pointer_access.c, %pointer_access.anon, %pointer_access.anon.0, i32 } %pointer_access.c = type { double, double, double, double, double } %pointer_access.anon = type { i32, i32 } %pointer_access.anon.0 = type { double } @ExtraSimple = linkonce_odr constant i8 1 entry: %a = alloca %pointer_access.ExtraSimple, align 8 %literal = alloca %pointer_access.ExtraSimple, align 8 %0 = bitcast %pointer_access.ExtraSimple* %literal to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 72, i1 false) %c = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %literal, i32 0, i32 2 %double = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c, i32 0, i32 4 store double 3.300000e+00, double* %double %1 = bitcast %pointer_access.ExtraSimple* %a to i8* %2 = bitcast %pointer_access.ExtraSimple* %literal to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 %2, i32 72, i1 false) %c1 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2 %j = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c1, i32 0, i32 4 store double 3.400000e+00, double* %j, align 8 %a2 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 0 %3 = load i32, i32* %a2, align 4 %c3 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2 %e = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c3, i32 0, i32 0 %4 = load double, double* %e, align 8 %c4 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2 %f = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c4, i32 0, i32 3 %5 = load double, double* %f, align 8 %c5 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2 %j6 = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c5, i32 0, i32 4 %6 = load double, double* %j6, align 8 %g = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 5 %7 = load i32, i32* %g, align 4 %anon = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 4 %o0 = bitcast %pointer_access.anon.0* %anon to double* %8 = load double, double* %o0, align 8 %anon7 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3 %r = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon7, i32 0, i32 0 %9 = load i32, i32* %r, align 4 %anon8 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3 %s = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon8, i32 0, i32 1 %10 = load i32, i32* %s, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @0, i32 0, i32 0), i32 %3, double %4, double %5, double %6, i32 %7, double %8, i32 %9, i32 %10) ret void