@@ -219,3 +219,130 @@ void init_union() {
219219// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca {{.*}} ["s", init]
220220// CHECK-NEXT: cir.call @_ZN14UnionInitStrukC1Ev(%[[S_ADDR]])
221221// CHECK-NEXT: cir.return
222+
223+ struct Base {
224+ int a;
225+ Base (int val) : a(val) {}
226+ };
227+
228+ struct Derived : Base {
229+ Derived (int val) : Base(val) {}
230+ };
231+
232+ void test_derived () {
233+ Derived d (1 );
234+ }
235+
236+ // CHECK: cir.func{{.*}} @_ZN4BaseC2Ei(%arg0: !cir.ptr<!rec_Base> {{.*}}, %arg1: !s32i
237+ // 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.return
246+
247+ // CHECK: cir.func{{.*}} @_ZN7DerivedC2Ei(%arg0: !cir.ptr<!rec_Derived> {{.*}}, %arg1: !s32i
248+ // 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.return
257+
258+ // CHECK: cir.func{{.*}} @_ZN7DerivedC1Ei(%arg0: !cir.ptr<!rec_Derived> {{.*}}, %arg1: !s32i
259+ // 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.return
267+
268+ // CHECK: cir.func{{.*}} @_Z12test_derivedv
269+ // CHECK-NEXT: %[[D_ADDR:.*]] = cir.alloca {{.*}} ["d", init]
270+ // CHECK-NEXT: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
271+ // CHECK-NEXT: cir.call @_ZN7DerivedC1Ei(%[[D_ADDR]], %[[ONE]])
272+ // CHECK-NEXT: cir.return
273+
274+ struct Base2 {
275+ int b;
276+ Base2 (int val) : b(val) {}
277+ };
278+
279+ struct Derived2 : Base, Base2 {
280+ int c;
281+ Derived2 (int val1, int val2, int val3) : Base(val1), Base2(val2), c(val3) {}
282+ };
283+
284+ void test_derived2 () {
285+ Derived2 d (1 , 2 , 3 );
286+ }
287+
288+ // CHECK: cir.func{{.*}} @_ZN5Base2C2Ei(%arg0: !cir.ptr<!rec_Base2> {{.*}}, %arg1: !s32i
289+ // 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.return
298+
299+ // CHECK: cir.func{{.*}} @_ZN8Derived2C2Eiii(%arg0: !cir.ptr<!rec_Derived2>
300+ // CHECK-SAME: %arg1: !s32i
301+ // CHECK-SAME: %arg2: !s32i
302+ // CHECK-SAME: %arg3: !s32i
303+ // 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.return
322+
323+ // CHECK: cir.func{{.*}} @_ZN8Derived2C1Eiii(%arg0: !cir.ptr<!rec_Derived2>
324+ // CHECK-SAME: %arg1: !s32i
325+ // CHECK-SAME: %arg2: !s32i
326+ // CHECK-SAME: %arg3: !s32i
327+ // 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.return
341+
342+ // CHECK: cir.func{{.*}} @_Z13test_derived2v
343+ // CHECK-NEXT: %[[D_ADDR:.*]] = cir.alloca {{.*}} ["d", init]
344+ // CHECK-NEXT: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
345+ // CHECK-NEXT: %[[TWO:.*]] = cir.const #cir.int<2> : !s32i
346+ // CHECK-NEXT: %[[THREE:.*]] = cir.const #cir.int<3> : !s32i
347+ // CHECK-NEXT: cir.call @_ZN8Derived2C1Eiii(%[[D_ADDR]], %[[ONE]], %[[TWO]], %[[THREE]])
348+ // CHECK-NEXT: cir.return
0 commit comments