349 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir2// RUN: FileCheck --input-file=%t.cir %s3 4struct Struk {5 int a;6 Struk() {}7};8 9void baz() {10 Struk s;11}12 13// CHECK: !rec_Struk = !cir.record<struct "Struk" {!s32i}>14 15// Note: In the absence of the '-mconstructor-aliases' option, we emit two16// constructors here. The handling of constructor aliases is currently17// NYI, but when it is added this test should be updated to add a RUN18// line that passes '-mconstructor-aliases' to clang_cc1.19// CHECK: cir.func{{.*}} @_ZN5StrukC2Ev(%arg0: !cir.ptr<!rec_Struk>20// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca !cir.ptr<!rec_Struk>, !cir.ptr<!cir.ptr<!rec_Struk>>, ["this", init] {alignment = 8 : i64}21// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]] : !cir.ptr<!rec_Struk>, !cir.ptr<!cir.ptr<!rec_Struk>>22// CHECK-NEXT: %[[THIS:.*]] = cir.load %[[THIS_ADDR]] : !cir.ptr<!cir.ptr<!rec_Struk>>, !cir.ptr<!rec_Struk>23// CHECK-NEXT: cir.return24 25// CHECK: cir.func{{.*}} @_ZN5StrukC1Ev(%arg0: !cir.ptr<!rec_Struk>26// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca !cir.ptr<!rec_Struk>, !cir.ptr<!cir.ptr<!rec_Struk>>, ["this", init] {alignment = 8 : i64}27// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]] : !cir.ptr<!rec_Struk>, !cir.ptr<!cir.ptr<!rec_Struk>>28// CHECK-NEXT: %[[THIS:.*]] = cir.load %[[THIS_ADDR]] : !cir.ptr<!cir.ptr<!rec_Struk>>, !cir.ptr<!rec_Struk>29// CHECK-NEXT: cir.call @_ZN5StrukC2Ev(%[[THIS]]) : (!cir.ptr<!rec_Struk>) -> ()30// CHECK-NEXT: cir.return31 32// CHECK: cir.func{{.*}} @_Z3bazv()33// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca !rec_Struk, !cir.ptr<!rec_Struk>, ["s", init] {alignment = 4 : i64}34// CHECK-NEXT: cir.call @_ZN5StrukC1Ev(%[[S_ADDR]]) : (!cir.ptr<!rec_Struk>) -> ()35// CHECK-NEXT: cir.return36 37struct VariadicStruk {38 int a;39 VariadicStruk(int n, ...) { a = n;}40};41 42void 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{{.*}} @_ZN13VariadicStrukC2Eiz49 50// CHECK: cir.func{{.*}} @_ZN13VariadicStrukC1Eiz(%arg0: !cir.ptr<!rec_VariadicStruk>51// CHECK-SAME: %arg1: !s32i52// 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.return62 63// CHECK: cir.func{{.*}} @_Z3barv64// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca !rec_VariadicStruk, !cir.ptr<!rec_VariadicStruk>, ["s", init]65// CHECK-NEXT: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i66// CHECK-NEXT: %[[TWO:.*]] = cir.const #cir.int<2> : !s32i67// CHECK-NEXT: %[[THREE:.*]] = cir.const #cir.int<3> : !s32i68// CHECK-NEXT: cir.call @_ZN13VariadicStrukC1Eiz(%[[S_ADDR]], %[[ONE]], %[[TWO]], %[[THREE]])69// CHECK-NEXT: cir.return70 71struct DelegatingStruk {72 int a;73 DelegatingStruk(int n) { a = n; }74 DelegatingStruk() : DelegatingStruk(0) {}75};76 77void bam() {78 DelegatingStruk s;79}80 81// CHECK: cir.func{{.*}} @_ZN15DelegatingStrukC2Ei(%arg0: !cir.ptr<!rec_DelegatingStruk>82// CHECK-SAME: %arg1: !s32i83// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]84// CHECK-NEXT: %[[N_ADDR:.*]] = cir.alloca {{.*}} ["n", init]85// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]86// CHECK-NEXT: cir.store %arg1, %[[N_ADDR]]87// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]88// CHECK-NEXT: %[[N:.*]] = cir.load{{.*}} %[[N_ADDR]]89// CHECK-NEXT: %[[A_ADDR:.*]] = cir.get_member %[[THIS]][0] {name = "a"}90// CHECK-NEXT: cir.store{{.*}} %[[N]], %[[A_ADDR]]91// CHECK-NEXT: cir.return92 93// CHECK: cir.func{{.*}} @_ZN15DelegatingStrukC1Ei(%arg0: !cir.ptr<!rec_DelegatingStruk>94// CHECK-SAME: %arg1: !s32i95// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]96// CHECK-NEXT: %[[N_ADDR:.*]] = cir.alloca {{.*}} ["n", init]97// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]98// CHECK-NEXT: cir.store %arg1, %[[N_ADDR]]99// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]100// CHECK-NEXT: %[[N:.*]] = cir.load{{.*}} %[[N_ADDR]]101// CHECK-NEXT: cir.call @_ZN15DelegatingStrukC2Ei(%[[THIS]], %[[N]])102// CHECK-NEXT: cir.return103 104// CHECK: cir.func{{.*}} @_ZN15DelegatingStrukC1Ev(%arg0: !cir.ptr<!rec_DelegatingStruk>105// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]106// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]107// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]108// CHECK-NEXT: %[[ZERO:.*]] = cir.const #cir.int<0> : !s32i109// CHECK-NEXT: cir.call @_ZN15DelegatingStrukC1Ei(%[[THIS]], %[[ZERO]])110// CHECK-NEXT: cir.return111 112// CHECK: cir.func{{.*}} @_Z3bamv113// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca {{.*}} ["s", init]114// CHECK-NEXT: cir.call @_ZN15DelegatingStrukC1Ev(%[[S_ADDR]])115// CHECK-NEXT: cir.return116 117struct MemberInitStruk {118 int a;119 MemberInitStruk() : a(0) {}120};121 122void init_member() {123 MemberInitStruk s;124}125 126// CHECK: cir.func{{.*}} @_ZN15MemberInitStrukC2Ev(%arg0: !cir.ptr<!rec_MemberInitStruk>127// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]128// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]129// CHECK-NEXT: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]130// CHECK-NEXT: %[[A_ADDR:.*]] = cir.get_member %[[THIS]][0] {name = "a"}131// CHECK-NEXT: %[[ZERO:.*]] = cir.const #cir.int<0> : !s32i132// CHECK-NEXT: cir.store align(4) %[[ZERO]], %[[A_ADDR]]133// CHECK-NEXT: cir.return134 135// CHECK: cir.func{{.*}} @_ZN15MemberInitStrukC1Ev(%arg0: !cir.ptr<!rec_MemberInitStruk>136// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]137// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]138// CHECK-NEXT: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]139// CHECK-NEXT: cir.call @_ZN15MemberInitStrukC2Ev(%[[THIS]])140// CHECK-NEXT: cir.return141 142// CHECK: cir.func{{.*}} @_Z11init_memberv143// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca {{.*}} ["s", init]144// CHECK-NEXT: cir.call @_ZN15MemberInitStrukC1Ev(%[[S_ADDR]])145// CHECK-NEXT: cir.return146 147struct ParamMemberInitStruk {148 int a;149 ParamMemberInitStruk(int n) : a(n) {}150};151 152void init_param_member() {153 ParamMemberInitStruk s(0);154}155 156// CHECK: cir.func{{.*}} @_ZN20ParamMemberInitStrukC2Ei(%arg0: !cir.ptr<!rec_ParamMemberInitStruk>157// CHECK-SAME: %arg1: !s32i158// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]159// CHECK-NEXT: %[[N_ADDR:.*]] = cir.alloca {{.*}} ["n", init]160// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]161// CHECK-NEXT: cir.store %arg1, %[[N_ADDR]]162// CHECK-NEXT: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]163// CHECK-NEXT: %[[A_ADDR:.*]] = cir.get_member %[[THIS]][0] {name = "a"}164// CHECK-NEXT: %[[N:.*]] = cir.load{{.*}} %[[N_ADDR]]165// CHECK-NEXT: cir.store{{.*}} %[[N]], %[[A_ADDR]]166// CHECK-NEXT: cir.return167 168// CHECK: cir.func{{.*}} @_ZN20ParamMemberInitStrukC1Ei(%arg0: !cir.ptr<!rec_ParamMemberInitStruk>169// CHECK-SAME: %arg1: !s32i170// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]171// CHECK-NEXT: %[[N_ADDR:.*]] = cir.alloca {{.*}} ["n", init]172// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]173// CHECK-NEXT: cir.store %arg1, %[[N_ADDR]]174// CHECK-NEXT: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]175// CHECK-NEXT: %[[N:.*]] = cir.load{{.*}} %[[N_ADDR]]176// CHECK-NEXT: cir.call @_ZN20ParamMemberInitStrukC2Ei(%[[THIS]], %[[N]])177// CHECK-NEXT: cir.return178 179// CHECK: cir.func{{.*}} @_Z17init_param_memberv180// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca {{.*}} ["s", init]181// CHECK-NEXT: %[[ZERO:.*]] = cir.const #cir.int<0>182// CHECK-NEXT: cir.call @_ZN20ParamMemberInitStrukC1Ei(%[[S_ADDR]], %[[ZERO]])183// CHECK-NEXT: cir.return184 185struct UnionInitStruk {186 union {187 int a;188 union {189 float b;190 double c;191 };192 };193 UnionInitStruk() : c(0.0) {}194};195 196void init_union() {197 UnionInitStruk s;198}199 200// CHECK: cir.func{{.*}} @_ZN14UnionInitStrukC2Ev(%arg0: !cir.ptr<!rec_UnionInitStruk>201// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]202// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]203// CHECK-NEXT: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]204// CHECK-NEXT: %[[AU1_ADDR:.*]] = cir.get_member %[[THIS]][0] {name = ""}205// CHECK-NEXT: %[[AU2_ADDR:.*]] = cir.get_member %[[AU1_ADDR]][1] {name = ""}206// CHECK-NEXT: %[[C_ADDR:.*]] = cir.get_member %[[AU2_ADDR]][1] {name = "c"}207// CHECK-NEXT: %[[ZERO:.*]] = cir.const #cir.fp<0.000000e+00>208// CHECK-NEXT: cir.store{{.*}} %[[ZERO]], %[[C_ADDR]]209// CHECK-NEXT: cir.return210 211// CHECK: cir.func{{.*}} @_ZN14UnionInitStrukC1Ev(%arg0: !cir.ptr<!rec_UnionInitStruk>212// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]213// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]214// CHECK-NEXT: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]215// CHECK-NEXT: cir.call @_ZN14UnionInitStrukC2Ev216// CHECK-NEXT: cir.return217 218// CHECK: cir.func{{.*}} @_Z10init_unionv219// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca {{.*}} ["s", init]220// CHECK-NEXT: cir.call @_ZN14UnionInitStrukC1Ev(%[[S_ADDR]])221// CHECK-NEXT: cir.return222 223struct Base {224 int a;225 Base(int val) : a(val) {}226};227 228struct Derived : Base {229 Derived(int val) : Base(val) {}230};231 232void test_derived() {233 Derived d(1);234}235 236// CHECK: cir.func{{.*}} @_ZN4BaseC2Ei(%arg0: !cir.ptr<!rec_Base> {{.*}}, %arg1: !s32i237// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]238// CHECK-NEXT: %[[VAL_ADDR:.*]] = cir.alloca {{.*}} ["val", init]239// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]240// CHECK-NEXT: cir.store %arg1, %[[VAL_ADDR]]241// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]242// CHECK-NEXT: %[[A_ADDR:.*]] = cir.get_member %[[THIS]][0] {name = "a"}243// CHECK-NEXT: %[[VAL:.*]] = cir.load{{.*}} %[[VAL_ADDR]]244// CHECK-NEXT: cir.store{{.*}} %[[VAL]], %[[A_ADDR]]245// CHECK-NEXT: cir.return246 247// CHECK: cir.func{{.*}} @_ZN7DerivedC2Ei(%arg0: !cir.ptr<!rec_Derived> {{.*}}, %arg1: !s32i248// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]249// CHECK-NEXT: %[[VAL_ADDR:.*]] = cir.alloca {{.*}} ["val", init]250// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]251// CHECK-NEXT: cir.store %arg1, %[[VAL_ADDR]]252// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]253// CHECK-NEXT: %[[BASE:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_Derived> nonnull [0] -> !cir.ptr<!rec_Base>254// CHECK-NEXT: %[[VAL:.*]] = cir.load{{.*}} %[[VAL_ADDR]]255// CHECK-NEXT: cir.call @_ZN4BaseC2Ei(%[[BASE]], %[[VAL]])256// CHECK-NEXT: cir.return257 258// CHECK: cir.func{{.*}} @_ZN7DerivedC1Ei(%arg0: !cir.ptr<!rec_Derived> {{.*}}, %arg1: !s32i259// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]260// CHECK-NEXT: %[[VAL_ADDR:.*]] = cir.alloca {{.*}} ["val", init]261// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]262// CHECK-NEXT: cir.store %arg1, %[[VAL_ADDR]]263// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]264// CHECK-NEXT: %[[VAL:.*]] = cir.load{{.*}} %[[VAL_ADDR]]265// CHECK-NEXT: cir.call @_ZN7DerivedC2Ei(%[[THIS]], %[[VAL]])266// CHECK-NEXT: cir.return267 268// CHECK: cir.func{{.*}} @_Z12test_derivedv269// CHECK-NEXT: %[[D_ADDR:.*]] = cir.alloca {{.*}} ["d", init]270// CHECK-NEXT: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i271// CHECK-NEXT: cir.call @_ZN7DerivedC1Ei(%[[D_ADDR]], %[[ONE]])272// CHECK-NEXT: cir.return273 274struct Base2 {275 int b;276 Base2(int val) : b(val) {}277};278 279struct Derived2 : Base, Base2 {280 int c;281 Derived2(int val1, int val2, int val3) : Base(val1), Base2(val2), c(val3) {}282};283 284void test_derived2() {285 Derived2 d(1, 2, 3);286}287 288// CHECK: cir.func{{.*}} @_ZN5Base2C2Ei(%arg0: !cir.ptr<!rec_Base2> {{.*}}, %arg1: !s32i289// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]290// CHECK-NEXT: %[[VAL_ADDR:.*]] = cir.alloca {{.*}} ["val", init]291// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]292// CHECK-NEXT: cir.store %arg1, %[[VAL_ADDR]]293// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]294// CHECK-NEXT: %[[B_ADDR:.*]] = cir.get_member %[[THIS]][0] {name = "b"}295// CHECK-NEXT: %[[VAL:.*]] = cir.load{{.*}} %[[VAL_ADDR]]296// CHECK-NEXT: cir.store{{.*}} %[[VAL]], %[[B_ADDR]]297// CHECK-NEXT: cir.return298 299// CHECK: cir.func{{.*}} @_ZN8Derived2C2Eiii(%arg0: !cir.ptr<!rec_Derived2>300// CHECK-SAME: %arg1: !s32i301// CHECK-SAME: %arg2: !s32i302// CHECK-SAME: %arg3: !s32i303// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]304// CHECK-NEXT: %[[VAL1_ADDR:.*]] = cir.alloca {{.*}} ["val1", init]305// CHECK-NEXT: %[[VAL2_ADDR:.*]] = cir.alloca {{.*}} ["val2", init]306// CHECK-NEXT: %[[VAL3_ADDR:.*]] = cir.alloca {{.*}} ["val3", init]307// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]308// CHECK-NEXT: cir.store %arg1, %[[VAL1_ADDR]]309// CHECK-NEXT: cir.store %arg2, %[[VAL2_ADDR]]310// CHECK-NEXT: cir.store %arg3, %[[VAL3_ADDR]]311// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]312// CHECK-NEXT: %[[BASE:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_Derived2> nonnull [0] -> !cir.ptr<!rec_Base>313// CHECK-NEXT: %[[VAL1:.*]] = cir.load{{.*}} %[[VAL1_ADDR]]314// CHECK-NEXT: cir.call @_ZN4BaseC2Ei(%[[BASE]], %[[VAL1]])315// CHECK-NEXT: %[[BASE2:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_Derived2> nonnull [4] -> !cir.ptr<!rec_Base2>316// CHECK-NEXT: %[[VAL2:.*]] = cir.load{{.*}} %[[VAL2_ADDR]]317// CHECK-NEXT: cir.call @_ZN5Base2C2Ei(%[[BASE2]], %[[VAL2]])318// CHECK-NEXT: %[[C_ADDR:.*]] = cir.get_member %[[THIS]][2] {name = "c"}319// CHECK-NEXT: %[[VAL3:.*]] = cir.load{{.*}} %[[VAL3_ADDR]]320// CHECK-NEXT: cir.store{{.*}} %[[VAL3]], %[[C_ADDR]]321// CHECK-NEXT: cir.return322 323// CHECK: cir.func{{.*}} @_ZN8Derived2C1Eiii(%arg0: !cir.ptr<!rec_Derived2>324// CHECK-SAME: %arg1: !s32i325// CHECK-SAME: %arg2: !s32i326// CHECK-SAME: %arg3: !s32i327// CHECK-NEXT: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]328// CHECK-NEXT: %[[VAL1_ADDR:.*]] = cir.alloca {{.*}} ["val1", init]329// CHECK-NEXT: %[[VAL2_ADDR:.*]] = cir.alloca {{.*}} ["val2", init]330// CHECK-NEXT: %[[VAL3_ADDR:.*]] = cir.alloca {{.*}} ["val3", init]331// CHECK-NEXT: cir.store %arg0, %[[THIS_ADDR]]332// CHECK-NEXT: cir.store %arg1, %[[VAL1_ADDR]]333// CHECK-NEXT: cir.store %arg2, %[[VAL2_ADDR]]334// CHECK-NEXT: cir.store %arg3, %[[VAL3_ADDR]]335// CHECK-NEXT: %[[THIS:.*]] = cir.load{{.*}} %[[THIS_ADDR]]336// CHECK-NEXT: %[[VAL1:.*]] = cir.load{{.*}} %[[VAL1_ADDR]]337// CHECK-NEXT: %[[VAL2:.*]] = cir.load{{.*}} %[[VAL2_ADDR]]338// CHECK-NEXT: %[[VAL3:.*]] = cir.load{{.*}} %[[VAL3_ADDR]]339// CHECK-NEXT: cir.call @_ZN8Derived2C2Eiii(%[[THIS]], %[[VAL1]], %[[VAL2]], %[[VAL3]])340// CHECK-NEXT: cir.return341 342// CHECK: cir.func{{.*}} @_Z13test_derived2v343// CHECK-NEXT: %[[D_ADDR:.*]] = cir.alloca {{.*}} ["d", init]344// CHECK-NEXT: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i345// CHECK-NEXT: %[[TWO:.*]] = cir.const #cir.int<2> : !s32i346// CHECK-NEXT: %[[THREE:.*]] = cir.const #cir.int<3> : !s32i347// CHECK-NEXT: cir.call @_ZN8Derived2C1Eiii(%[[D_ADDR]], %[[ONE]], %[[TWO]], %[[THREE]])348// CHECK-NEXT: cir.return349