// #target: macos-x64
int[<4>] baz = { 1, 4, 5, 7 };

fn void main()
{
    int[<4>] foo = { 1, 2, 3, 4 };
    int z = foo[0];
    foo[2] = z + 1;
    int[<4>] bar = {};
    int[<4>] bar2 = { 1, z, 3, 4 };
    int[<4>] bar3 = { [1] = z };
    int[<4>] bar4 = { [0..3] = z };
}

/* #expect: vector_init.ll

@vector_init.baz = local_unnamed_addr global <4 x i32> <i32 1, i32 4, i32 5, i32 7>, align 16


define void @vector_init.main() #0 {
entry:
  %foo = alloca <4 x i32>, align 16
  %z = alloca i32, align 4
  %bar = alloca <4 x i32>, align 16
  %bar2 = alloca <4 x i32>, align 16
  %bar3 = alloca <4 x i32>, align 16
  %bar4 = alloca <4 x i32>, align 16
  store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %foo, align 16
  %0 = load <4 x i32>, ptr %foo, align 16
  %1 = extractelement <4 x i32> %0, i64 0
  store i32 %1, ptr %z, align 4
  %2 = load <4 x i32>, ptr %foo, align 16
  %3 = load i32, ptr %z, align 4
  %add = add i32 %3, 1
  %elemset = insertelement <4 x i32> %2, i32 %add, i64 2
  store <4 x i32> %elemset, ptr %foo, align 16
  store <4 x i32> zeroinitializer, ptr %bar, align 16
  %4 = load i32, ptr %z, align 4
  %5 = insertelement <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>, i32 %4, i64 1
  %6 = insertelement <4 x i32> %5, i32 3, i64 2
  %7 = insertelement <4 x i32> %6, i32 4, i64 3
  store <4 x i32> %7, ptr %bar2, align 16
  %8 = load i32, ptr %z, align 4
  %9 = insertelement <4 x i32> zeroinitializer, i32 %8, i64 1
  store <4 x i32> %9, ptr %bar3, align 16
  %10 = load i32, ptr %z, align 4
  %11 = insertelement <4 x i32> zeroinitializer, i32 %10, i64 0
  %12 = insertelement <4 x i32> %11, i32 %10, i64 1
  %13 = insertelement <4 x i32> %12, i32 %10, i64 2
  %14 = insertelement <4 x i32> %13, i32 %10, i64 3
  store <4 x i32> %14, ptr %bar4, align 16
  ret void
}