blob: 546c94b64b8eff9dc75163fec6d4e4ba8a55f980 [file] [edit]
// Tests for -fkeep-inline-functions behaviour with C++20 named modules.
//
// Exported inline definitions are owned by the module interface unit and are
// retained there. Imported inline definitions are only affected if their
// definition is available in the current TU. If no use requires deserializing
// the definition, the function is not visible to this option.
//
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: split-file %s %t
// Compile the module interface unit to verify that the exported inline
// definition is owned by this TU and retained.
// RUN: %clang_cc1 -std=c++20 -fkeep-inline-functions -O2 -triple powerpc64-ibm-aix-xcoff \
// RUN: %t/Hello.cppm -emit-llvm -o - \
// RUN: | FileCheck %s --check-prefix=CHECK-MODULE
// Build the PCM for the import tests below.
// RUN: %clang_cc1 -std=c++20 -fkeep-inline-functions -triple powerpc64-ibm-aix-xcoff -emit-module-interface \
// RUN: %t/Hello.cppm -o %t/Hello.pcm
// Compile a TU that imports but does not call hello().
// The definition is not deserialized, so it is not retained.
// RUN: %clang_cc1 -std=c++20 -fkeep-inline-functions -O2 -triple powerpc64-ibm-aix-xcoff \
// RUN: -fmodule-file=Hello=%t/Hello.pcm %t/no-use.cpp -emit-llvm -o - \
// RUN: | FileCheck %s --check-prefix=CHECK-NO-USE
// Compile a TU that imports and calls hello().
// Calling hello() deserializes its definition, allowing
// -fkeep-inline-functions to retain it.
// RUN: %clang_cc1 -std=c++20 -fkeep-inline-functions -O2 -triple powerpc64-ibm-aix-xcoff \
// RUN: -fmodule-file=Hello=%t/Hello.pcm %t/use.cpp -emit-llvm -o - \
// RUN: | FileCheck %s --check-prefix=CHECK-USE
//--- Hello.cppm
export module Hello;
// CHECK-MODULE: @llvm{{(\.compiler)?}}.used = {{.*}}hello
// CHECK-MODULE: define {{.*}}@_ZW5Hello5hellov
export inline int hello() { return 55; }
//--- use.cpp
import Hello;
// CHECK-USE: @llvm{{(\.compiler)?}}.used = {{.*}}hello
// CHECK-USE: define {{.*}}@_ZW5Hello5hellov
int main() {
return hello();
}
//--- no-use.cpp
import Hello;
// CHECK-NO-USE-NOT: @llvm{{(\.compiler)?}}.used = {{.*}}hello
// CHECK-NO-USE-NOT: define {{.*}}@_ZW5Hello5hellov
int main() {
return 0;
}