blob: 830e80034bfe76145a596c8e681f6c2af745fd58 [file]
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll
// RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll
// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s
struct S {
int x;
S();
S(const S &);
S &operator=(const S &);
};
S make_s();
S agg_invoker() {
auto *fn = +[](int i) -> S { return make_s(); };
return fn(3);
}
// CIR-LABEL: cir.func no_inline internal private dso_local @_ZZ11agg_invokervEN3$_08__invokeEi
// CIR-SAME: (%[[I_ARG:.*]]: !s32i {{.*}}) -> !rec_S
// CIR: %[[I_ALLOCA:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init]
// CIR: %[[RETVAL:.*]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, ["__retval"]
// CIR: %[[UNUSED:.*]] = cir.alloca !rec_anon{{[^,]*}}, {{.*}} ["unused.capture"]
// CIR-NOT: cir.alloca {{.*}} ["agg.tmp
// CIR: cir.store %[[I_ARG]], %[[I_ALLOCA]]
// CIR: %[[I:.*]] = cir.load{{.*}} %[[I_ALLOCA]]
// CIR: %[[CALL:.*]] = cir.call @_ZZ11agg_invokervENK3$_0clEi(%[[UNUSED]], %[[I]]){{.*}} -> !rec_S
// CIR-NOT: cir.copy
// CIR: cir.store{{.*}} %[[CALL]], %[[RETVAL]]
// CIR: %[[RET:.*]] = cir.load %[[RETVAL]]
// CIR: cir.return %[[RET]]
// LLVM-LABEL: define internal %struct.S @"_ZZ11agg_invokervEN3$_08__invokeEi"
// LLVM-SAME: (i32 {{[^,)]*}} %[[I_ARG:[^,)]+]])
// LLVM: %[[I_ALLOCA:.*]] = alloca i32
// LLVM: %[[RETVAL:.*]] = alloca %struct.S
// LLVM: %[[UNUSED:.*]] = alloca %class.anon
// LLVM: store i32 %[[I_ARG]], ptr %[[I_ALLOCA]]
// LLVM: %[[I:.*]] = load i32, ptr %[[I_ALLOCA]]
// LLVM: %[[CALL:.*]] = call %struct.S @"_ZZ11agg_invokervENK3$_0clEi"(ptr {{.*}} %[[UNUSED]], i32 {{.*}} %[[I]])
// LLVM: store %struct.S %[[CALL]], ptr %[[RETVAL]]
// LLVM: %[[RET:.*]] = load %struct.S, ptr %[[RETVAL]]
// LLVM: ret %struct.S %[[RET]]
// OGCG-LABEL: define internal void @"_ZZ11agg_invokervEN3$_08__invokeEi"
// OGCG-SAME: (ptr {{.*}} sret(%struct.S) {{[^,]*}} %[[AGG_RESULT:[^,]+]], i32 {{[^,)]*}} %[[I_ARG:[^,)]+]])
// OGCG: call void @"_ZZ11agg_invokervENK3$_0clEi"(ptr {{.*}} sret(%struct.S) {{[^,]*}} %[[AGG_RESULT]], ptr {{.*}} %[[UNUSED:.*]], i32 {{.*}})
// OGCG: ret void