@@ -219,3 +219,130 @@ void init_union() {
219
219
// CHECK-NEXT: %[[S_ADDR:.*]] = cir.alloca {{.*}} ["s", init]
220
220
// CHECK-NEXT: cir.call @_ZN14UnionInitStrukC1Ev(%[[S_ADDR]])
221
221
// 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