@@ -33,3 +33,37 @@ void baz() {
3333// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca !rec_Struk, !cir.ptr<!rec_Struk>, ["s", init] {alignment = 4 : i64}
3434// CHECK-NEXT: cir.call @_ZN5StrukC1Ev(%[[S_ADDR]]) : (!cir.ptr<!rec_Struk>) -> ()
3535// CHECK-NEXT: cir.return
36+
37+ struct VariadicStruk {
38+ int a;
39+ VariadicStruk (int n, ...) { a = n;}
40+ };
41+
42+ void bar () {
43+ VariadicStruk s (1 , 2 , 3 );
44+ }
45+
46+ // When a variadic constructor is present, we call the C2 constructor directly.
47+
48+ // CHECK-NOT: cir.func @_ZN13VariadicStrukC2Eiz
49+
50+ // CHECK: cir.func @_ZN13VariadicStrukC1Eiz(%arg0: !cir.ptr<!rec_VariadicStruk>
51+ // CHECK-SAME: %arg1: !s32i
52+ // CHECK-SAME: ...) {
53+ // CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]
54+ // CHECK-NEXT: %[[N_ADDR:.*]] = cir.alloca {{.*}} ["n", init]
55+ // CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]
56+ // CHECK-NEXT: cir.store %arg1, %[[N_ADDR]]
57+ // CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]
58+ // CHECK-NEXT: %[[N:.*]] = cir.load{{.*}} %[[N_ADDR]]
59+ // CHECK-NEXT: %[[A_ADDR:.*]] = cir.get_member %[[THIS]][0] {name = "a"}
60+ // CHECK-NEXT: cir.store{{.*}} %[[N]], %[[A_ADDR]]
61+ // CHECK-NEXT: cir.return
62+
63+ // CHECK: cir.func @_Z3barv
64+ // CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca !rec_VariadicStruk, !cir.ptr<!rec_VariadicStruk>, ["s", init]
65+ // CHECK-NEXT: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
66+ // CHECK-NEXT: %[[TWO:.*]] = cir.const #cir.int<2> : !s32i
67+ // CHECK-NEXT: %[[THREE:.*]] = cir.const #cir.int<3> : !s32i
68+ // CHECK-NEXT: cir.call @_ZN13VariadicStrukC1Eiz(%[[S_ADDR]], %[[ONE]], %[[TWO]], %[[THREE]])
69+ // CHECK-NEXT: cir.return
0 commit comments