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