xref: /llvm-project/clang/test/CXX/module/basic/basic.link/p2.cppm (revision fb2c9d940ad87e6ae09e06c6915e0c925a4f87ec)
1d54888a3SChuanqi Xu// RUN: rm -rf %t
2d54888a3SChuanqi Xu// RUN: mkdir %t
3d54888a3SChuanqi Xu// RUN: split-file %s %t
4d54888a3SChuanqi Xu
5d54888a3SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/M.cppm -verify
6d54888a3SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/M.cppm -emit-module-interface -o %t/M.pcm
757833636SChuanqi Xu// RUN: %clang_cc1 -std=c++20 -fmodule-file=M=%t/M.pcm %t/M.cpp -verify
8d54888a3SChuanqi Xu//
957833636SChuanqi Xu// RUN: %clang_cc1 -std=c++20 -fmodule-file=M=%t/M.pcm %t/user.cpp -verify
10d54888a3SChuanqi Xu
11d54888a3SChuanqi Xu//--- M.cppm
12d54888a3SChuanqi Xu// expected-no-diagnostics
13d54888a3SChuanqi Xuexport module M;
14d54888a3SChuanqi Xu
15d54888a3SChuanqi Xuexport int external_linkage_var;
16d54888a3SChuanqi Xuint module_linkage_var;
17d54888a3SChuanqi Xustatic int internal_linkage_var;
18d54888a3SChuanqi Xu
19d54888a3SChuanqi Xuexport void external_linkage_fn() {}
20d54888a3SChuanqi Xuvoid module_linkage_fn() {}
21d54888a3SChuanqi Xustatic void internal_linkage_fn() {}
22d54888a3SChuanqi Xu
23d54888a3SChuanqi Xuexport struct external_linkage_class {};
24d54888a3SChuanqi Xustruct module_linkage_class {};
25d54888a3SChuanqi Xunamespace {
26d54888a3SChuanqi Xustruct internal_linkage_class {};
27d54888a3SChuanqi Xu} // namespace
28d54888a3SChuanqi Xu
29d54888a3SChuanqi Xuvoid use() {
30d54888a3SChuanqi Xu  external_linkage_fn();
31d54888a3SChuanqi Xu  module_linkage_fn();
32d54888a3SChuanqi Xu  internal_linkage_fn();
33d54888a3SChuanqi Xu  (void)external_linkage_class{};
34d54888a3SChuanqi Xu  (void)module_linkage_class{};
35d54888a3SChuanqi Xu  (void)internal_linkage_class{};
36d54888a3SChuanqi Xu  (void)external_linkage_var;
37d54888a3SChuanqi Xu  (void)module_linkage_var;
38d54888a3SChuanqi Xu  (void)internal_linkage_var;
39d54888a3SChuanqi Xu}
40d54888a3SChuanqi Xu
41d54888a3SChuanqi Xu//--- M.cpp
426e4f870aSIain Sandoe
43d54888a3SChuanqi Xumodule M;
44d54888a3SChuanqi Xu
45d54888a3SChuanqi Xuvoid use_from_module_impl() {
46d54888a3SChuanqi Xu  external_linkage_fn();
47d54888a3SChuanqi Xu  module_linkage_fn();
48*fb2c9d94SChuanqi Xu  internal_linkage_fn(); // expected-error {{use of undeclared identifier 'internal_linkage_fn'}} // expected-note@* {{}}
49d54888a3SChuanqi Xu  (void)external_linkage_class{};
50d54888a3SChuanqi Xu  (void)module_linkage_class{};
51d54888a3SChuanqi Xu  (void)external_linkage_var;
52d54888a3SChuanqi Xu  (void)module_linkage_var;
536e4f870aSIain Sandoe
54*fb2c9d94SChuanqi Xu  (void)internal_linkage_class{}; // expected-error {{use of undeclared identifier 'internal_linkage_class'}} //expected-error{{}}
55*fb2c9d94SChuanqi Xu  (void)internal_linkage_var; // expected-error {{use of undeclared identifier 'internal_linkage_var'}}
56d54888a3SChuanqi Xu}
57d54888a3SChuanqi Xu
58d54888a3SChuanqi Xu//--- user.cpp
59d54888a3SChuanqi Xuimport M;
60d54888a3SChuanqi Xu
61d54888a3SChuanqi Xuvoid use_from_module_impl() {
62d54888a3SChuanqi Xu  external_linkage_fn();
63c5e4afe6SChuanqi Xu  module_linkage_fn();   // expected-error {{use of undeclared identifier 'module_linkage_fn'}}
64*fb2c9d94SChuanqi Xu  internal_linkage_fn(); // expected-error {{use of undeclared identifier 'internal_linkage_fn'}}
65d54888a3SChuanqi Xu  (void)external_linkage_class{};
66*fb2c9d94SChuanqi Xu  (void)module_linkage_class{}; // expected-error {{undeclared identifier}} expected-error 0+{{}} // expected-note@* {{}}
67d54888a3SChuanqi Xu  (void)internal_linkage_class{}; // expected-error {{undeclared identifier}} expected-error 0+{{}}
68d54888a3SChuanqi Xu  (void)external_linkage_var;
69d54888a3SChuanqi Xu  (void)module_linkage_var; // expected-error {{undeclared identifier}}
70d54888a3SChuanqi Xu  (void)internal_linkage_var; // expected-error {{undeclared identifier}}
71d54888a3SChuanqi Xu}
72