// RUN: rm -rf %t // RUN: split-file %s %t // RUN: cd %t // // RUN: %clang_cc1 -std=c++20 %t/A-B.cppm -I%t -emit-module-interface -o %t/A-B.pcm // RUN: %clang_cc1 -std=c++20 %t/A-C.cppm -I%t -emit-module-interface -o %t/A-C.pcm // RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/A.pcm // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -verify -fsyntax-only // Test again with reduced BMI. // // RUN: %clang_cc1 -std=c++20 %t/A-B.cppm -I%t -emit-reduced-module-interface -o %t/A-B.pcm // RUN: %clang_cc1 -std=c++20 %t/A-C.cppm -I%t -emit-reduced-module-interface -o %t/A-C.pcm // RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-reduced-module-interface -fprebuilt-module-path=%t -o %t/A.pcm // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -verify -fsyntax-only //--- foo.h template class pair {}; template class allocator {}; template class my_traits {}; template > > class unordered_map { public: unordered_map() {} }; template struct my_enable_if {}; template struct my_enable_if { using type = T; }; template using my_enable_if_t = typename my_enable_if::type; template>, class = my_enable_if_t<_InputIterator::value>> unordered_map(_InputIterator, _InputIterator, _Allocator = _Allocator()) -> unordered_map, my_traits<_InputIterator>, _Allocator>; template , class _Allocator = allocator<_CharT> > class basic_string; typedef basic_string, allocator > string; template class basic_string { public: basic_string(); template > basic_string(_InputIterator __first, _InputIterator __last, const _Allocator& __a); void resize(unsigned __n, _CharT __c); }; extern template void basic_string::resize(unsigned, char); //--- A-B.cppm module; #include "foo.h" export module A:B; export using ::string; //--- A-C.cppm module; #include "foo.h" export module A:C; //--- A.cppm export module A; export import :B; export import :C; //--- Use.cpp import A; string s; ::unordered_map mime_map; // expected-error {{missing '#include'; 'unordered_map' must be declared before it is used}} // expected-note@* {{declaration here is not visible}}