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