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