1947b0628SChuanqi Xu// Testing that adding a new line in a module interface unit won't cause the BMI 2947b0628SChuanqi Xu// of consuming module unit changes. 3947b0628SChuanqi Xu// 4*ad9f38d0SChuanqi Xu// RUN: rm -rf %t 5*ad9f38d0SChuanqi Xu// RUN: split-file %s %t 6*ad9f38d0SChuanqi Xu// 7947b0628SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-reduced-module-interface -o %t/A.pcm 8947b0628SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/A.v1.cppm -emit-reduced-module-interface -o %t/A.v1.pcm 9947b0628SChuanqi Xu// 10947b0628SChuanqi Xu// The BMI may not be the same since the source location differs. 11947b0628SChuanqi Xu// RUN: not diff %t/A.pcm %t/A.v1.pcm &> /dev/null 12947b0628SChuanqi Xu// 13947b0628SChuanqi Xu// The BMI of B shouldn't change since all the locations remain the same. 14947b0628SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/B.cppm -emit-reduced-module-interface -fmodule-file=A=%t/A.pcm \ 15947b0628SChuanqi Xu// RUN: -o %t/B.pcm 16947b0628SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/B.cppm -emit-reduced-module-interface -fmodule-file=A=%t/A.v1.pcm \ 17947b0628SChuanqi Xu// RUN: -o %t/B.v1.pcm 18947b0628SChuanqi Xu// RUN: diff %t/B.v1.pcm %t/B.pcm &> /dev/null 19947b0628SChuanqi Xu// 20947b0628SChuanqi Xu// The BMI of C may change since the locations for instantiations changes. 21947b0628SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/C.cppm -emit-reduced-module-interface -fmodule-file=A=%t/A.pcm \ 22947b0628SChuanqi Xu// RUN: -o %t/C.pcm 23947b0628SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/C.cppm -emit-reduced-module-interface -fmodule-file=A=%t/A.v1.pcm \ 24947b0628SChuanqi Xu// RUN: -o %t/C.v1.pcm 25947b0628SChuanqi Xu// RUN: not diff %t/C.v1.pcm %t/C.pcm &> /dev/null 26947b0628SChuanqi Xu 27947b0628SChuanqi Xu//--- A.cppm 28947b0628SChuanqi Xuexport module A; 29947b0628SChuanqi Xuexport template <class T> 30947b0628SChuanqi Xustruct C { 31947b0628SChuanqi Xu T func() { 32947b0628SChuanqi Xu return T(43); 33947b0628SChuanqi Xu } 34947b0628SChuanqi Xu}; 35947b0628SChuanqi Xuexport int funcA() { 36947b0628SChuanqi Xu return 43; 37947b0628SChuanqi Xu} 38947b0628SChuanqi Xu 39947b0628SChuanqi Xu//--- A.v1.cppm 40947b0628SChuanqi Xuexport module A; 41947b0628SChuanqi Xu 42947b0628SChuanqi Xuexport template <class T> 43947b0628SChuanqi Xustruct C { 44947b0628SChuanqi Xu T func() { 45947b0628SChuanqi Xu return T(43); 46947b0628SChuanqi Xu } 47947b0628SChuanqi Xu}; 48947b0628SChuanqi Xuexport int funcA() { 49947b0628SChuanqi Xu return 43; 50947b0628SChuanqi Xu} 51947b0628SChuanqi Xu 52947b0628SChuanqi Xu//--- B.cppm 53947b0628SChuanqi Xuexport module B; 54947b0628SChuanqi Xuimport A; 55947b0628SChuanqi Xu 56947b0628SChuanqi Xuexport int funcB() { 57947b0628SChuanqi Xu return funcA(); 58947b0628SChuanqi Xu} 59947b0628SChuanqi Xu 60947b0628SChuanqi Xu//--- C.cppm 61947b0628SChuanqi Xuexport module C; 62947b0628SChuanqi Xuimport A; 63947b0628SChuanqi Xuexport inline void testD() { 64947b0628SChuanqi Xu C<int> c; 65947b0628SChuanqi Xu c.func(); 66947b0628SChuanqi Xu} 67