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