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