blob: acf7df22d5a9daeb76afa8143eb062b6a67e1215 [file] [log] [blame]
// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -I%S/../Inputs -clangir-disable-emit-cxx-default -fclangir -emit-cir %s -o %t.cir
// RUN: FileCheck --input-file=%t.cir %s
#include "std-cxx.h"
struct S {
S(int, int);
};
void m(int a, int b) {
std::shared_ptr<S> l = std::make_shared<S>(a, b);
}
// CHECK: cir.func linkonce_odr @_ZSt11make_sharedI1SJRiS1_EESt10shared_ptrIT_EDpOT0_(
// CHECK: %0 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["args", init] {alignment = 8 : i64}
// CHECK: %1 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["args", init] {alignment = 8 : i64}
// CHECK: %2 = cir.alloca !ty_std3A3Ashared_ptr3CS3E, !cir.ptr<!ty_std3A3Ashared_ptr3CS3E>, ["__retval"] {alignment = 1 : i64}
// CHECK: cir.store %arg0, %0 : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
// CHECK: cir.store %arg1, %1 : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
// CHECK: cir.scope {
// CHECK: %4 = cir.const #cir.int<1> : !u64i
// CHECK: %5 = cir.call @_Znwm(%4) : (!u64i) -> !cir.ptr<!void>
// CHECK: %6 = cir.cast(bitcast, %5 : !cir.ptr<!void>), !cir.ptr<!ty_S>
// CHECK: %7 = cir.load %0 : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
// CHECK: %8 = cir.load %7 : !cir.ptr<!s32i>, !s32i
// CHECK: %9 = cir.load %1 : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
// CHECK: %10 = cir.load %9 : !cir.ptr<!s32i>, !s32i
// CHECK: cir.call @_ZN1SC1Eii(%6, %8, %10) : (!cir.ptr<!ty_S>, !s32i, !s32i) -> ()
// CHECK: cir.call @_ZNSt10shared_ptrI1SEC1EPS0_(%2, %6) : (!cir.ptr<!ty_std3A3Ashared_ptr3CS3E>, !cir.ptr<!ty_S>) -> ()
// CHECK: }
class B {
public:
void construct(B* __p) {
::new ((void*)__p) B;
}
};
// CHECK: cir.func linkonce_odr @_ZN1B9constructEPS_(%arg0: !cir.ptr<!ty_B>
// CHECK: %0 = cir.alloca !cir.ptr<!ty_B>, !cir.ptr<!cir.ptr<!ty_B>>, ["this", init] {alignment = 8 : i64}
// CHECK: %1 = cir.alloca !cir.ptr<!ty_B>, !cir.ptr<!cir.ptr<!ty_B>>, ["__p", init] {alignment = 8 : i64}
// CHECK: cir.store %arg0, %0 : !cir.ptr<!ty_B>, !cir.ptr<!cir.ptr<!ty_B>>
// CHECK: cir.store %arg1, %1 : !cir.ptr<!ty_B>, !cir.ptr<!cir.ptr<!ty_B>>
// CHECK: %2 = cir.load %0 : !cir.ptr<!cir.ptr<!ty_B>>, !cir.ptr<!ty_B>
// CHECK: %3 = cir.const #cir.int<1> : !u64i
// CHECK: %4 = cir.load %1 : !cir.ptr<!cir.ptr<!ty_B>>, !cir.ptr<!ty_B>
// CHECK: %5 = cir.cast(bitcast, %4 : !cir.ptr<!ty_B>), !cir.ptr<!void>
// CHECK: %6 = cir.cast(bitcast, %5 : !cir.ptr<!void>), !cir.ptr<!ty_B>
// cir.call @B::B()(%new_placament_ptr)
// CHECK: cir.call @_ZN1BC1Ev(%6) : (!cir.ptr<!ty_B>) -> ()
// CHECK: cir.return
// CHECK: }
void t() {
B b;
b.construct(&b);
}