xref: /llvm-project/clang/test/Modules/no-transitive-source-location-change.cppm (revision ad9f38d0e3a5e7e06c39dbd7da88a921a49aa805)
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