3 // RUN: split-file %s %t
5 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/d.cppm \
6 // RUN: -emit-module-interface -o %t/d.pcm
7 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/c.cppm \
8 // RUN: -emit-module-interface -o %t/c.pcm -fmodule-file=%t/d.pcm
9 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/b.cppm \
10 // RUN: -emit-module-interface -o %t/b.pcm -fmodule-file=%t/d.pcm
11 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.cppm \
12 // RUN: -emit-module-interface -o %t/a.pcm -fmodule-file=%t/d.pcm \
13 // RUN: -fmodule-file=%t/c.pcm -fmodule-file=%t/b.pcm
14 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.pcm \
15 // RUN: -S -emit-llvm -disable-llvm-passes -o - | FileCheck %t/a.cppm
17 // Use -fmodule-file=<module-name>=<BMI-path>
18 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/d.cppm \
19 // RUN: -emit-module-interface -o %t/d.pcm
20 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/c.cppm \
21 // RUN: -emit-module-interface -o %t/c.pcm -fmodule-file=%t/d.pcm
22 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/b.cppm \
23 // RUN: -emit-module-interface -o %t/b.pcm -fmodule-file=%t/d.pcm
24 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.cppm \
25 // RUN: -emit-module-interface -o %t/a.pcm -fmodule-file=%t/d.pcm \
26 // RUN: -fmodule-file=%t/c.pcm -fmodule-file=%t/b.pcm
27 // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.pcm \
28 // RUN: -S -emit-llvm -disable-llvm-passes -o - | FileCheck %t/a.cppm
33 export template<typename>
37 static constexpr auto value() {
41 friend constexpr void f(integer const x) {
46 export constexpr void ddd(auto const value) {
52 constexpr auto dd = T();
54 export template<typename T>
69 integer<int>().value();
89 d<integer<unsigned>>();
93 export extern "C" void a() {
97 // Checks that we emit the IR successfully.
98 // CHECK: define{{.*}}@a(