| // RUN: %clang_cc1 -fmodules -verify -fno-modules-error-recovery -fno-spell-checking %s |
| // RUN: %clang_cc1 -fmodules -verify -fno-modules-error-recovery -DONLY_Y %s |
| |
| #pragma clang module build a |
| module a { |
| explicit module x {} |
| explicit module y {} |
| } |
| #pragma clang module contents |
| #pragma clang module begin a.x |
| namespace N { |
| template<typename T> extern int f(T) { return 0; } |
| } |
| #pragma clang module end |
| |
| #pragma clang module begin a.y |
| #pragma clang module import a.x |
| using N::f; |
| #pragma clang module end |
| #pragma clang module endbuild |
| |
| namespace N { struct A {}; } |
| struct B {}; |
| |
| #ifndef ONLY_Y |
| #pragma clang module import a.x |
| void test1() { |
| f(N::A()); |
| f(B()); // expected-error {{use of undeclared identifier 'f'}} |
| } |
| #else |
| // expected-no-diagnostics |
| #endif |
| |
| #pragma clang module import a.y |
| void test2() { |
| // These are OK even if a.x is not imported. |
| f(N::A()); |
| f(B()); |
| } |