| // 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}} |
| } |