blob: f5e5ca95282d493752da6e8a0ca7cfe0a0d55fcb [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
Anders Carlsson3a082d82009-09-08 18:24:21 +00002
Daniel Dunbar0a23d762009-09-12 23:06:21 +00003// CHECK: private constant [15 x i8] c"externFunction\00"
4// CHECK: private constant [26 x i8] c"void NS::externFunction()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +00005
Daniel Dunbar0a23d762009-09-12 23:06:21 +00006// CHECK: private constant [22 x i8] c"classTemplateFunction\00"
7// CHECK: private constant [60 x i8] c"void NS::ClassTemplate<NS::Base *>::classTemplateFunction()\00"
8// CHECK: private constant [53 x i8] c"void NS::ClassTemplate<int>::classTemplateFunction()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +00009
Daniel Dunbar0a23d762009-09-12 23:06:21 +000010// CHECK: private constant [18 x i8] c"functionTemplate1\00"
11// CHECK: private constant [45 x i8] c"void NS::Base::functionTemplate1(NS::Base *)\00"
12// CHECK: private constant [38 x i8] c"void NS::Base::functionTemplate1(int)\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000013
Sam Weinig6be11202009-12-24 23:15:03 +000014// CHECK: private constant [23 x i8] c"anonymousUnionFunction\00"
15// CHECK: private constant [83 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous union>::anonymousUnionFunction()\00"
16
17// CHECK: private constant [24 x i8] c"anonymousStructFunction\00"
18// CHECK: private constant [85 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous struct>::anonymousStructFunction()\00"
19
20// CHECK: private constant [23 x i8] c"anonymousClassFunction\00"
21// CHECK: private constant [83 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous class>::anonymousClassFunction()\00"
22
Daniel Dunbar0a23d762009-09-12 23:06:21 +000023// CHECK: private constant [12 x i8] c"~Destructor\00"
Sam Weinig3a1ce1e2009-12-06 23:55:13 +000024// CHECK: private constant [30 x i8] c"NS::Destructor::~Destructor()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000025
Daniel Dunbar0a23d762009-09-12 23:06:21 +000026// CHECK: private constant [12 x i8] c"Constructor\00"
Sam Weinig3a1ce1e2009-12-06 23:55:13 +000027// CHECK: private constant [41 x i8] c"NS::Constructor::Constructor(NS::Base *)\00"
28// CHECK: private constant [34 x i8] c"NS::Constructor::Constructor(int)\00"
29// CHECK: private constant [31 x i8] c"NS::Constructor::Constructor()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000030
Daniel Dunbar0a23d762009-09-12 23:06:21 +000031// CHECK: private constant [16 x i8] c"virtualFunction\00"
32// CHECK: private constant [44 x i8] c"virtual void NS::Derived::virtualFunction()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000033
Sam Weinig4eadcc52009-12-27 01:38:20 +000034// CHECK: private constant [22 x i8] c"constVolatileFunction\00"
35// CHECK: private constant [54 x i8] c"void NS::Base::constVolatileFunction() const volatile\00"
36
37// CHECK: private constant [17 x i8] c"volatileFunction\00"
38// CHECK: private constant [43 x i8] c"void NS::Base::volatileFunction() volatile\00"
39
40// CHECK: private constant [14 x i8] c"constFunction\00"
41// CHECK: private constant [37 x i8] c"void NS::Base::constFunction() const\00"
42
Daniel Dunbar0a23d762009-09-12 23:06:21 +000043// CHECK: private constant [26 x i8] c"functionReturingTemplate2\00"
44// CHECK: private constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000045
Daniel Dunbar0a23d762009-09-12 23:06:21 +000046// CHECK: private constant [26 x i8] c"functionReturingTemplate1\00"
47// CHECK: private constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000048
Daniel Dunbar0a23d762009-09-12 23:06:21 +000049// CHECK: private constant [23 x i8] c"withTemplateParameter2\00"
50// CHECK: private constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000051
Daniel Dunbar0a23d762009-09-12 23:06:21 +000052// CHECK: private constant [23 x i8] c"withTemplateParameter1\00"
53// CHECK: private constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000054
Daniel Dunbar0a23d762009-09-12 23:06:21 +000055// CHECK: private constant [23 x i8] c"functionReturningClass\00"
56// CHECK: private constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000057
Daniel Dunbar0a23d762009-09-12 23:06:21 +000058// CHECK: private constant [23 x i8] c"functionWithParameters\00"
59// CHECK: private constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000060
Daniel Dunbar0a23d762009-09-12 23:06:21 +000061// CHECK: private constant [17 x i8] c"variadicFunction\00"
62// CHECK: private constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000063
Daniel Dunbar0a23d762009-09-12 23:06:21 +000064// CHECK: private constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000065
Daniel Dunbar0a23d762009-09-12 23:06:21 +000066// CHECK: private constant [15 x i8] c"inlineFunction\00"
67// CHECK: private constant [32 x i8] c"void NS::Base::inlineFunction()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000068
Sam Weinig4eadcc52009-12-27 01:38:20 +000069// CHECK: private constant [15 x i8] c"staticFunction\00"
70// CHECK: private constant [39 x i8] c"static void NS::Base::staticFunction()\00"
Anders Carlsson3a082d82009-09-08 18:24:21 +000071
Sam Weinig6be11202009-12-24 23:15:03 +000072// CHECK: private constant [26 x i8] c"topLevelNamespaceFunction\00"
73// CHECK: private constant [59 x i8] c"void ClassInTopLevelNamespace::topLevelNamespaceFunction()\00"
74
75// CHECK: private constant [27 x i8] c"anonymousNamespaceFunction\00"
76// CHECK: private constant [84 x i8] c"void <anonymous namespace>::ClassInAnonymousNamespace::anonymousNamespaceFunction()\00"
77
Sam Weinig3521d012009-12-28 03:19:38 +000078// CHECK: private constant [19 x i8] c"localClassFunction\00"
79// CHECK: private constant [59 x i8] c"void NS::localClass(int)::LocalClass::localClassFunction()\00"
80
Mike Stump76bee4b2009-10-08 23:05:06 +000081int printf(const char * _Format, ...);
Anders Carlsson3a082d82009-09-08 18:24:21 +000082
Sam Weinig6be11202009-12-24 23:15:03 +000083class ClassInTopLevelNamespace {
84public:
85 void topLevelNamespaceFunction() {
86 printf("__func__ %s\n", __func__);
87 printf("__FUNCTION__ %s\n", __FUNCTION__);
88 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
89 }
90};
91
92namespace {
93
94 class ClassInAnonymousNamespace {
95 public:
96 void anonymousNamespaceFunction() {
97 printf("__func__ %s\n", __func__);
98 printf("__FUNCTION__ %s\n", __FUNCTION__);
99 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
100 }
101 };
102
103} // end anonymous namespace
104
Anders Carlsson3a082d82009-09-08 18:24:21 +0000105namespace NS {
106
107template<typename T>
108class ClassTemplate {
109public:
110 void classTemplateFunction() {
111 printf("__func__ %s\n", __func__);
112 printf("__FUNCTION__ %s\n", __FUNCTION__);
113 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
114 }
115};
116
117class Base {
118public:
Sam Weinig4eadcc52009-12-27 01:38:20 +0000119 static void staticFunction() {
Anders Carlsson3a082d82009-09-08 18:24:21 +0000120 printf("__func__ %s\n", __func__);
121 printf("__FUNCTION__ %s\n", __FUNCTION__);
122 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
123 }
124
125 inline void inlineFunction() {
126 printf("__func__ %s\n", __func__);
127 printf("__FUNCTION__ %s\n", __FUNCTION__);
128 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
129 }
130
131 virtual void virtualFunction() {
132 printf("__func__ %s\n", __func__);
133 printf("__FUNCTION__ %s\n", __FUNCTION__);
134 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
135 }
136
137 void functionWithParameters(int, float*, Base* base) {
138 printf("__func__ %s\n", __func__);
139 printf("__FUNCTION__ %s\n", __FUNCTION__);
140 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
141 }
142
143 Base *functionReturningClass() {
144 printf("__func__ %s\n", __func__);
145 printf("__FUNCTION__ %s\n", __FUNCTION__);
146 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
147 return 0;
148 }
149
150 void variadicFunction(int, ...) {
151 printf("__func__ %s\n", __func__);
152 printf("__FUNCTION__ %s\n", __FUNCTION__);
153 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
154 }
155
156 void withTemplateParameter1(ClassTemplate<int>) {
157 printf("__func__ %s\n", __func__);
158 printf("__FUNCTION__ %s\n", __FUNCTION__);
159 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
160 }
161
162 void withTemplateParameter2(ClassTemplate<Base *>) {
163 printf("__func__ %s\n", __func__);
164 printf("__FUNCTION__ %s\n", __FUNCTION__);
165 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
166 }
167
168 ClassTemplate<int> functionReturingTemplate1() {
169 printf("__func__ %s\n", __func__);
170 printf("__FUNCTION__ %s\n", __FUNCTION__);
171 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
172 return ClassTemplate<int>();
173 }
174
175 ClassTemplate<Base *> functionReturingTemplate2() {
176 printf("__func__ %s\n", __func__);
177 printf("__FUNCTION__ %s\n", __FUNCTION__);
178 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
179 return ClassTemplate<Base *>();
180 }
181
182 template<typename T>
183 void functionTemplate1(T t) {
184 printf("__func__ %s\n", __func__);
185 printf("__FUNCTION__ %s\n", __FUNCTION__);
186 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
187 }
Sam Weinig4eadcc52009-12-27 01:38:20 +0000188
189 void constFunction() const {
190 printf("__func__ %s\n", __func__);
191 printf("__FUNCTION__ %s\n", __FUNCTION__);
192 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
193 }
194
195 void volatileFunction() volatile {
196 printf("__func__ %s\n", __func__);
197 printf("__FUNCTION__ %s\n", __FUNCTION__);
198 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
199 }
200
201 void constVolatileFunction() const volatile {
202 printf("__func__ %s\n", __func__);
203 printf("__FUNCTION__ %s\n", __FUNCTION__);
204 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
205 }
Anders Carlsson3a082d82009-09-08 18:24:21 +0000206};
207
208class Derived : public Base {
209public:
210 // Virtual function without being explicitally written.
211 void virtualFunction() {
212 printf("__func__ %s\n", __func__);
213 printf("__FUNCTION__ %s\n", __FUNCTION__);
214 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
215 }
216};
217
218class Constructor {
219public:
220 Constructor() {
221 printf("__func__ %s\n", __func__);
222 printf("__FUNCTION__ %s\n", __FUNCTION__);
223 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
224 }
225
226 Constructor(int) {
227 printf("__func__ %s\n", __func__);
228 printf("__FUNCTION__ %s\n", __FUNCTION__);
229 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
230 }
231
232 Constructor(Base *) {
233 printf("__func__ %s\n", __func__);
234 printf("__FUNCTION__ %s\n", __FUNCTION__);
235 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
236 }
Anders Carlsson3a082d82009-09-08 18:24:21 +0000237};
238
239class Destructor {
240public:
241 ~Destructor() {
242 printf("__func__ %s\n", __func__);
243 printf("__FUNCTION__ %s\n", __FUNCTION__);
244 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
245 }
246};
247
Sam Weinig6be11202009-12-24 23:15:03 +0000248class ContainerForAnonymousRecords {
249public:
250 class {
251 public:
252 void anonymousClassFunction() {
253 printf("__func__ %s\n", __func__);
254 printf("__FUNCTION__ %s\n", __FUNCTION__);
255 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
256 }
257 } anonymousClass;
258
259 struct {
260 void anonymousStructFunction() {
261 printf("__func__ %s\n", __func__);
262 printf("__FUNCTION__ %s\n", __FUNCTION__);
263 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
264 }
265 } anonymousStruct;
266
267 union {
268 void anonymousUnionFunction() {
269 printf("__func__ %s\n", __func__);
270 printf("__FUNCTION__ %s\n", __FUNCTION__);
271 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
272 }
273 } anonymousUnion;
274};
275
Sam Weinig3521d012009-12-28 03:19:38 +0000276void localClass(int) {
277 class LocalClass {
278 public:
279 void localClassFunction() {
280 printf("__func__ %s\n", __func__);
281 printf("__FUNCTION__ %s\n", __FUNCTION__);
282 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
283 }
284 };
285 LocalClass lc;
286 lc.localClassFunction();
287}
288
Anders Carlsson3a082d82009-09-08 18:24:21 +0000289extern void externFunction() {
290 printf("__func__ %s\n", __func__);
291 printf("__FUNCTION__ %s\n", __FUNCTION__);
292 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
293}
294
Sam Weinig6be11202009-12-24 23:15:03 +0000295} // end NS namespace
Anders Carlsson3a082d82009-09-08 18:24:21 +0000296
297int main() {
Sam Weinig6be11202009-12-24 23:15:03 +0000298 ClassInAnonymousNamespace anonymousNamespace;
299 anonymousNamespace.anonymousNamespaceFunction();
Anders Carlsson3a082d82009-09-08 18:24:21 +0000300
Sam Weinig6be11202009-12-24 23:15:03 +0000301 ClassInTopLevelNamespace topLevelNamespace;
302 topLevelNamespace.topLevelNamespaceFunction();
303
Sam Weinig4eadcc52009-12-27 01:38:20 +0000304 NS::Base::staticFunction();
Sam Weinig6be11202009-12-24 23:15:03 +0000305
Anders Carlsson3a082d82009-09-08 18:24:21 +0000306 NS::Base b;
307 b.inlineFunction();
308 b.virtualFunction();
309 b.variadicFunction(0);
310 b.functionWithParameters(0, 0, 0);
311 b.functionReturningClass();
312
313 b.withTemplateParameter1(NS::ClassTemplate<int>());
314 b.withTemplateParameter2(NS::ClassTemplate<NS::Base *>());
315 b.functionReturingTemplate1();
316 b.functionReturingTemplate2();
317 b.functionTemplate1<int>(0);
318 b.functionTemplate1<NS::Base *>(0);
Sam Weinig4eadcc52009-12-27 01:38:20 +0000319 b.constFunction();
320 b.volatileFunction();
321 b.constVolatileFunction();
322
Anders Carlsson3a082d82009-09-08 18:24:21 +0000323 NS::Derived d;
324 d.virtualFunction();
325
326 NS::ClassTemplate<int> t1;
327 t1.classTemplateFunction();
328 NS::ClassTemplate<NS::Base *> t2;
329 t2.classTemplateFunction();
330
331 NS::Constructor c1;
332 NS::Constructor c2(0);
333 NS::Constructor c3((NS::Base *)0);
334
335 {
336 NS::Destructor destructor;
337 }
Sam Weinig6be11202009-12-24 23:15:03 +0000338
339 NS::ContainerForAnonymousRecords anonymous;
340 anonymous.anonymousClass.anonymousClassFunction();
341 anonymous.anonymousStruct.anonymousStructFunction();
342 anonymous.anonymousUnion.anonymousUnionFunction();
343
Sam Weinig3521d012009-12-28 03:19:38 +0000344 NS::localClass(0);
345
Anders Carlsson3a082d82009-09-08 18:24:21 +0000346 NS::externFunction();
Sam Weinig6be11202009-12-24 23:15:03 +0000347
Anders Carlsson3a082d82009-09-08 18:24:21 +0000348 return 0;
349}