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++98 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
8   // CHECK-CC1: COMPLETION: bool
9   // CHECK-CC1-NEXT: COMPLETION: char
10   // CHECK-CC1-NEXT: COMPLETION: class
11   // CHECK-CC1-NEXT: COMPLETION: const
12   // CHECK-CC1-NEXT: COMPLETION: Pattern : const_cast<<#type#>>(<#expression#>)
13   // CHECK-CC1: COMPLETION: Pattern : [#void#]delete <#expression#>
14   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#void#]delete [] <#expression#>
15   // CHECK-CC1-NEXT: COMPLETION: Pattern : do {
16   // CHECK-CC1-NEXT: <#statements#>
17   // CHECK-CC1-NEXT: }
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-NEXT: <#statements#>{{$}}
27   // CHECK-CC1-NEXT: }
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: operator
37   // CHECK-CC1-NEXT: COMPLETION: Pattern : reinterpret_cast<<#type#>>(<#expression#>)
38   // CHECK-CC1-NEXT: COMPLETION: Pattern : return;
39   // CHECK-CC1-NEXT: COMPLETION: short
40   // CHECK-CC1-NEXT: COMPLETION: signed
41   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#size_t#]sizeof(<#expression-or-type#>)
42   // CHECK-CC1-NEXT: COMPLETION: static
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: Pattern : [#void#]throw <#expression#>
48   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#bool#]true
49   // CHECK-CC1-NEXT: COMPLETION: Pattern : try {
50   // CHECK-CC1-NEXT: <#statements#>
51   // CHECK-CC1-NEXT: } catch (<#declaration#>) {
52   // CHECK-CC1-NEXT: <#statements#>
53   // CHECK-CC1-NEXT: }
54   // CHECK-CC1: COMPLETION: TYPEDEF : TYPEDEF
55   // CHECK-CC1-NEXT: COMPLETION: Pattern : typedef <#type#> <#name#>;
56   // CHECK-CC1-NEXT: COMPLETION: Pattern : [#std::type_info#]typeid(<#expression-or-type#>)
57   // CHECK-CC1-NEXT: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
58   // CHECK-CC1-NEXT: COMPLETION: Pattern : typeof <#expression#>
59   // CHECK-CC1-NEXT: COMPLETION: Pattern : typeof(<#type#>)
60   // CHECK-CC1-NEXT: COMPLETION: union
61   // CHECK-CC1-NEXT: COMPLETION: unsigned
62   // CHECK-CC1-NEXT: COMPLETION: Pattern : using namespace <#identifier#>;
63   // CHECK-CC1-NEXT: COMPLETION: void
64   // CHECK-CC1-NEXT: COMPLETION: volatile
65   // CHECK-CC1-NEXT: COMPLETION: wchar_t
66   // CHECK-CC1-NEXT: COMPLETION: Pattern : while (<#condition#>) {
67   // CHECK-CC1-NEXT: <#statements#>
68   // CHECK-CC1-NEXT: }
69   // CHECK-CC1: COMPLETION: X : X
70   // CHECK-CC1-NEXT: COMPLETION: y : [#int#]y
71   // CHECK-CC1-NEXT: COMPLETION: z : [#void#]z(<#int#>)
72 
73   // RUN: %clang_cc1 -fsyntax-only  -code-completion-patterns -code-completion-at=%s:4:1 -std=gnu++98 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
74   // CHECK-CC2: COMPLETION: Pattern : asm(<#string-literal#>)
75   // CHECK-CC2-NEXT: COMPLETION: bool
76   // CHECK-CC2-NEXT: COMPLETION: char
77   // CHECK-CC2-NEXT: COMPLETION: class
78   // CHECK-CC2-NEXT: COMPLETION: const
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#> {
87   // CHECK-CC2-NEXT: <#declarations#>
88   // CHECK-CC2-NEXT: }
89   // CHECK-CC2: COMPLETION: Pattern : namespace <#name#> = <#namespace#>;
90   // CHECK-CC2-NEXT: COMPLETION: operator
91   // CHECK-CC2-NEXT: COMPLETION: short
92   // CHECK-CC2-NEXT: COMPLETION: signed
93   // CHECK-CC2-NEXT: COMPLETION: static
94   // CHECK-CC2-NEXT: COMPLETION: struct
95   // CHECK-CC2-NEXT: COMPLETION: t : t
96   // CHECK-CC2-NEXT: COMPLETION: Pattern : template <#declaration#>
97   // CHECK-CC2-NEXT: COMPLETION: Pattern : template<<#parameters#>>
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 <#qualifier#>::<#name#>;
106   // CHECK-CC2-NEXT: COMPLETION: Pattern : using namespace <#identifier#>;
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++98 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s
113   // CHECK-CC3: COMPLETION: bool
114   // CHECK-CC3-NEXT: COMPLETION: char
115   // CHECK-CC3-NEXT: COMPLETION: class
116   // CHECK-CC3-NEXT: COMPLETION: const
117   // CHECK-CC3-NEXT: COMPLETION: double
118   // CHECK-CC3-NEXT: COMPLETION: enum
119   // CHECK-CC3-NEXT: COMPLETION: explicit
120   // CHECK-CC3-NEXT: COMPLETION: extern
121   // CHECK-CC3-NEXT: COMPLETION: float
122   // CHECK-CC3-NEXT: COMPLETION: friend
123   // CHECK-CC3-NEXT: COMPLETION: inline
124   // CHECK-CC3-NEXT: COMPLETION: int
125   // CHECK-CC3-NEXT: COMPLETION: long
126   // CHECK-CC3-NEXT: COMPLETION: mutable
127   // CHECK-CC3-NEXT: COMPLETION: operator
128   // CHECK-CC3-NEXT: COMPLETION: Pattern : private:
129   // CHECK-CC3-NEXT: COMPLETION: Pattern : protected:
130   // CHECK-CC3-NEXT: COMPLETION: Pattern : public:
131   // CHECK-CC3-NEXT: COMPLETION: short
132   // CHECK-CC3-NEXT: COMPLETION: signed
133   // CHECK-CC3-NEXT: COMPLETION: static
134   // CHECK-CC3-NEXT: COMPLETION: struct
135   // CHECK-CC3-NEXT: COMPLETION: Pattern : template<<#parameters#>>
136   // CHECK-CC3-NEXT: COMPLETION: Pattern : typedef <#type#> <#name#>;
137   // CHECK-CC3-NEXT: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
138   // CHECK-CC3-NEXT: COMPLETION: Pattern : typeof <#expression#>
139   // CHECK-CC3-NEXT: COMPLETION: Pattern : typeof(<#type#>)
140   // CHECK-CC3-NEXT: COMPLETION: union
141   // CHECK-CC3-NEXT: COMPLETION: unsigned
142   // CHECK-CC3-NEXT: COMPLETION: Pattern : using <#qualifier#>::<#name#>;
143   // CHECK-CC3-NEXT: COMPLETION: virtual
144   // CHECK-CC3-NEXT: COMPLETION: void
145   // CHECK-CC3-NEXT: COMPLETION: volatile
146   // CHECK-CC3-NEXT: COMPLETION: wchar_t
147   // CHECK-CC3-NEXT: COMPLETION: X : X
148 
149   // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -code-completion-patterns -code-completion-at=%s:6:11 -std=gnu++98 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s
150   // CHECK-CC4: COMPLETION: bool
151   // CHECK-CC4-NEXT: COMPLETION: char
152   // CHECK-CC4-NEXT: COMPLETION: class
153   // CHECK-CC4-NEXT: COMPLETION: const
154   // CHECK-CC4-NEXT: COMPLETION: Pattern : const_cast<<#type#>>(<#expression#>)
155   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#void#]delete <#expression#>
156   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#void#]delete [] <#expression#>
157   // CHECK-CC4-NEXT: COMPLETION: double
158   // CHECK-CC4-NEXT: COMPLETION: Pattern : dynamic_cast<<#type#>>(<#expression#>)
159   // CHECK-CC4-NEXT: COMPLETION: enum
160   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#bool#]false
161   // CHECK-CC4-NEXT: COMPLETION: float
162   // CHECK-CC4-NEXT: COMPLETION: foo : [#void#]foo()
163   // CHECK-CC4-NEXT: COMPLETION: int
164   // CHECK-CC4-NEXT: COMPLETION: long
165   // CHECK-CC4-NEXT: COMPLETION: Pattern : new <#type#>(<#expressions#>)
166   // CHECK-CC4-NEXT: COMPLETION: Pattern : new <#type#>[<#size#>](<#expressions#>)
167   // CHECK-CC4-NEXT: COMPLETION: operator
168   // CHECK-CC4-NEXT: COMPLETION: Pattern : reinterpret_cast<<#type#>>(<#expression#>)
169   // CHECK-CC4-NEXT: COMPLETION: short
170   // CHECK-CC4-NEXT: COMPLETION: signed
171   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#size_t#]sizeof(<#expression-or-type#>)
172   // CHECK-CC4-NEXT: COMPLETION: Pattern : static_cast<<#type#>>(<#expression#>)
173   // CHECK-CC4-NEXT: COMPLETION: struct
174   // CHECK-CC4-NEXT: COMPLETION: t : t
175   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#void#]throw <#expression#>
176   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#bool#]true
177   // CHECK-CC4-NEXT: COMPLETION: TYPEDEF : TYPEDEF
178   // CHECK-CC4-NEXT: COMPLETION: Pattern : [#std::type_info#]typeid(<#expression-or-type#>)
179   // CHECK-CC4-NEXT: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
180   // CHECK-CC4-NEXT: COMPLETION: Pattern : typeof <#expression#>
181   // CHECK-CC4-NEXT: COMPLETION: Pattern : typeof(<#type#>)
182   // CHECK-CC4-NEXT: COMPLETION: union
183   // CHECK-CC4-NEXT: COMPLETION: unsigned
184   // CHECK-CC4-NEXT: COMPLETION: void
185   // CHECK-CC4-NEXT: COMPLETION: volatile
186   // CHECK-CC4-NEXT: COMPLETION: wchar_t
187   // CHECK-CC4-NEXT: COMPLETION: X : X
188   // CHECK-CC4-NEXT: COMPLETION: z : [#void#]z(<#int#>)
189 
190   // RUN: %clang_cc1 -fsyntax-only -fno-rtti -code-completion-patterns -code-completion-at=%s:6:14 -std=gnu++98 %s -o - | FileCheck -check-prefix=CHECK-NO-RTTI %s
191   // CHECK-NO-RTTI: COMPLETION: bool
192   // CHECK-NO-RTTI-NEXT: COMPLETION: char
193   // CHECK-NO-RTTI-NEXT: COMPLETION: class
194   // CHECK-NO-RTTI-NEXT: COMPLETION: const
195   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : const_cast<<#type#>>(<#expression#>)
196   // CHECK-NO-RTTI: COMPLETION: Pattern : [#void#]delete <#expression#>
197   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#void#]delete [] <#expression#>
198   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : do {
199   // CHECK-NO-RTTI: COMPLETION: double
200   // CHECK-NO-RTTI-NOT: dynamic_cast
201   // CHECK-NO-RTTI: COMPLETION: enum
202   // CHECK-NO-RTTI-NEXT: COMPLETION: extern
203   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#bool#]false
204   // CHECK-NO-RTTI-NEXT: COMPLETION: float
205   // CHECK-NO-RTTI-NEXT: COMPLETION: foo : [#void#]foo()
206   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : for (<#init-statement#>; <#condition#>; <#inc-expression#>) {
207   // CHECK-NO-RTTI: COMPLETION: Pattern : goto <#label#>;
208   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : if (<#condition#>) {
209   // CHECK-NO-RTTI: COMPLETION: int
210   // CHECK-NO-RTTI-NEXT: COMPLETION: long
211   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : new <#type#>(<#expressions#>)
212   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : new <#type#>[<#size#>](<#expressions#>)
213   // CHECK-NO-RTTI-NEXT: COMPLETION: operator
214   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : reinterpret_cast<<#type#>>(<#expression#>)
215   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : return;
216   // CHECK-NO-RTTI-NEXT: COMPLETION: short
217   // CHECK-NO-RTTI-NEXT: COMPLETION: signed
218   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : [#size_t#]sizeof(<#expression-or-type#>)
219   // CHECK-NO-RTTI-NEXT: COMPLETION: static
220   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : static_cast<<#type#>>(<#expression#>)
221   // CHECK-NO-RTTI-NEXT: COMPLETION: struct
222   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : switch (<#condition#>) {
223   // CHECK-NO-RTTI: COMPLETION: t : t
224   // CHECK-NO-RTTI-NOT: throw
225   // CHECK-NO-RTTI: COMPLETION: Pattern : [#bool#]true
226   // CHECK-NO-RTTI-NOT: try
227   // CHECK-NO-RTTI: COMPLETION: TYPEDEF : TYPEDEF
228   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typedef <#type#> <#name#>;
229   // CHECK-NO-RTTI-NOT: typeid
230   // CHECK-NO-RTTI: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
231   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typeof <#expression#>
232   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typeof(<#type#>)
233   // CHECK-NO-RTTI-NEXT: COMPLETION: union
234   // CHECK-NO-RTTI-NEXT: COMPLETION: unsigned
235   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : using namespace <#identifier#>;
236   // CHECK-NO-RTTI-NEXT: COMPLETION: void
237   // CHECK-NO-RTTI-NEXT: COMPLETION: volatile
238   // CHECK-NO-RTTI-NEXT: COMPLETION: wchar_t
239   // CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : while (<#condition#>) {
240   // CHECK-NO-RTTI: COMPLETION: X : X
241   // CHECK-NO-RTTI-NEXT: COMPLETION: y : [#int#]y
242   // CHECK-NO-RTTI-NEXT: COMPLETION: z : [#void#]z(<#int#>)
243