xref: /llvm-project/clang/test/Modules/no-transitive-decls-change.cppm (revision 03921b979d67657bfc9cf8240add2484cc4df6a7)
1// Testing that changing a declaration in an unused module file won't change
2// the BMI of the current module file.
3//
4// RUN: rm -rf %t
5// RUN: split-file %s %t
6//
7// RUN: %clang_cc1 -std=c++20 %t/m-partA.cppm -emit-reduced-module-interface -o %t/m-partA.pcm
8// RUN: %clang_cc1 -std=c++20 %t/m-partA.v1.cppm -emit-reduced-module-interface -o \
9// RUN:     %t/m-partA.v1.pcm
10// RUN: %clang_cc1 -std=c++20 %t/m-partB.cppm -emit-reduced-module-interface -o %t/m-partB.pcm
11// RUN: %clang_cc1 -std=c++20 %t/m.cppm -emit-reduced-module-interface -o %t/m.pcm \
12// RUN:     -fmodule-file=m:partA=%t/m-partA.pcm -fmodule-file=m:partB=%t/m-partB.pcm
13// RUN: %clang_cc1 -std=c++20 %t/m.cppm -emit-reduced-module-interface -o %t/m.v1.pcm \
14// RUN:     -fmodule-file=m:partA=%t/m-partA.v1.pcm -fmodule-file=m:partB=%t/m-partB.pcm
15//
16// RUN: %clang_cc1 -std=c++20 %t/useBOnly.cppm -emit-reduced-module-interface -o %t/useBOnly.pcm \
17// RUN:     -fmodule-file=m=%t/m.pcm -fmodule-file=m:partA=%t/m-partA.pcm \
18// RUN:     -fmodule-file=m:partB=%t/m-partB.pcm
19// RUN: %clang_cc1 -std=c++20 %t/useBOnly.cppm -emit-reduced-module-interface -o %t/useBOnly.v1.pcm \
20// RUN:     -fmodule-file=m=%t/m.v1.pcm -fmodule-file=m:partA=%t/m-partA.v1.pcm \
21// RUN:     -fmodule-file=m:partB=%t/m-partB.pcm
22// Since useBOnly only uses partB from module M, the change in partA shouldn't affect
23// useBOnly.
24// RUN: diff %t/useBOnly.pcm %t/useBOnly.v1.pcm &> /dev/null
25
26//--- m-partA.cppm
27export module m:partA;
28
29namespace A_Impl {
30    inline int getAImpl() {
31        return 43;
32    }
33
34    inline int getA2Impl() {
35        return 43;
36    }
37}
38
39namespace A {
40    using A_Impl::getAImpl;
41}
42
43export inline int getA() {
44    return 43;
45}
46
47//--- m-partA.v1.cppm
48export module m:partA;
49
50namespace A_Impl {
51    inline int getAImpl() {
52        return 43;
53    }
54
55    inline int getA2Impl() {
56        return 43;
57    }
58}
59
60namespace A {
61    using A_Impl::getAImpl;
62    using A_Impl::getA2Impl;
63}
64
65inline int getA() {
66    return 43;
67}
68
69// The consuming module which didn't use m:partA completely is expected to be
70// not changed.
71inline int getB(int) {
72    return 88;
73}
74
75//--- m-partB.cppm
76export module m:partB;
77
78export inline int getB() {
79    return 430;
80}
81
82//--- m.cppm
83export module m;
84export import :partA;
85export import :partB;
86
87//--- useBOnly.cppm
88export module useBOnly;
89import m;
90
91export inline int get() {
92    return getB();
93}
94
95//--- useAOnly.cppm
96export module useAOnly;
97import m;
98
99export inline int get() {
100    A<int> a;
101    return a.getValue();
102}
103