| // Address: https://github.com/llvm/llvm-project/issues/60693 | |
| // | |
| // RUN: rm -rf %t | |
| // RUN: mkdir -p %t | |
| // RUN: split-file %s %t | |
| // | |
| // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.cppm -emit-module-interface -o %t/a.pcm | |
| // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -fmodule-file=a=%t/a.pcm %t/c.cpp -emit-llvm -disable-llvm-passes -o - | FileCheck %t/c.cpp | |
| // Test again with reduced BMI | |
| // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm | |
| // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -fmodule-file=a=%t/a.pcm %t/c.cpp -emit-llvm -disable-llvm-passes -o - | FileCheck %t/c.cpp | |
| //--- a.cppm | |
| export module a; | |
| constexpr bool f() { | |
| for (unsigned n = 0; n != 10; ++n) { | |
| } | |
| return true; | |
| } | |
| template <typename T> | |
| struct u { | |
| T unit() { | |
| return T(); | |
| } | |
| }; | |
| export template<typename T> | |
| struct s { | |
| static constexpr auto a = f(); | |
| static constexpr auto b = f(); | |
| static constexpr auto c = f(); | |
| static constexpr auto d = f(); | |
| int foo() { | |
| return 43; | |
| } | |
| int bar() { | |
| return 44; | |
| } | |
| T zoo() { | |
| return u<T>().unit(); | |
| } | |
| }; | |
| template struct s<int>; | |
| template struct s<long>; | |
| //--- c.cpp | |
| import a; | |
| extern "C" int use() { | |
| s<int> _; | |
| return _.a + _.b + _.c + _.d; | |
| } | |
| extern "C" long use2() { | |
| s<long> _; | |
| return _.foo(); | |
| } | |
| extern "C" long use3() { | |
| s<long> _; | |
| return _.zoo(); | |
| } | |
| // CHECK: define{{.*}}@use( | |
| // CHECK-NOT: } | |
| // CHECK: ret{{.*}} 4 | |
| // CHECK: declare{{.*}}@_ZNW1a1sIlE3fooEv | |
| // CHECK-NOT: _ZNW1a1sIlE3barEv | |
| // CHECK: declare{{.*}}_ZNW1a1sIlE3zooEv |