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