[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / Modules / function-transitive-change.cppm
blobcfce669e3a7bc2e1d60de3a42f78e5c03e2393de
1 // Test that, in C++20 modules reduced BMI, the implementation detail changes
2 // in non-inline function may not propagate while the inline function changes
3 // can get propagate.
4 //
5 // RUN: rm -rf %t
6 // RUN: split-file %s %t
7 // RUN: cd %t
8 //
9 // RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm
10 // RUN: %clang_cc1 -std=c++20 %t/a.v1.cppm -emit-reduced-module-interface -o %t/a.v1.pcm
12 // The BMI of A should differ since the different implementation.
13 // RUN: not diff %t/a.pcm %t/a.v1.pcm &> /dev/null
15 // The BMI of B should change since the dependent inline function changes
16 // RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-reduced-module-interface -fmodule-file=a=%t/a.pcm \
17 // RUN:     -o %t/b.pcm
18 // RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-reduced-module-interface -fmodule-file=a=%t/a.v1.pcm \
19 // RUN:     -o %t/b.v1.pcm
20 // RUN: not diff %t/b.v1.pcm %t/b.pcm  &> /dev/null
22 // Test the case with unused partitions.
23 // RUN: %clang_cc1 -std=c++20 %t/M-A.cppm -emit-reduced-module-interface -o %t/M-A.pcm
24 // RUN: %clang_cc1 -std=c++20 %t/M-B.cppm -emit-reduced-module-interface -o %t/M-B.pcm
25 // RUN: %clang_cc1 -std=c++20 %t/M.cppm -emit-reduced-module-interface -o %t/M.pcm \
26 // RUN:     -fmodule-file=M:partA=%t/M-A.pcm \
27 // RUN:     -fmodule-file=M:partB=%t/M-B.pcm
28 // RUN: %clang_cc1 -std=c++20 %t/N.cppm -emit-reduced-module-interface -o %t/N.pcm \
29 // RUN:     -fmodule-file=M:partA=%t/M-A.pcm \
30 // RUN:     -fmodule-file=M:partB=%t/M-B.pcm \
31 // RUN:     -fmodule-file=M=%t/M.pcm
33 // Now we change `M-A.cppm` to `M-A.v1.cppm`.
34 // RUN: %clang_cc1 -std=c++20 %t/M-A.v1.cppm -emit-reduced-module-interface -o %t/M-A.v1.pcm
35 // RUN: %clang_cc1 -std=c++20 %t/M.cppm -emit-reduced-module-interface -o %t/M.v1.pcm \
36 // RUN:     -fmodule-file=M:partA=%t/M-A.v1.pcm \
37 // RUN:     -fmodule-file=M:partB=%t/M-B.pcm
38 // RUN: %clang_cc1 -std=c++20 %t/N.cppm -emit-reduced-module-interface -o %t/N.v1.pcm \
39 // RUN:     -fmodule-file=M:partA=%t/M-A.v1.pcm \
40 // RUN:     -fmodule-file=M:partB=%t/M-B.pcm \
41 // RUN:     -fmodule-file=M=%t/M.v1.pcm
43 // The BMI of N can keep unchanged since the N didn't use the changed partition unit 'M:A'.
44 // RUN: diff %t/N.v1.pcm %t/N.pcm  &> /dev/null
46 //--- a.cppm
47 export module a;
48 export inline int a() {
49     return 48;
52 //--- a.v1.cppm
53 export module a;
54 export inline int a() {
55     return 50;
58 //--- b.cppm
59 export module b;
60 import a;
61 export inline int b() {
62     return a();
65 //--- M-A.cppm
66 export module M:partA;
67 export inline int a() {
68     return 43;
71 //--- M-A.v1.cppm
72 export module M:partA;
73 export inline int a() {
74     return 50;
77 //--- M-B.cppm
78 export module M:partB;
79 export inline int b() {
80     return 44;
83 //--- M.cppm
84 export module M;
85 export import :partA;
86 export import :partB;
88 //--- N.cppm
89 export module N;
90 import M;
92 export inline int n() {
93     return b();