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