llvm-project/clang/test/CIR/CodeGen/deferred-fn-defs.cpp
Andy Kaylor af54790ca0
[CIR] Defer emitting function definitions (#142862)
This change implements deferring function definition emission until
first use.
2025-06-05 13:08:29 -07:00

39 lines
1.1 KiB
C++

// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
// RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR --implicit-check-not=externNotCalled \
// RUN: --implicit-check-not=internalNotCalled --implicit-check-not=inlineNotCalled
extern int externCalled();
extern int externNotCalled();
namespace {
int internalCalled() { return 1; }
int internalNotCalled() { return 2; }
}
struct S {
int inlineCalled() { return 3; }
int inlineNotCalled() { return 4; }
};
void use() {
S s;
externCalled();
internalCalled();
s.inlineCalled();
}
// CIR: cir.func{{.*}} @_Z12externCalledv
// This shouldn't have a body.
// CIR-NOT: cir.return
// CIR: cir.func{{.*}} @_ZN12_GLOBAL__N_114internalCalledEv
// CIR: %[[ONE:.*]] = cir.const #cir.int<1>
// CIR: cir.store %[[ONE]], %[[RET_ADDR:.*]]
// CIR: cir.func{{.*}} @_ZN1S12inlineCalledEv
// CIR: %[[THIS:.*]] = cir.alloca !cir.ptr<!rec_S>, !cir.ptr<!cir.ptr<!rec_S>>, ["this", init]
// CIR: %[[THREE:.*]] = cir.const #cir.int<3>
// CIR: cir.store %[[THREE]], %[[RET_ADDR:.*]]
// CIR: cir.func{{.*}} @_Z3usev()