1 // RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -fno-modules-error-recovery -fno-spell-checking -verify %s 2 3 #pragma clang module build a 4 module a { explicit module b {} explicit module c {} } 5 #pragma clang module contents 6 7 #pragma clang module begin a.b 8 namespace b { int n; } 9 #pragma clang module end 10 11 #pragma clang module begin a.c 12 #pragma clang module import a.b 13 namespace c { using namespace b; } 14 #pragma clang module end 15 16 #pragma clang module begin a 17 #pragma clang module import a.c 18 using namespace c; 19 #pragma clang module end 20 21 #pragma clang module endbuild 22 23 #pragma clang module import a.b use1()24void use1() { 25 (void)n; // expected-error {{use of undeclared identifier}} 26 (void)::n; // expected-error {{no member named 'n' in the global namespace}} 27 (void)b::n; 28 } 29 namespace b { use1_in_b()30 void use1_in_b() { (void)n; } 31 } 32 namespace c { use1_in_c()33 void use1_in_c() { (void)n; } // expected-error {{use of undeclared identifier}} 34 } 35 36 #pragma clang module import a.c use2()37void use2() { 38 (void)n; // expected-error {{use of undeclared identifier}} 39 (void)::n; // expected-error {{no member named 'n' in the global namespace}} 40 (void)b::n; 41 (void)c::n; 42 } 43 namespace b { use2_in_b()44 void use2_in_b() { (void)n; } 45 } 46 namespace c { use2_in_c()47 void use2_in_c() { (void)n; } 48 } 49 50 #pragma clang module import a use3()51void use3() { 52 (void)n; 53 (void)::n; 54 (void)b::n; 55 (void)c::n; 56 } 57 namespace b { use3_in_b()58 void use3_in_b() { (void)n; } 59 } 60 namespace c { use3_in_c()61 void use3_in_c() { (void)n; } 62 } 63