1*9e11a6d8SJohn Brawn // RUN: %clang_cc1 -fsyntax-only -verify %s 2*9e11a6d8SJohn Brawn 3*9e11a6d8SJohn Brawn namespace A { 4*9e11a6d8SJohn Brawn class X { }; // expected-note{{candidate found by name lookup is 'A::X'}} 5*9e11a6d8SJohn Brawn // expected-note@-1{{candidate found by name lookup is 'A::X'}} 6*9e11a6d8SJohn Brawn } 7*9e11a6d8SJohn Brawn namespace B { 8*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'B::X'}} 9*9e11a6d8SJohn Brawn // expected-note@-1{{candidate found by name lookup is 'B::X'}} 10*9e11a6d8SJohn Brawn } 11*9e11a6d8SJohn Brawn 12*9e11a6d8SJohn Brawn // Using directive doesn't cause A::X to be hidden, so X is ambiguous. 13*9e11a6d8SJohn Brawn namespace Test1a { 14*9e11a6d8SJohn Brawn using namespace A; 15*9e11a6d8SJohn Brawn using namespace B; 16*9e11a6d8SJohn Brawn f()17*9e11a6d8SJohn Brawn void f() { 18*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 19*9e11a6d8SJohn Brawn } 20*9e11a6d8SJohn Brawn } 21*9e11a6d8SJohn Brawn 22*9e11a6d8SJohn Brawn namespace Test1b { 23*9e11a6d8SJohn Brawn using namespace B; 24*9e11a6d8SJohn Brawn using namespace A; 25*9e11a6d8SJohn Brawn f()26*9e11a6d8SJohn Brawn void f() { 27*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 28*9e11a6d8SJohn Brawn } 29*9e11a6d8SJohn Brawn } 30*9e11a6d8SJohn Brawn 31*9e11a6d8SJohn Brawn // The behaviour here should be the same as using namespaces A and B directly 32*9e11a6d8SJohn Brawn namespace Test2a { 33*9e11a6d8SJohn Brawn namespace C { 34*9e11a6d8SJohn Brawn using A::X; // expected-note{{candidate found by name lookup is 'Test2a::C::X'}} 35*9e11a6d8SJohn Brawn } 36*9e11a6d8SJohn Brawn namespace D { 37*9e11a6d8SJohn Brawn using B::X; // expected-note{{candidate found by name lookup is 'Test2a::D::X'}} 38*9e11a6d8SJohn Brawn } 39*9e11a6d8SJohn Brawn using namespace C; 40*9e11a6d8SJohn Brawn using namespace D; 41*9e11a6d8SJohn Brawn f()42*9e11a6d8SJohn Brawn void f() { 43*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 44*9e11a6d8SJohn Brawn } 45*9e11a6d8SJohn Brawn } 46*9e11a6d8SJohn Brawn 47*9e11a6d8SJohn Brawn namespace Test2b { 48*9e11a6d8SJohn Brawn namespace C { 49*9e11a6d8SJohn Brawn using A::X; // expected-note{{candidate found by name lookup is 'Test2b::C::X'}} 50*9e11a6d8SJohn Brawn } 51*9e11a6d8SJohn Brawn namespace D { 52*9e11a6d8SJohn Brawn using B::X; // expected-note{{candidate found by name lookup is 'Test2b::D::X'}} 53*9e11a6d8SJohn Brawn } 54*9e11a6d8SJohn Brawn using namespace D; 55*9e11a6d8SJohn Brawn using namespace C; 56*9e11a6d8SJohn Brawn f()57*9e11a6d8SJohn Brawn void f() { 58*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 59*9e11a6d8SJohn Brawn } 60*9e11a6d8SJohn Brawn } 61*9e11a6d8SJohn Brawn 62*9e11a6d8SJohn Brawn // Defining a function X inside C should hide using A::X in C but not D, so the result is ambiguous. 63*9e11a6d8SJohn Brawn namespace Test3a { 64*9e11a6d8SJohn Brawn namespace C { 65*9e11a6d8SJohn Brawn using A::X; 66*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'Test3a::C::X'}} 67*9e11a6d8SJohn Brawn } 68*9e11a6d8SJohn Brawn namespace D { 69*9e11a6d8SJohn Brawn using A::X; // expected-note{{candidate found by name lookup is 'Test3a::D::X'}} 70*9e11a6d8SJohn Brawn } 71*9e11a6d8SJohn Brawn using namespace C; 72*9e11a6d8SJohn Brawn using namespace D; f()73*9e11a6d8SJohn Brawn void f() { 74*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 75*9e11a6d8SJohn Brawn } 76*9e11a6d8SJohn Brawn } 77*9e11a6d8SJohn Brawn 78*9e11a6d8SJohn Brawn namespace Test3b { 79*9e11a6d8SJohn Brawn namespace C { 80*9e11a6d8SJohn Brawn using A::X; 81*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'Test3b::C::X'}} 82*9e11a6d8SJohn Brawn } 83*9e11a6d8SJohn Brawn namespace D { 84*9e11a6d8SJohn Brawn using A::X; // expected-note{{candidate found by name lookup is 'Test3b::D::X'}} 85*9e11a6d8SJohn Brawn } 86*9e11a6d8SJohn Brawn using namespace D; 87*9e11a6d8SJohn Brawn using namespace C; f()88*9e11a6d8SJohn Brawn void f() { 89*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 90*9e11a6d8SJohn Brawn } 91*9e11a6d8SJohn Brawn } 92*9e11a6d8SJohn Brawn 93*9e11a6d8SJohn Brawn namespace Test3c { 94*9e11a6d8SJohn Brawn namespace C { 95*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'Test3c::C::X'}} 96*9e11a6d8SJohn Brawn using A::X; 97*9e11a6d8SJohn Brawn } 98*9e11a6d8SJohn Brawn namespace D { 99*9e11a6d8SJohn Brawn using A::X; // expected-note{{candidate found by name lookup is 'Test3c::D::X'}} 100*9e11a6d8SJohn Brawn } 101*9e11a6d8SJohn Brawn using namespace C; 102*9e11a6d8SJohn Brawn using namespace D; f()103*9e11a6d8SJohn Brawn void f() { 104*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 105*9e11a6d8SJohn Brawn } 106*9e11a6d8SJohn Brawn } 107*9e11a6d8SJohn Brawn 108*9e11a6d8SJohn Brawn namespace Test3d { 109*9e11a6d8SJohn Brawn namespace C { 110*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'Test3d::C::X'}} 111*9e11a6d8SJohn Brawn using A::X; 112*9e11a6d8SJohn Brawn } 113*9e11a6d8SJohn Brawn namespace D { 114*9e11a6d8SJohn Brawn using A::X; // expected-note{{candidate found by name lookup is 'Test3d::D::X'}} 115*9e11a6d8SJohn Brawn } 116*9e11a6d8SJohn Brawn using namespace D; 117*9e11a6d8SJohn Brawn using namespace C; f()118*9e11a6d8SJohn Brawn void f() { 119*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 120*9e11a6d8SJohn Brawn } 121*9e11a6d8SJohn Brawn } 122*9e11a6d8SJohn Brawn 123*9e11a6d8SJohn Brawn // A::X hidden in both C and D by overloaded function, so the result is not ambiguous. 124*9e11a6d8SJohn Brawn namespace Test4a { 125*9e11a6d8SJohn Brawn namespace C { 126*9e11a6d8SJohn Brawn using A::X; 127*9e11a6d8SJohn Brawn void X(int); 128*9e11a6d8SJohn Brawn } 129*9e11a6d8SJohn Brawn namespace D { 130*9e11a6d8SJohn Brawn using A::X; 131*9e11a6d8SJohn Brawn void X(int, int); 132*9e11a6d8SJohn Brawn } 133*9e11a6d8SJohn Brawn using namespace C; 134*9e11a6d8SJohn Brawn using namespace D; f()135*9e11a6d8SJohn Brawn void f() { 136*9e11a6d8SJohn Brawn X(1); 137*9e11a6d8SJohn Brawn } 138*9e11a6d8SJohn Brawn } 139*9e11a6d8SJohn Brawn 140*9e11a6d8SJohn Brawn namespace Test4b { 141*9e11a6d8SJohn Brawn namespace C { 142*9e11a6d8SJohn Brawn using A::X; 143*9e11a6d8SJohn Brawn void X(int); 144*9e11a6d8SJohn Brawn } 145*9e11a6d8SJohn Brawn namespace D { 146*9e11a6d8SJohn Brawn using A::X; 147*9e11a6d8SJohn Brawn void X(int, int); 148*9e11a6d8SJohn Brawn } 149*9e11a6d8SJohn Brawn using namespace D; 150*9e11a6d8SJohn Brawn using namespace C; f()151*9e11a6d8SJohn Brawn void f() { 152*9e11a6d8SJohn Brawn X(1); 153*9e11a6d8SJohn Brawn } 154*9e11a6d8SJohn Brawn } 155*9e11a6d8SJohn Brawn 156*9e11a6d8SJohn Brawn namespace Test4c { 157*9e11a6d8SJohn Brawn namespace C { 158*9e11a6d8SJohn Brawn void X(int); 159*9e11a6d8SJohn Brawn using A::X; 160*9e11a6d8SJohn Brawn } 161*9e11a6d8SJohn Brawn namespace D { 162*9e11a6d8SJohn Brawn void X(int, int); 163*9e11a6d8SJohn Brawn using A::X; 164*9e11a6d8SJohn Brawn } 165*9e11a6d8SJohn Brawn using namespace C; 166*9e11a6d8SJohn Brawn using namespace D; f()167*9e11a6d8SJohn Brawn void f() { 168*9e11a6d8SJohn Brawn X(1); 169*9e11a6d8SJohn Brawn } 170*9e11a6d8SJohn Brawn } 171*9e11a6d8SJohn Brawn 172*9e11a6d8SJohn Brawn namespace Test4d { 173*9e11a6d8SJohn Brawn namespace C { 174*9e11a6d8SJohn Brawn void X(int); 175*9e11a6d8SJohn Brawn using A::X; 176*9e11a6d8SJohn Brawn } 177*9e11a6d8SJohn Brawn namespace D { 178*9e11a6d8SJohn Brawn void X(int, int); 179*9e11a6d8SJohn Brawn using A::X; 180*9e11a6d8SJohn Brawn } 181*9e11a6d8SJohn Brawn using namespace D; 182*9e11a6d8SJohn Brawn using namespace C; f()183*9e11a6d8SJohn Brawn void f() { 184*9e11a6d8SJohn Brawn X(1); 185*9e11a6d8SJohn Brawn } 186*9e11a6d8SJohn Brawn } 187*9e11a6d8SJohn Brawn 188*9e11a6d8SJohn Brawn // B::X hides class X in C, so the the result is not ambiguous 189*9e11a6d8SJohn Brawn namespace Test5a { 190*9e11a6d8SJohn Brawn namespace C { 191*9e11a6d8SJohn Brawn using B::X; 192*9e11a6d8SJohn Brawn class X { }; 193*9e11a6d8SJohn Brawn } 194*9e11a6d8SJohn Brawn namespace D { 195*9e11a6d8SJohn Brawn using B::X; 196*9e11a6d8SJohn Brawn } 197*9e11a6d8SJohn Brawn using namespace C; 198*9e11a6d8SJohn Brawn using namespace D; f()199*9e11a6d8SJohn Brawn void f() { 200*9e11a6d8SJohn Brawn X(1); 201*9e11a6d8SJohn Brawn } 202*9e11a6d8SJohn Brawn } 203*9e11a6d8SJohn Brawn 204*9e11a6d8SJohn Brawn namespace Test5b { 205*9e11a6d8SJohn Brawn namespace C { 206*9e11a6d8SJohn Brawn using B::X; 207*9e11a6d8SJohn Brawn class X { }; 208*9e11a6d8SJohn Brawn } 209*9e11a6d8SJohn Brawn namespace D { 210*9e11a6d8SJohn Brawn using B::X; 211*9e11a6d8SJohn Brawn } 212*9e11a6d8SJohn Brawn using namespace D; 213*9e11a6d8SJohn Brawn using namespace C; f()214*9e11a6d8SJohn Brawn void f() { 215*9e11a6d8SJohn Brawn X(1); 216*9e11a6d8SJohn Brawn } 217*9e11a6d8SJohn Brawn } 218*9e11a6d8SJohn Brawn 219*9e11a6d8SJohn Brawn namespace Test5c { 220*9e11a6d8SJohn Brawn namespace C { 221*9e11a6d8SJohn Brawn class X { }; 222*9e11a6d8SJohn Brawn using B::X; 223*9e11a6d8SJohn Brawn } 224*9e11a6d8SJohn Brawn namespace D { 225*9e11a6d8SJohn Brawn using B::X; 226*9e11a6d8SJohn Brawn } 227*9e11a6d8SJohn Brawn using namespace C; 228*9e11a6d8SJohn Brawn using namespace D; f()229*9e11a6d8SJohn Brawn void f() { 230*9e11a6d8SJohn Brawn X(1); 231*9e11a6d8SJohn Brawn } 232*9e11a6d8SJohn Brawn } 233*9e11a6d8SJohn Brawn 234*9e11a6d8SJohn Brawn namespace Test5d { 235*9e11a6d8SJohn Brawn namespace C { 236*9e11a6d8SJohn Brawn class X { }; 237*9e11a6d8SJohn Brawn using B::X; 238*9e11a6d8SJohn Brawn } 239*9e11a6d8SJohn Brawn namespace D { 240*9e11a6d8SJohn Brawn using B::X; 241*9e11a6d8SJohn Brawn } 242*9e11a6d8SJohn Brawn using namespace D; 243*9e11a6d8SJohn Brawn using namespace C; f()244*9e11a6d8SJohn Brawn void f() { 245*9e11a6d8SJohn Brawn X(1); 246*9e11a6d8SJohn Brawn } 247*9e11a6d8SJohn Brawn } 248*9e11a6d8SJohn Brawn 249*9e11a6d8SJohn Brawn // B::X hides class X declared in both C and D, so the result is not ambiguous. 250*9e11a6d8SJohn Brawn namespace Test6a { 251*9e11a6d8SJohn Brawn namespace C { 252*9e11a6d8SJohn Brawn class X { }; 253*9e11a6d8SJohn Brawn using B::X; 254*9e11a6d8SJohn Brawn } 255*9e11a6d8SJohn Brawn namespace D { 256*9e11a6d8SJohn Brawn class X { }; 257*9e11a6d8SJohn Brawn using B::X; 258*9e11a6d8SJohn Brawn } 259*9e11a6d8SJohn Brawn using namespace C; 260*9e11a6d8SJohn Brawn using namespace D; f()261*9e11a6d8SJohn Brawn void f() { 262*9e11a6d8SJohn Brawn X(1); 263*9e11a6d8SJohn Brawn } 264*9e11a6d8SJohn Brawn } 265*9e11a6d8SJohn Brawn 266*9e11a6d8SJohn Brawn namespace Test6b { 267*9e11a6d8SJohn Brawn namespace C { 268*9e11a6d8SJohn Brawn class X { }; 269*9e11a6d8SJohn Brawn using B::X; 270*9e11a6d8SJohn Brawn } 271*9e11a6d8SJohn Brawn namespace D { 272*9e11a6d8SJohn Brawn class X { }; 273*9e11a6d8SJohn Brawn using B::X; 274*9e11a6d8SJohn Brawn } 275*9e11a6d8SJohn Brawn using namespace D; 276*9e11a6d8SJohn Brawn using namespace C; f()277*9e11a6d8SJohn Brawn void f() { 278*9e11a6d8SJohn Brawn X(1); 279*9e11a6d8SJohn Brawn } 280*9e11a6d8SJohn Brawn } 281*9e11a6d8SJohn Brawn 282*9e11a6d8SJohn Brawn namespace Test6c { 283*9e11a6d8SJohn Brawn namespace C { 284*9e11a6d8SJohn Brawn using B::X; 285*9e11a6d8SJohn Brawn class X { }; 286*9e11a6d8SJohn Brawn } 287*9e11a6d8SJohn Brawn namespace D { 288*9e11a6d8SJohn Brawn using B::X; 289*9e11a6d8SJohn Brawn class X { }; 290*9e11a6d8SJohn Brawn } 291*9e11a6d8SJohn Brawn using namespace C; 292*9e11a6d8SJohn Brawn using namespace D; f()293*9e11a6d8SJohn Brawn void f() { 294*9e11a6d8SJohn Brawn X(1); 295*9e11a6d8SJohn Brawn } 296*9e11a6d8SJohn Brawn } 297*9e11a6d8SJohn Brawn 298*9e11a6d8SJohn Brawn namespace Test6d { 299*9e11a6d8SJohn Brawn namespace C { 300*9e11a6d8SJohn Brawn using B::X; 301*9e11a6d8SJohn Brawn class X { }; 302*9e11a6d8SJohn Brawn } 303*9e11a6d8SJohn Brawn namespace D { 304*9e11a6d8SJohn Brawn using B::X; 305*9e11a6d8SJohn Brawn class X { }; 306*9e11a6d8SJohn Brawn } 307*9e11a6d8SJohn Brawn using namespace D; 308*9e11a6d8SJohn Brawn using namespace C; f()309*9e11a6d8SJohn Brawn void f() { 310*9e11a6d8SJohn Brawn X(1); 311*9e11a6d8SJohn Brawn } 312*9e11a6d8SJohn Brawn } 313*9e11a6d8SJohn Brawn 314*9e11a6d8SJohn Brawn // function X inside C should hide class X in C but not D. 315*9e11a6d8SJohn Brawn namespace Test7a { 316*9e11a6d8SJohn Brawn namespace C { 317*9e11a6d8SJohn Brawn class X; 318*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'Test7a::C::X'}} 319*9e11a6d8SJohn Brawn } 320*9e11a6d8SJohn Brawn namespace D { 321*9e11a6d8SJohn Brawn class X; // expected-note{{candidate found by name lookup is 'Test7a::D::X'}} 322*9e11a6d8SJohn Brawn } 323*9e11a6d8SJohn Brawn using namespace C; 324*9e11a6d8SJohn Brawn using namespace D; f()325*9e11a6d8SJohn Brawn void f() { 326*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 327*9e11a6d8SJohn Brawn } 328*9e11a6d8SJohn Brawn } 329*9e11a6d8SJohn Brawn 330*9e11a6d8SJohn Brawn namespace Test7b { 331*9e11a6d8SJohn Brawn namespace C { 332*9e11a6d8SJohn Brawn class X; 333*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'Test7b::C::X'}} 334*9e11a6d8SJohn Brawn } 335*9e11a6d8SJohn Brawn namespace D { 336*9e11a6d8SJohn Brawn class X; // expected-note{{candidate found by name lookup is 'Test7b::D::X'}} 337*9e11a6d8SJohn Brawn } 338*9e11a6d8SJohn Brawn using namespace D; 339*9e11a6d8SJohn Brawn using namespace C; f()340*9e11a6d8SJohn Brawn void f() { 341*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 342*9e11a6d8SJohn Brawn } 343*9e11a6d8SJohn Brawn } 344*9e11a6d8SJohn Brawn 345*9e11a6d8SJohn Brawn namespace Test7c { 346*9e11a6d8SJohn Brawn namespace C { 347*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'Test7c::C::X'}} 348*9e11a6d8SJohn Brawn class X; 349*9e11a6d8SJohn Brawn } 350*9e11a6d8SJohn Brawn namespace D { 351*9e11a6d8SJohn Brawn class X; // expected-note{{candidate found by name lookup is 'Test7c::D::X'}} 352*9e11a6d8SJohn Brawn } 353*9e11a6d8SJohn Brawn using namespace C; 354*9e11a6d8SJohn Brawn using namespace D; f()355*9e11a6d8SJohn Brawn void f() { 356*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 357*9e11a6d8SJohn Brawn } 358*9e11a6d8SJohn Brawn } 359*9e11a6d8SJohn Brawn 360*9e11a6d8SJohn Brawn namespace Test7d { 361*9e11a6d8SJohn Brawn namespace C { 362*9e11a6d8SJohn Brawn void X(int); // expected-note{{candidate found by name lookup is 'Test7d::C::X'}} 363*9e11a6d8SJohn Brawn class X; 364*9e11a6d8SJohn Brawn } 365*9e11a6d8SJohn Brawn namespace D { 366*9e11a6d8SJohn Brawn class X; // expected-note{{candidate found by name lookup is 'Test7d::D::X'}} 367*9e11a6d8SJohn Brawn } 368*9e11a6d8SJohn Brawn using namespace D; 369*9e11a6d8SJohn Brawn using namespace C; f()370*9e11a6d8SJohn Brawn void f() { 371*9e11a6d8SJohn Brawn X(1); // expected-error{{reference to 'X' is ambiguous}} 372*9e11a6d8SJohn Brawn } 373*9e11a6d8SJohn Brawn } 374