| // RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -fno-modules-error-recovery -fno-spell-checking -verify %s | |
| #pragma clang module build a | |
| module a { explicit module b {} explicit module c {} } | |
| #pragma clang module contents | |
| #pragma clang module begin a.b | |
| namespace b { int n; } | |
| #pragma clang module end | |
| #pragma clang module begin a.c | |
| #pragma clang module import a.b | |
| namespace c { using namespace b; } | |
| #pragma clang module end | |
| #pragma clang module begin a | |
| #pragma clang module import a.c | |
| using namespace c; | |
| #pragma clang module end | |
| #pragma clang module endbuild | |
| #pragma clang module import a.b | |
| void use1() { | |
| (void)n; // expected-error {{use of undeclared identifier}} | |
| (void)::n; // expected-error {{no member named 'n' in the global namespace}} | |
| (void)b::n; | |
| } | |
| namespace b { | |
| void use1_in_b() { (void)n; } | |
| } | |
| namespace c { | |
| void use1_in_c() { (void)n; } // expected-error {{use of undeclared identifier}} | |
| } | |
| #pragma clang module import a.c | |
| void use2() { | |
| (void)n; // expected-error {{use of undeclared identifier}} | |
| (void)::n; // expected-error {{no member named 'n' in the global namespace}} | |
| (void)b::n; | |
| (void)c::n; | |
| } | |
| namespace b { | |
| void use2_in_b() { (void)n; } | |
| } | |
| namespace c { | |
| void use2_in_c() { (void)n; } | |
| } | |
| #pragma clang module import a | |
| void use3() { | |
| (void)n; | |
| (void)::n; | |
| (void)b::n; | |
| (void)c::n; | |
| } | |
| namespace b { | |
| void use3_in_b() { (void)n; } | |
| } | |
| namespace c { | |
| void use3_in_c() { (void)n; } | |
| } |