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