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