// 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<typename U> struct X { template<typename T> void f(); }; #pragma clang module end #pragma clang module begin M.B template<typename T, typename U = void> struct ST { static void f(); }; #pragma clang module end #pragma clang module begin M.C template<typename U> struct X; void foo(X<int>); #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<typename U> struct X { template<typename T> void f(); template<typename T> void g(); }; template<typename U> template<typename T> void X<U>::f() { ST<T>::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<int>().f<int>(); ST<int>::f(); // expected-error {{must be imported from module 'M.B'}} foo(X<int>()); // expected-error {{must be imported from module 'M.C'}} // expected-note@* 2{{previous declaration is here}} } |