1 struct X { int x; };
2 void z(int);
3 typedef struct t TYPEDEF;
4 
5 void foo() {
6   int y = 17;
7   // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -code-completion-patterns -code-completion-at=%s:6:14 -std=gnu++11 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
8   // CHECK-CC1: COMPLETION: bool
9   // CHECK-CC1-NEXT: COMPLETION: char
10   // CHECK-CC1-NEXT: COMPLETION: char16
11   // CHECK-CC1-NEXT: COMPLETION: char32
12   // CHECK-CC1-NEXT: COMPLETION: class
13   // CHECK-CC1-NEXT: COMPLETION: const
14   // CHECK-CC1-NEXT: COMPLETION: Pattern : const_cast<<#type#>>(<#expression#>)
15   // CHECK-CC1: COMPLETION: Pattern : [#void#]delete <#expression#>
16   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#void#]delete [] <#expression#>
17   // CHECK-CC1-NEXT: COMPLETION: Pattern : do {
18   // CHECK-CC1-NEXT: <#statements#>
19   // CHECK-CC1-NEXT: }
20   // CHECK-CC1: COMPLETION: double
21   // CHECK-CC1-NEXT: COMPLETION: Pattern : dynamic_cast<<#type#>>(<#expression#>)
22   // CHECK-CC1-NEXT: COMPLETION: enum
23   // CHECK-CC1-NEXT: COMPLETION: extern
24   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#bool#]false
25   // CHECK-CC1-NEXT: COMPLETION: float
26   // CHECK-CC1-NEXT: COMPLETION: foo : [#void#]foo()
27   // CHECK-CC1-NEXT: COMPLETION: Pattern : for (<#init-statement#>; <#condition#>; <#inc-expression#>) {
28   // CHECK-CC1: COMPLETION: Pattern : goto <#label#>;
29   // CHECK-CC1-NEXT: COMPLETION: Pattern : if (<#condition#>) {
30   // CHECK-CC1-NEXT: <#statements#>
31   // CHECK-CC1-NEXT: }
32   // CHECK-CC1: COMPLETION: int
33   // CHECK-CC1-NEXT: COMPLETION: long
34   // CHECK-CC1-NEXT: COMPLETION: Pattern : new <#type#>(<#expressions#>)
35   // CHECK-CC1-NEXT: COMPLETION: Pattern : new <#type#>[<#size#>](<#expressions#>)
36   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#bool#]noexcept(<#expression#>)
37   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#std::nullptr_t#]nullptr
38   // CHECK-CC1-NEXT: COMPLETION: operator
39   // CHECK-CC1-NEXT: COMPLETION: Pattern : reinterpret_cast<<#type#>>(<#expression#>)
40   // CHECK-CC1-NEXT: COMPLETION: Pattern : return;
41   // CHECK-CC1-NEXT: COMPLETION: short
42   // CHECK-CC1-NEXT: COMPLETION: signed
43   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#size_t#]sizeof(<#expression-or-type#>)
44   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#size_t#]sizeof...(<#parameter-pack#>)
45   // CHECK-CC1-NEXT: COMPLETION: static
46   // CHECK-CC1-NEXT: COMPLETION: Pattern : static_assert(<#expression#>, <#message#>);
47   // CHECK-CC1-NEXT: COMPLETION: Pattern : static_cast<<#type#>>(<#expression#>)
48   // CHECK-CC1-NEXT: COMPLETION: struct
49   // CHECK-CC1-NEXT: COMPLETION: Pattern : switch (<#condition#>) {
50   // CHECK-CC1: COMPLETION: t : t
51   // CHECK-CC1-NEXT: COMPLETION: thread_local
52   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#void#]throw <#expression#>
53   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#bool#]true
54   // CHECK-CC1-NEXT: COMPLETION: Pattern : try {
55   // CHECK-CC1-NEXT: <#statements#>
56   // CHECK-CC1-NEXT: }
57   // CHECK-CC1: COMPLETION: TYPEDEF : TYPEDEF
58   // CHECK-CC1-NEXT: COMPLETION: Pattern : typedef <#type#> <#name#>;
59   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#std::type_info#]typeid(<#expression-or-type#>)
60   // CHECK-CC1-NEXT: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
61   // CHECK-CC1-NEXT: COMPLETION: Pattern : typeof <#expression#>
62   // CHECK-CC1-NEXT: COMPLETION: Pattern : typeof(<#type#>)
63   // CHECK-CC1-NEXT: COMPLETION: union
64   // CHECK-CC1-NEXT: COMPLETION: unsigned
65   // CHECK-CC1-NEXT: COMPLETION: Pattern : using namespace <#identifier#>;
66   // CHECK-CC1-NEXT: COMPLETION: void
67   // CHECK-CC1-NEXT: COMPLETION: volatile
68   // CHECK-CC1-NEXT: COMPLETION: wchar_t
69   // CHECK-CC1-NEXT: COMPLETION: Pattern : while (<#condition#>) {
70   // CHECK-CC1-NEXT: <#statements#>
71   // CHECK-CC1-NEXT: }
72   // CHECK-CC1: COMPLETION: X : X
73   // CHECK-CC1-NEXT: COMPLETION: y : [#int#]y
74   // CHECK-CC1-NEXT: COMPLETION: z : [#void#]z(<#int#>)
75 
76   // RUN: %clang_cc1 -fsyntax-only  -code-completion-patterns -code-completion-at=%s:4:1 -std=gnu++11 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
77   // CHECK-CC2: COMPLETION: Pattern : asm(<#string-literal#>)
78   // CHECK-CC2: COMPLETION: auto
79   // CHECK-CC2-NEXT: COMPLETION: bool
80   // CHECK-CC2-NEXT: COMPLETION: char
81   // CHECK-CC2-NEXT: COMPLETION: char16
82   // CHECK-CC2-NEXT: COMPLETION: char32
83   // CHECK-CC2-NEXT: COMPLETION: class
84   // CHECK-CC2-NEXT: COMPLETION: const
85   // CHECK-CC2-NEXT: COMPLETION: constexpr
86   // CHECK-CC2-NEXT: COMPLETION: Pattern : decltype(<#expression#>)
87   // CHECK-CC2-NEXT: COMPLETION: double
88   // CHECK-CC2-NEXT: COMPLETION: enum
89   // CHECK-CC2-NEXT: COMPLETION: extern
90   // CHECK-CC2-NEXT: COMPLETION: float
91   // CHECK-CC2-NEXT: COMPLETION: inline
92   // CHECK-CC2-NEXT: COMPLETION: int
93   // CHECK-CC2-NEXT: COMPLETION: long
94   // CHECK-CC2-NEXT: COMPLETION: Pattern : namespace <#identifier#> {
95   // CHECK-CC2-NEXT: <#declarations#>
96   // CHECK-CC2-NEXT: }
97   // CHECK-CC2: COMPLETION: Pattern : namespace <#name#> = <#namespace#>;
98   // CHECK-CC2-NEXT: COMPLETION: operator
99   // CHECK-CC2-NEXT: COMPLETION: short
100   // CHECK-CC2-NEXT: COMPLETION: signed
101   // CHECK-CC2-NEXT: COMPLETION: static
102   // CHECK-CC2-NEXT: COMPLETION: Pattern : static_assert(<#expression#>, <#message#>);
103   // CHECK-CC2-NEXT: COMPLETION: struct
104   // CHECK-CC2-NEXT: COMPLETION: t : t
105   // CHECK-CC2-NEXT: COMPLETION: Pattern : template <#declaration#>
106   // CHECK-CC2-NEXT: COMPLETION: Pattern : template<<#parameters#>>
107   // CHECK-CC2-NEXT: COMPLETION: thread_local
108   // CHECK-CC2-NEXT: COMPLETION: TYPEDEF : TYPEDEF
109   // CHECK-CC2-NEXT: COMPLETION: Pattern : typedef <#type#> <#name#>;
110   // CHECK-CC2-NEXT: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
111   // CHECK-CC2-NEXT: COMPLETION: Pattern : typeof <#expression#>
112   // CHECK-CC2-NEXT: COMPLETION: Pattern : typeof(<#type#>)
113   // CHECK-CC2-NEXT: COMPLETION: union
114   // CHECK-CC2-NEXT: COMPLETION: unsigned
115   // CHECK-CC2-NEXT: COMPLETION: Pattern : using <#qualifier#>::<#name#>;
116   // CHECK-CC2-NEXT: COMPLETION: Pattern : using namespace <#identifier#>;
117   // CHECK-CC2-NEXT: COMPLETION: void
118   // CHECK-CC2-NEXT: COMPLETION: volatile
119   // CHECK-CC2-NEXT: COMPLETION: wchar_t
120   // CHECK-CC2-NEXT: COMPLETION: X : X
121 
122   // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:1:19 -std=gnu++11 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s
123   // CHECK-CC3: COMPLETION: bool
124   // CHECK-CC3-NEXT: COMPLETION: char
125   // CHECK-CC3-NEXT: COMPLETION: char16_t
126   // CHECK-CC3-NEXT: COMPLETION: char32_t
127   // CHECK-CC3-NEXT: COMPLETION: class
128   // CHECK-CC3-NEXT: COMPLETION: const
129   // CHECK-CC3-NEXT: COMPLETION: constexpr
130   // CHECK-CC3-NEXT: COMPLETION: Pattern : decltype(<#expression#>)
131   // CHECK-CC3-NEXT: COMPLETION: double
132   // CHECK-CC3-NEXT: COMPLETION: enum
133   // CHECK-CC3-NEXT: COMPLETION: explicit
134   // CHECK-CC3-NEXT: COMPLETION: extern
135   // CHECK-CC3-NEXT: COMPLETION: float
136   // CHECK-CC3-NEXT: COMPLETION: friend
137   // CHECK-CC3-NEXT: COMPLETION: inline
138   // CHECK-CC3-NEXT: COMPLETION: int
139   // CHECK-CC3-NEXT: COMPLETION: long
140   // CHECK-CC3-NEXT: COMPLETION: mutable
141   // CHECK-CC3-NEXT: COMPLETION: operator
142   // CHECK-CC3-NEXT: COMPLETION: Pattern : private:
143   // CHECK-CC3-NEXT: COMPLETION: Pattern : protected:
144   // CHECK-CC3-NEXT: COMPLETION: Pattern : public:
145   // CHECK-CC3-NEXT: COMPLETION: short
146   // CHECK-CC3-NEXT: COMPLETION: signed
147   // CHECK-CC3-NEXT: COMPLETION: static
148   // CHECK-CC3-NEXT: COMPLETION: Pattern : static_assert(<#expression#>, <#message#>);
149   // CHECK-CC3-NEXT: COMPLETION: struct
150   // CHECK-CC3-NEXT: COMPLETION: Pattern : template<<#parameters#>>
151   // CHECK-CC3-NEXT: COMPLETION: thread_local
152   // CHECK-CC3-NEXT: COMPLETION: Pattern : typedef <#type#> <#name#>;
153   // CHECK-CC3-NEXT: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
154   // CHECK-CC3-NEXT: COMPLETION: Pattern : typeof <#expression#>
155   // CHECK-CC3-NEXT: COMPLETION: Pattern : typeof(<#type#>)
156   // CHECK-CC3-NEXT: COMPLETION: union
157   // CHECK-CC3-NEXT: COMPLETION: unsigned
158   // CHECK-CC3-NEXT: COMPLETION: Pattern : using <#qualifier#>::<#name#>
159   // CHECK-CC3-NEXT: COMPLETION: virtual
160   // CHECK-CC3-NEXT: COMPLETION: void
161   // CHECK-CC3-NEXT: COMPLETION: volatile
162   // CHECK-CC3-NEXT: COMPLETION: wchar_t
163   // CHECK-CC3-NEXT: COMPLETION: X : X
164 
165   // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -code-completion-patterns -code-completion-at=%s:6:11 -std=gnu++11 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s
166   // CHECK-CC4: COMPLETION: bool
167   // CHECK-CC4-NEXT: COMPLETION: char
168   // CHECK-CC4-NEXT: COMPLETION: char16_t
169   // CHECK-CC4-NEXT: COMPLETION: char32_t
170   // CHECK-CC4-NEXT: COMPLETION: class
171   // CHECK-CC4-NEXT: COMPLETION: const
172   // CHECK-CC4-NEXT: COMPLETION: Pattern : const_cast<<#type#>>(<#expression#>)
173   // CHECK-CC4-NEXT: COMPLETION: Pattern : decltype(<#expression#>)
174   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#void#]delete <#expression#>
175   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#void#]delete [] <#expression#>
176   // CHECK-CC4-NEXT: COMPLETION: double
177   // CHECK-CC4-NEXT: COMPLETION: Pattern : dynamic_cast<<#type#>>(<#expression#>)
178   // CHECK-CC4-NEXT: COMPLETION: enum
179   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#bool#]false
180   // CHECK-CC4-NEXT: COMPLETION: float
181   // CHECK-CC4-NEXT: COMPLETION: foo : [#void#]foo()
182   // CHECK-CC4-NEXT: COMPLETION: int
183   // CHECK-CC4-NEXT: COMPLETION: long
184   // CHECK-CC4-NEXT: COMPLETION: Pattern : new <#type#>(<#expressions#>)
185   // CHECK-CC4-NEXT: COMPLETION: Pattern : new <#type#>[<#size#>](<#expressions#>)
186   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#bool#]noexcept(<#expression#>)
187   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#std::nullptr_t#]nullptr
188   // CHECK-CC4-NEXT: COMPLETION: operator
189   // CHECK-CC4-NEXT: COMPLETION: Pattern : reinterpret_cast<<#type#>>(<#expression#>)
190   // CHECK-CC4-NEXT: COMPLETION: short
191   // CHECK-CC4-NEXT: COMPLETION: signed
192   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#size_t#]sizeof(<#expression-or-type#>)
193   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#size_t#]sizeof...(<#parameter-pack#>)
194   // CHECK-CC4-NEXT: COMPLETION: Pattern : static_cast<<#type#>>(<#expression#>)
195   // CHECK-CC4-NEXT: COMPLETION: struct
196   // CHECK-CC4-NEXT: COMPLETION: t : t
197   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#void#]throw <#expression#>
198   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#bool#]true
199   // CHECK-CC4-NEXT: COMPLETION: TYPEDEF : TYPEDEF
200   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#std::type_info#]typeid(<#expression-or-type#>)
201   // CHECK-CC4-NEXT: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
202   // CHECK-CC4-NEXT: COMPLETION: Pattern : typeof <#expression#>
203   // CHECK-CC4-NEXT: COMPLETION: Pattern : typeof(<#type#>)
204   // CHECK-CC4-NEXT: COMPLETION: union
205   // CHECK-CC4-NEXT: COMPLETION: unsigned
206   // CHECK-CC4-NEXT: COMPLETION: void
207   // CHECK-CC4-NEXT: COMPLETION: volatile
208   // CHECK-CC4-NEXT: COMPLETION: wchar_t
209   // CHECK-CC4-NEXT: COMPLETION: X : X
210   // CHECK-CC4-NEXT: COMPLETION: z : [#void#]z(<#int#>)
211 
212   // RUN: %clang_cc1 -fsyntax-only -fno-rtti -code-completion-patterns -code-completion-at=%s:6:14 -std=gnu++11 %s -o - | FileCheck -check-prefix=CHECK-NO-RTTI %s
213   // CHECK-NO-RTTI: COMPLETION: bool
214   // CHECK-NO-RTTI-NEXT: COMPLETION: char
215   // CHECK-NO-RTTI-NEXT: COMPLETION: char16_t
216   // CHECK-NO-RTTI-NEXT: COMPLETION: char32_t
217   // CHECK-NO-RTTI-NEXT: COMPLETION: class
218   // CHECK-NO-RTTI-NEXT: COMPLETION: const
219   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : const_cast<<#type#>>(<#expression#>)
220   // CHECK-NO-RTTI: COMPLETION: Pattern : [#void#]delete <#expression#>
221   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#void#]delete [] <#expression#>
222   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : do {
223   // CHECK-NO-RTTI-NEXT: <#statements#>
224   // CHECK-NO-RTTI-NEXT: }
225   // CHECK-NO-RTTI: COMPLETION: double
226   // CHECK-NO-RTTI-NOT: dynamic_cast
227   // CHECK-NO-RTTI: COMPLETION: enum
228   // CHECK-NO-RTTI-NEXT: COMPLETION: extern
229   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#bool#]false
230   // CHECK-NO-RTTI-NEXT: COMPLETION: float
231   // CHECK-NO-RTTI-NEXT: COMPLETION: foo : [#void#]foo()
232   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : for (<#init-statement#>; <#condition#>; <#inc-expression#>) {
233   // CHECK-NO-RTTI: COMPLETION: Pattern : goto <#label#>;
234   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : if (<#condition#>) {
235   // CHECK-NO-RTTI-NEXT: <#statements#>
236   // CHECK-NO-RTTI-NEXT: }
237   // CHECK-NO-RTTI: COMPLETION: int
238   // CHECK-NO-RTTI-NEXT: COMPLETION: long
239   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : new <#type#>(<#expressions#>)
240   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : new <#type#>[<#size#>](<#expressions#>)
241   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#bool#]noexcept(<#expression#>)
242   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#std::nullptr_t#]nullptr
243   // CHECK-NO-RTTI-NEXT: COMPLETION: operator
244   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : reinterpret_cast<<#type#>>(<#expression#>)
245   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : return;
246   // CHECK-NO-RTTI-NEXT: COMPLETION: short
247   // CHECK-NO-RTTI-NEXT: COMPLETION: signed
248   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#size_t#]sizeof(<#expression-or-type#>)
249   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#size_t#]sizeof...(<#parameter-pack#>)
250   // CHECK-NO-RTTI-NEXT: COMPLETION: static
251   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : static_assert(<#expression#>, <#message#>);
252   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : static_cast<<#type#>>(<#expression#>)
253   // CHECK-NO-RTTI-NEXT: COMPLETION: struct
254   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : switch (<#condition#>) {
255   // CHECK-NO-RTTI: COMPLETION: t : t
256   // CHECK-NO-RTTI-NOT: throw
257   // CHECK-NO-RTTI: COMPLETION: Pattern : [#bool#]true
258   // CHECK-NO-RTTI-NOT: try
259   // CHECK-NO-RTTI: COMPLETION: TYPEDEF : TYPEDEF
260   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typedef <#type#> <#name#>;
261   // CHECK-NO-RTTI-NOT: typeid
262   // CHECK-NO-RTTI: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
263   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typeof <#expression#>
264   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typeof(<#type#>)
265   // CHECK-NO-RTTI-NEXT: COMPLETION: union
266   // CHECK-NO-RTTI-NEXT: COMPLETION: unsigned
267   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : using namespace <#identifier#>;
268   // CHECK-NO-RTTI-NEXT: COMPLETION: void
269   // CHECK-NO-RTTI-NEXT: COMPLETION: volatile
270   // CHECK-NO-RTTI-NEXT: COMPLETION: wchar_t
271   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : while (<#condition#>) {
272   // CHECK-NO-RTTI: COMPLETION: X : X
273   // CHECK-NO-RTTI-NEXT: COMPLETION: y : [#int#]y
274   // CHECK-NO-RTTI-NEXT: COMPLETION: z : [#void#]z(<#int#>)
275