// RUN: %clang_cc1 -std=c++11 -fmodules %s -verify #pragma clang module build M module M { module A {} module B {} module C {} } #pragma clang module contents #pragma clang module begin M.A template struct X { template void f(); }; #pragma clang module end #pragma clang module begin M.B template struct ST { static void f(); }; #pragma clang module end #pragma clang module begin M.C template struct X; void foo(X); #pragma clang module end #pragma clang module endbuild #pragma clang module build N module N {} #pragma clang module contents #pragma clang module begin N #pragma clang module import M.B // not re-exported template struct X { template void f(); template void g(); }; template template void X::f() { ST::f(); // definition and default argument found in M.B foo(*this); // found by ADL in M.C }; #pragma clang module import M.C // not re-exported #pragma clang module end #pragma clang module endbuild #pragma clang module import N void g() { X().f(); ST::f(); // expected-error {{must be imported from module 'M.B'}} foo(X()); // expected-error {{must be imported from module 'M.C'}} // expected-note@* 2{{previous declaration is here}} }