1 | class X { |
2 | public: |
3 | int pub; |
4 | protected: |
5 | int prot; |
6 | private: |
7 | int priv; |
8 | }; |
9 | |
10 | class Unrelated { |
11 | public: |
12 | static int pub; |
13 | protected: |
14 | static int prot; |
15 | private: |
16 | static int priv; |
17 | }; |
18 | |
19 | class Y : public X { |
20 | int test() { |
21 | this->pub = 10; |
22 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:21:11 %s -o - \ |
23 | // RUN: | FileCheck -check-prefix=THIS %s |
24 | // THIS: priv (InBase,Inaccessible) |
25 | // THIS: prot (InBase) |
26 | // THIS: pub (InBase) |
27 | // |
28 | // Also check implicit 'this->', i.e. complete at the start of the line. |
29 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:21:1 %s -o - \ |
30 | // RUN: | FileCheck -check-prefix=THIS %s |
31 | |
32 | X().pub + 10; |
33 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:32:9 %s -o - \ |
34 | // RUN: | FileCheck -check-prefix=X-OBJ %s |
35 | // X-OBJ: priv (Inaccessible) |
36 | // X-OBJ: prot (Inaccessible) |
37 | // X-OBJ: pub : [#int#]pub |
38 | |
39 | Y().pub + 10; |
40 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:39:9 %s -o - \ |
41 | // RUN: | FileCheck -check-prefix=Y-OBJ %s |
42 | // Y-OBJ: priv (InBase,Inaccessible) |
43 | // Y-OBJ: prot (InBase) |
44 | // Y-OBJ: pub (InBase) |
45 | |
46 | this->X::pub = 10; |
47 | X::pub = 10; |
48 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:46:14 %s -o - \ |
49 | // RUN: | FileCheck -check-prefix=THIS-BASE %s |
50 | // |
51 | // THIS-BASE: priv (Inaccessible) |
52 | // THIS-BASE: prot : [#int#]prot |
53 | // THIS-BASE: pub : [#int#]pub |
54 | // |
55 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:47:8 %s -o - \ |
56 | // RUN: | FileCheck -check-prefix=THIS-BASE %s |
57 | |
58 | |
59 | this->Unrelated::pub = 10; // a check we don't crash in this cases. |
60 | Y().Unrelated::pub = 10; // a check we don't crash in this cases. |
61 | Unrelated::pub = 10; |
62 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:59:22 %s -o - \ |
63 | // RUN: | FileCheck -check-prefix=UNRELATED %s |
64 | // UNRELATED: priv (Inaccessible) |
65 | // UNRELATED: prot (Inaccessible) |
66 | // UNRELATED: pub : [#int#]pub |
67 | // |
68 | // RUN: not %clang_cc1 -fsyntax-only -code-completion-at=%s:60:20 %s -o - \ |
69 | // RUN: | FileCheck -check-prefix=UNRELATED %s |
70 | // RUN: not %clang_cc1 -fsyntax-only -code-completion-at=%s:61:16 %s -o - \ |
71 | // RUN: | FileCheck -check-prefix=UNRELATED %s |
72 | } |
73 | }; |
74 | |
75 | class Outer { |
76 | public: |
77 | static int pub; |
78 | protected: |
79 | static int prot; |
80 | private: |
81 | static int priv; |
82 | |
83 | class Inner { |
84 | int test() { |
85 | Outer::pub = 10; |
86 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:85:14 %s -o - \ |
87 | // RUN: | FileCheck -check-prefix=OUTER %s |
88 | // OUTER: priv : [#int#]priv |
89 | // OUTER: prot : [#int#]prot |
90 | // OUTER: pub : [#int#]pub |
91 | |
92 | // Also check the unqualified case. |
93 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:85:1 %s -o - \ |
94 | // RUN: | FileCheck -check-prefix=OUTER %s |
95 | } |
96 | }; |
97 | }; |
98 | |
99 | class Base { |
100 | public: |
101 | int pub; |
102 | }; |
103 | |
104 | class Accessible : public Base { |
105 | }; |
106 | |
107 | class Inaccessible : private Base { |
108 | }; |
109 | |
110 | class Test : public Accessible, public Inaccessible { |
111 | int test() { |
112 | this->Accessible::pub = 10; |
113 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:112:23 %s -o - \ |
114 | // RUN: | FileCheck -check-prefix=ACCESSIBLE %s |
115 | // ACCESSIBLE: pub (InBase) |
116 | |
117 | this->Inaccessible::pub = 10; |
118 | // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:117:25 %s -o - \ |
119 | // RUN: | FileCheck -check-prefix=INACCESSIBLE %s |
120 | // INACCESSIBLE: pub (InBase,Inaccessible) |
121 | } |
122 | }; |
123 | |