1 // RUN: rm -rf %t
2 // RUN: mkdir -p %t
3 // RUN: split-file %s %t
4 // RUN: %clang_cc1 -std=c++20 %t/impl.cppm -emit-module-interface -o %t/M-impl.pcm
5 // RUN: %clang_cc1 -std=c++20 %t/M.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/M.pcm
6 // RUN: %clang_cc1 -std=c++20 %t/Use.cpp -fprebuilt-module-path=%t -verify -fsyntax-only
7 // RUN: %clang_cc1 -std=c++20 %t/UseInPartA.cppm -fprebuilt-module-path=%t -verify -fsyntax-only
8 // RUN: %clang_cc1 -std=c++20 %t/UseInAnotherModule.cppm -fprebuilt-module-path=%t -verify -fsyntax-only
9 // RUN: %clang_cc1 -std=c++20 %t/Private.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/A.pcm
10 // RUN: %clang_cc1 -std=c++20 %t/TryUseFromPrivate.cpp -fprebuilt-module-path=%t -verify -fsyntax-only
11 // RUN: %clang_cc1 -std=c++20 %t/Global.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/C.pcm
12 // RUN: %clang_cc1 -std=c++20 %t/UseGlobal.cpp -fprebuilt-module-path=%t -verify -fsyntax-only
13 
14 //--- impl.cppm
15 module M:impl;
16 class A {};
17 
18 //--- M.cppm
19 export module M;
20 import :impl;
21 export A f();
22 
23 //--- Use.cpp
24 import M;
test()25 void test() {
26   A a; // expected-error {{declaration of 'A' must be imported from module 'M:impl'}}
27        // expected-error@-1 {{definition of 'A' must be imported from module 'M:impl'}} expected-error@-1 {{}}
28        // [email protected]:2 {{declaration here is not visible}}
29        // [email protected]:2 {{definition here is not reachable}} [email protected]:2 {{}}
30 }
31 
32 //--- UseInPartA.cppm
33 // expected-no-diagnostics
34 export module M:partA;
35 import :impl;
test()36 void test() {
37   A a;
38 }
39 
40 //--- UseInAnotherModule.cppm
41 export module B;
42 import M;
test()43 void test() {
44   A a; // expected-error {{declaration of 'A' must be imported from module 'M:impl'}}
45        // expected-error@-1 {{definition of 'A' must be imported from module 'M:impl'}} expected-error@-1 {{}}
46        // [email protected]:2 {{declaration here is not visible}}
47        // [email protected]:2 {{definition here is not reachable}} [email protected]:2 {{}}
48 }
49 
50 //--- Private.cppm
51 export module A;
52 module :private;
53 
54 class A {};
55 void test() {
56   A a;
57 }
58 
59 //--- TryUseFromPrivate.cpp
60 
61 import A;
62 void test() {
63   A a; // expected-error {{unknown type name 'A'}}
64 }
65 
66 //--- Global.cppm
67 module;
68 class A{};
69 export module C;
70 void test() {
71   A a;
72 }
73 
74 //--- UseGlobal.cpp
75 import C;
76 void test() {
77   A a; // expected-error {{'A' must be declared before it is used}}
78        // [email protected]:2 {{declaration here is not visible}}
79 }
80