| // 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; | |
| } | |