1// RUN: %clang_cc1 -fsyntax-only -verify %s 2 3// C++03 [namespace.udecl]p3: 4// For the purpose of overload resolution, the functions which are 5// introduced by a using-declaration into a derived class will be 6// treated as though they were members of the derived class. In 7// particular, the implicit this parameter shall be treated as if it 8// were a pointer to the derived class rather than to the base 9// class. This has no effect on the type of the function, and in all 10// other respects the function remains a member of the base class. 11 12namespace test0 { 13 struct Opaque0 {}; 14 struct Opaque1 {}; 15 16 struct Base { 17 Opaque0 test0(int*); 18 Opaque0 test1(const int*); 19 Opaque0 test2(int*); 20 Opaque0 test3(int*) const; 21 }; 22 23 struct Derived : Base { 24 using Base::test0; 25 Opaque1 test0(const int*); 26 27 using Base::test1; 28 Opaque1 test1(int*); 29 30 using Base::test2; 31 Opaque1 test2(int*) const; 32 33 using Base::test3; 34 Opaque1 test3(int*); 35 }; 36 37 void test0() { 38 Opaque0 a = Derived().test0((int*) 0); 39 Opaque1 b = Derived().test0((const int*) 0); 40 } 41 42 void test1() { 43 Opaque1 a = Derived().test1((int*) 0); 44 Opaque0 b = Derived().test1((const int*) 0); 45 } 46 47 void test2() { 48 Opaque0 a = ((Derived*) 0)->test2((int*) 0); 49 Opaque1 b = ((const Derived*) 0)->test2((int*) 0); 50 } 51 52 void test3() { 53 Opaque1 a = ((Derived*) 0)->test3((int*) 0); 54 Opaque0 b = ((const Derived*) 0)->test3((int*) 0); 55 } 56} 57 58// Typedef redeclaration. 59namespace rdar8018262 { 60 typedef void (*fp)(); 61 62 namespace N { 63 typedef void (*fp)(); 64 } 65 66 using N::fp; 67 68 fp fp_1; 69} 70 71// Things to test: 72// member operators 73// conversion operators 74// call operators 75// call-surrogate conversion operators 76// everything, but in dependent contexts 77