1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 3 4 extern "C" { void f(bool); } 5 6 namespace std { 7 using ::f; 8 inline void f() { return f(true); } 9 } 10 11 namespace M { 12 void f(float); 13 } 14 15 namespace N { 16 using M::f; 17 void f(int) { } // expected-note{{previous}} 18 19 void f(int) { } // expected-error{{redefinition}} 20 } 21 22 namespace N { 23 void f(double); 24 void f(long); 25 } 26 27 struct X0 { 28 void operator()(int); 29 void operator()(long); 30 }; 31 32 struct X1 : X0 { 33 void operator()(float&); 34 using X0::operator(); 35 36 void test() { 37 (*this)(1); 38 } 39 }; 40 41 struct A { void f(); }; 42 struct B : A { }; 43 class C : B { using B::f; }; 44 45 // PR5751: Resolve overloaded functions through using decls. 46 namespace O { 47 void f(int i); 48 void f(double d); 49 } 50 namespace P { 51 void f(); 52 void g(void (*ptr)(int)); 53 using O::f; 54 void test() { 55 f(); 56 f(1); 57 void (*f_ptr1)(double) = f; 58 void (*f_ptr2)() = f; 59 g(f); 60 } 61 } 62 63 // Make sure that ADL can find names brought in by using decls. 64 namespace test0 { 65 namespace ns { 66 class Foo {}; 67 68 namespace inner { 69 void foo(char *); // expected-note {{no known conversion}} 70 } 71 72 using inner::foo; 73 } 74 75 void test(ns::Foo *p) { 76 foo(*p); // expected-error {{no matching function for call to 'foo'}} 77 } 78 } 79 80 // Redeclarations! 81 namespace test1 { 82 namespace ns0 { struct Foo {}; } 83 namespace A { void foo(ns0::Foo *p, int y, int z); } 84 namespace ns2 { using A::foo; } 85 namespace ns1 { struct Bar : ns0::Foo {}; } 86 namespace A { void foo(ns0::Foo *p, int y, int z = 0); } // expected-note {{candidate}} 87 namespace ns1 { using A::foo; } 88 namespace ns2 { struct Baz : ns1::Bar {}; } 89 namespace A { void foo(ns0::Foo *p, int y = 0, int z); } 90 91 void test(ns2::Baz *p) { 92 foo(p, 0, 0); // okay! 93 foo(p, 0); // should be fine! 94 foo(p); // expected-error {{no matching function}} 95 } 96 } 97 98 namespace test2 { 99 namespace ns { int foo; } 100 template <class T> using ns::foo; // expected-error {{cannot template a using declaration}} 101 102 // PR8022 103 struct A { 104 template <typename T> void f(T); 105 }; 106 class B : A { 107 template <typename T> using A::f<T>; // expected-error {{cannot template a using declaration}} 108 }; 109 } 110 111 // PR8756 112 namespace foo 113 { 114 class Class1; // expected-note{{forward declaration}} 115 class Class2 116 { 117 using ::foo::Class1::Function; // expected-error{{incomplete type 'foo::Class1' named in nested name specifier}} 118 }; 119 } 120 121 // Don't suggest non-typenames for positions requiring typenames. 122 namespace using_suggestion_tyname_val { 123 namespace N { void FFF() {} } 124 using typename N::FFG; // expected-error {{no member named 'FFG' in namespace 'using_suggestion_tyname_val::N'}} 125 } 126 127 namespace using_suggestion_member_tyname_val { 128 class CCC { public: void AAA() { } }; 129 class DDD : public CCC { public: using typename CCC::AAB; }; // expected-error {{no member named 'AAB' in 'using_suggestion_member_tyname_val::CCC'}} 130 } 131 132 namespace using_suggestion_tyname_val_dropped_specifier { 133 void FFF() {} 134 namespace N { } 135 using typename N::FFG; // expected-error {{no member named 'FFG' in namespace 'using_suggestion_tyname_val_dropped_specifier::N'}} 136 } 137 138 // Currently hints aren't provided to drop out the incorrect M::. 139 namespace using_suggestion_ty_dropped_nested_specifier { 140 namespace N { 141 class AAA {}; // expected-note {{'N::AAA' declared here}} 142 namespace M { } 143 } 144 using N::M::AAA; // expected-error {{no member named 'AAA' in namespace 'using_suggestion_ty_dropped_nested_specifier::N::M'; did you mean 'N::AAA'?}} 145 } 146 147 namespace using_suggestion_tyname_ty_dropped_nested_specifier { 148 namespace N { 149 class AAA {}; // expected-note {{'N::AAA' declared here}} 150 namespace M { } 151 } 152 using typename N::M::AAA; // expected-error {{no member named 'AAA' in namespace 'using_suggestion_tyname_ty_dropped_nested_specifier::N::M'; did you mean 'N::AAA'?}} 153 } 154 155 namespace using_suggestion_val_dropped_nested_specifier { 156 namespace N { 157 void FFF() {} // expected-note {{'N::FFF' declared here}} 158 namespace M { } 159 } 160 using N::M::FFF; // expected-error {{no member named 'FFF' in namespace 'using_suggestion_val_dropped_nested_specifier::N::M'; did you mean 'N::FFF'?}} 161 } 162 163 namespace UsingDeclVsHiddenName { 164 namespace A { 165 enum HiddenTag1 {}; // expected-note {{previous use is here}} 166 enum HiddenTag2 {}; // expected-note {{target}} 167 int HiddenFn1; // expected-note {{target}} 168 int HiddenFn2; // expected-note {{target}} 169 int HiddenLocalExtern1; 170 int HiddenLocalExtern2; 171 } 172 173 namespace B { 174 using A::HiddenTag1; 175 using A::HiddenFn1; // expected-note {{using declaration}} 176 using A::HiddenLocalExtern1; 177 178 struct S { 179 friend struct HiddenTag1; // expected-error {{tag type that does not match previous}} 180 friend struct HiddenTag2; // expected-note {{conflicting declaration}} 181 friend void HiddenFn1(); // expected-error {{cannot befriend target of using declaration}} 182 friend void HiddenFn2(); // expected-note {{conflicting declaration}} 183 void f() { 184 // OK, these are not in the scope of namespace B, even though they're 185 // members of the namespace. 186 void HiddenLocalExtern1(); 187 void HiddenLocalExtern2(); 188 } 189 }; 190 191 using A::HiddenTag2; // expected-error {{conflicts with declaration already in scope}} 192 using A::HiddenFn2; // expected-error {{conflicts with declaration already in scope}} 193 using A::HiddenLocalExtern2; 194 } 195 } 196 197 namespace PR19171 { 198 struct Z { 199 Z(); 200 }; 201 202 typedef struct { 203 Z i; 204 } S; 205 206 struct Y : S { 207 using S::S; 208 #if __cplusplus < 201103L 209 // expected-error@-2 {{no member named 'S' in 'PR19171::S'}} 210 #endif 211 }; 212 213 // [namespace.udecl]p3: In a using-declaration used as a member-declaration, 214 // the nested-name-specifier shall name a base class of the class being defined. 215 // If such a using-declaration names a constructor, the nested-name-specifier 216 // shall name a direct base class of the class being defined; 217 218 struct B_blah { }; 219 struct C_blah : B_blah { C_blah(int); }; // expected-note 0-1{{declared here}} 220 struct D1 : C_blah { 221 // FIXME: We should be able to correct this in C++11 mode. 222 using B_blah::C_blah; // expected-error-re {{no member named 'C_blah' in 'PR19171::B_blah'{{$}}}} 223 }; 224 struct D2 : C_blah { 225 // Somewhat bizarrely, this names the injected-class-name of B_blah within 226 // C_blah, and is valid. 227 using C_blah::B_blah; 228 }; 229 struct D3 : C_blah { 230 using C_blah::D_blah; 231 #if __cplusplus < 201103L 232 // expected-error-re@-2 {{no member named 'D_blah' in 'PR19171::C_blah'{{$}}}} 233 #else 234 // expected-error@-4 {{no member named 'D_blah' in 'PR19171::C_blah'; did you mean 'C_blah'?}} 235 #endif 236 }; 237 #if __cplusplus >= 201103L 238 D3 d3(0); // ok 239 #endif 240 241 struct E { }; 242 struct EE { int EE; }; 243 struct F : E { 244 using E::EE; // expected-error-re {{no member named 'EE' in 'PR19171::E'{{$}}}} 245 }; 246 247 struct TypoDuplicate { // expected-note 0-4{{here}} 248 TypoDuplicate(int); 249 void foobar(); // expected-note 2{{here}} 250 }; 251 struct TypoDuplicateDerived1 : TypoDuplicate { 252 #if __cplusplus >= 201103L 253 using TypoDuplicate::TypoFuplicate; // expected-error {{did you mean 'TypoDuplicate'}} expected-note {{previous}} 254 using TypoDuplicate::TypoDuplicate; // expected-error {{redeclaration}} 255 #endif 256 using TypoDuplicate::goobar; // expected-error {{did you mean 'foobar'}} expected-note {{previous}} 257 using TypoDuplicate::foobar; // expected-error {{redeclaration}} 258 }; 259 struct TypoDuplicateDerived2 : TypoDuplicate { 260 #if __cplusplus >= 201103L 261 using TypoFuplicate::TypoDuplicate; // expected-error {{did you mean 'TypoDuplicate'}} expected-note {{previous}} 262 using TypoDuplicate::TypoDuplicate; // expected-error {{redeclaration}} 263 #endif 264 }; 265 struct TypoDuplicateDerived3 : TypoDuplicate { 266 #if __cplusplus >= 201103L 267 // FIXME: Don't suggest a correction that would lead to a redeclaration 268 // error here... or at least diagnose the error. 269 using TypoDuplicate::TypoDuplicate; 270 using TypoDuplicate::TypoFuplicate; // expected-error {{did you mean 'TypoDuplicate'}} 271 #endif 272 using TypoDuplicate::foobar; 273 using TypoDuplicate::goobar; // expected-error {{did you mean 'foobar'}} 274 }; 275 struct TypoDuplicateDerived4 : TypoDuplicate { 276 #if __cplusplus >= 201103L 277 using TypoDuplicate::TypoDuplicate; // expected-note {{previous}} 278 using TypoFuplicate::TypoDuplicate; // expected-error {{did you mean 'TypoDuplicate'}} expected-error {{redeclaration}} 279 #endif 280 }; 281 } 282 283 namespace TypoCorrectTemplateMember { 284 struct A { 285 template<typename T> void foobar(T); // expected-note {{'foobar' declared here}} 286 }; 287 struct B : A { 288 using A::goobar; // expected-error {{no member named 'goobar' in 'TypoCorrectTemplateMember::A'; did you mean 'foobar'?}} 289 }; 290 } 291 292 namespace use_instance_in_static { 293 struct A { int n; }; 294 struct B : A { 295 using A::n; 296 static int f() { return n; } // expected-error {{invalid use of member 'n' in static member function}} 297 }; 298 } 299 300 namespace PR24030 { 301 namespace X { 302 class A; // expected-note {{target}} 303 int i; // expected-note {{target}} 304 } 305 namespace Y { 306 using X::A; // expected-note {{using}} 307 using X::i; // expected-note {{using}} 308 class A {}; // expected-error {{conflicts}} 309 int i; // expected-error {{conflicts}} 310 } 311 } 312 313 namespace PR24033 { 314 extern int a; // expected-note 2{{target of using declaration}} 315 void f(); // expected-note 2{{target of using declaration}} 316 struct s; // expected-note 2{{target of using declaration}} 317 enum e {}; // expected-note 2{{target of using declaration}} 318 319 template<typename> extern int vt; // expected-note 2{{target of using declaration}} expected-warning 0-1{{extension}} 320 template<typename> void ft(); // expected-note 2{{target of using declaration}} 321 template<typename> struct st; // expected-note 2{{target of using declaration}} 322 323 namespace X { 324 using PR24033::a; // expected-note {{using declaration}} 325 using PR24033::f; // expected-note {{using declaration}} 326 using PR24033::s; // expected-note {{using declaration}} 327 using PR24033::e; // expected-note {{using declaration}} 328 329 using PR24033::vt; // expected-note {{using declaration}} 330 using PR24033::ft; // expected-note {{using declaration}} 331 using PR24033::st; // expected-note {{using declaration}} 332 333 extern int a; // expected-error {{declaration conflicts with target of using declaration already in scope}} 334 void f(); // expected-error {{declaration conflicts with target of using declaration already in scope}} 335 struct s; // expected-error {{declaration conflicts with target of using declaration already in scope}} 336 enum e {}; // expected-error {{declaration conflicts with target of using declaration already in scope}} 337 338 template<typename> extern int vt; // expected-error {{declaration conflicts with target of using declaration already in scope}} expected-warning 0-1{{extension}} 339 template<typename> void ft(); // expected-error {{declaration conflicts with target of using declaration already in scope}} 340 template<typename> struct st; // expected-error {{declaration conflicts with target of using declaration already in scope}} 341 } 342 343 namespace Y { 344 extern int a; // expected-note {{conflicting declaration}} 345 void f(); // expected-note {{conflicting declaration}} 346 struct s; // expected-note {{conflicting declaration}} 347 enum e {}; // expected-note {{conflicting declaration}} 348 349 template<typename> extern int vt; // expected-note {{conflicting declaration}} expected-warning 0-1{{extension}} 350 template<typename> void ft(); // expected-note {{conflicting declaration}} 351 template<typename> struct st; // expected-note {{conflicting declaration}} 352 353 using PR24033::a; // expected-error {{target of using declaration conflicts with declaration already in scope}} 354 using PR24033::f; // expected-error {{target of using declaration conflicts with declaration already in scope}} 355 using PR24033::s; // expected-error {{target of using declaration conflicts with declaration already in scope}} 356 using PR24033::e; // expected-error {{target of using declaration conflicts with declaration already in scope}} 357 358 using PR24033::vt; // expected-error {{target of using declaration conflicts with declaration already in scope}} 359 using PR24033::ft; // expected-error {{target of using declaration conflicts with declaration already in scope}} 360 using PR24033::st; // expected-error {{target of using declaration conflicts with declaration already in scope}} 361 } 362 } 363 364 namespace field_use { 365 struct A { int field; }; 366 struct B : A { 367 // Previously Clang rejected this valid C++11 code because it didn't look 368 // through the UsingShadowDecl. 369 using A::field; 370 #if __cplusplus < 201103L 371 // expected-error@+2 {{invalid use of non-static data member 'field'}} 372 #endif 373 enum { X = sizeof(field) }; 374 }; 375 } 376 377 namespace tag_vs_var { 378 namespace N { 379 struct X {}; 380 381 struct Y {}; 382 int Y; 383 384 int Z; 385 } 386 using N::X; 387 using N::Y; 388 using N::Z; 389 390 namespace N { 391 int X; 392 393 struct Z {}; 394 } 395 using N::X; 396 using N::Y; 397 using N::Z; 398 } 399