blob: 92abcabbca05caeb479e216aef12b1c159b5da6b [file] [log] [blame]
Daniel Dunbar8fbe78f2009-12-15 20:14:24 +00001// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
Anders Carlsson2fb08242009-09-08 18:24:21 +00002
Daniel Dunbar0482cfd2009-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 Carlsson2fb08242009-09-08 18:24:21 +00005
Daniel Dunbar0482cfd2009-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 Carlsson2fb08242009-09-08 18:24:21 +00009
Daniel Dunbar0482cfd2009-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 Carlsson2fb08242009-09-08 18:24:21 +000013
Sam Weinig07d211e2009-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 Dunbar0482cfd2009-09-12 23:06:21 +000023// CHECK: private constant [12 x i8] c"~Destructor\00"
Sam Weinigd060ed42009-12-06 23:55:13 +000024// CHECK: private constant [30 x i8] c"NS::Destructor::~Destructor()\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000025
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000026// CHECK: private constant [12 x i8] c"Constructor\00"
Sam Weinigd060ed42009-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 Carlsson2fb08242009-09-08 18:24:21 +000030
Daniel Dunbar0482cfd2009-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 Carlsson2fb08242009-09-08 18:24:21 +000033
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000034// CHECK: private constant [26 x i8] c"functionReturingTemplate2\00"
35// CHECK: private constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000036
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000037// CHECK: private constant [26 x i8] c"functionReturingTemplate1\00"
38// CHECK: private constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000039
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000040// CHECK: private constant [23 x i8] c"withTemplateParameter2\00"
41// CHECK: private constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000042
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000043// CHECK: private constant [23 x i8] c"withTemplateParameter1\00"
44// CHECK: private constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000045
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000046// CHECK: private constant [23 x i8] c"functionReturningClass\00"
47// CHECK: private constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000048
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000049// CHECK: private constant [23 x i8] c"functionWithParameters\00"
50// CHECK: private constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000051
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000052// CHECK: private constant [17 x i8] c"variadicFunction\00"
53// CHECK: private constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000054
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000055// CHECK: private constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000056
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000057// CHECK: private constant [15 x i8] c"inlineFunction\00"
58// CHECK: private constant [32 x i8] c"void NS::Base::inlineFunction()\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000059
Daniel Dunbar0482cfd2009-09-12 23:06:21 +000060// CHECK: private constant [11 x i8] c"staticFunc\00"
61// CHECK: private constant [28 x i8] c"void NS::Base::staticFunc()\00"
Anders Carlsson2fb08242009-09-08 18:24:21 +000062
Sam Weinig07d211e2009-12-24 23:15:03 +000063// CHECK: private constant [26 x i8] c"topLevelNamespaceFunction\00"
64// CHECK: private constant [59 x i8] c"void ClassInTopLevelNamespace::topLevelNamespaceFunction()\00"
65
66// CHECK: private constant [27 x i8] c"anonymousNamespaceFunction\00"
67// CHECK: private constant [84 x i8] c"void <anonymous namespace>::ClassInAnonymousNamespace::anonymousNamespaceFunction()\00"
68
Mike Stumpf8c1f0d2009-10-08 23:05:06 +000069int printf(const char * _Format, ...);
Anders Carlsson2fb08242009-09-08 18:24:21 +000070
Sam Weinig07d211e2009-12-24 23:15:03 +000071class ClassInTopLevelNamespace {
72public:
73 void topLevelNamespaceFunction() {
74 printf("__func__ %s\n", __func__);
75 printf("__FUNCTION__ %s\n", __FUNCTION__);
76 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
77 }
78};
79
80namespace {
81
82 class ClassInAnonymousNamespace {
83 public:
84 void anonymousNamespaceFunction() {
85 printf("__func__ %s\n", __func__);
86 printf("__FUNCTION__ %s\n", __FUNCTION__);
87 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
88 }
89 };
90
91} // end anonymous namespace
92
Anders Carlsson2fb08242009-09-08 18:24:21 +000093namespace NS {
94
95template<typename T>
96class ClassTemplate {
97public:
98 void classTemplateFunction() {
99 printf("__func__ %s\n", __func__);
100 printf("__FUNCTION__ %s\n", __FUNCTION__);
101 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
102 }
103};
104
105class Base {
106public:
107 static void staticFunc() {
108 printf("__func__ %s\n", __func__);
109 printf("__FUNCTION__ %s\n", __FUNCTION__);
110 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
111 }
112
113 inline void inlineFunction() {
114 printf("__func__ %s\n", __func__);
115 printf("__FUNCTION__ %s\n", __FUNCTION__);
116 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
117 }
118
119 virtual void virtualFunction() {
120 printf("__func__ %s\n", __func__);
121 printf("__FUNCTION__ %s\n", __FUNCTION__);
122 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
123 }
124
125 void functionWithParameters(int, float*, Base* base) {
126 printf("__func__ %s\n", __func__);
127 printf("__FUNCTION__ %s\n", __FUNCTION__);
128 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
129 }
130
131 Base *functionReturningClass() {
132 printf("__func__ %s\n", __func__);
133 printf("__FUNCTION__ %s\n", __FUNCTION__);
134 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
135 return 0;
136 }
137
138 void variadicFunction(int, ...) {
139 printf("__func__ %s\n", __func__);
140 printf("__FUNCTION__ %s\n", __FUNCTION__);
141 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
142 }
143
144 void withTemplateParameter1(ClassTemplate<int>) {
145 printf("__func__ %s\n", __func__);
146 printf("__FUNCTION__ %s\n", __FUNCTION__);
147 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
148 }
149
150 void withTemplateParameter2(ClassTemplate<Base *>) {
151 printf("__func__ %s\n", __func__);
152 printf("__FUNCTION__ %s\n", __FUNCTION__);
153 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
154 }
155
156 ClassTemplate<int> functionReturingTemplate1() {
157 printf("__func__ %s\n", __func__);
158 printf("__FUNCTION__ %s\n", __FUNCTION__);
159 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
160 return ClassTemplate<int>();
161 }
162
163 ClassTemplate<Base *> functionReturingTemplate2() {
164 printf("__func__ %s\n", __func__);
165 printf("__FUNCTION__ %s\n", __FUNCTION__);
166 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
167 return ClassTemplate<Base *>();
168 }
169
170 template<typename T>
171 void functionTemplate1(T t) {
172 printf("__func__ %s\n", __func__);
173 printf("__FUNCTION__ %s\n", __FUNCTION__);
174 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
175 }
176};
177
178class Derived : public Base {
179public:
180 // Virtual function without being explicitally written.
181 void virtualFunction() {
182 printf("__func__ %s\n", __func__);
183 printf("__FUNCTION__ %s\n", __FUNCTION__);
184 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
185 }
186};
187
188class Constructor {
189public:
190 Constructor() {
191 printf("__func__ %s\n", __func__);
192 printf("__FUNCTION__ %s\n", __FUNCTION__);
193 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
194 }
195
196 Constructor(int) {
197 printf("__func__ %s\n", __func__);
198 printf("__FUNCTION__ %s\n", __FUNCTION__);
199 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
200 }
201
202 Constructor(Base *) {
203 printf("__func__ %s\n", __func__);
204 printf("__FUNCTION__ %s\n", __FUNCTION__);
205 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
206 }
Anders Carlsson2fb08242009-09-08 18:24:21 +0000207};
208
209class Destructor {
210public:
211 ~Destructor() {
212 printf("__func__ %s\n", __func__);
213 printf("__FUNCTION__ %s\n", __FUNCTION__);
214 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
215 }
216};
217
Sam Weinig07d211e2009-12-24 23:15:03 +0000218class ContainerForAnonymousRecords {
219public:
220 class {
221 public:
222 void anonymousClassFunction() {
223 printf("__func__ %s\n", __func__);
224 printf("__FUNCTION__ %s\n", __FUNCTION__);
225 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
226 }
227 } anonymousClass;
228
229 struct {
230 void anonymousStructFunction() {
231 printf("__func__ %s\n", __func__);
232 printf("__FUNCTION__ %s\n", __FUNCTION__);
233 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
234 }
235 } anonymousStruct;
236
237 union {
238 void anonymousUnionFunction() {
239 printf("__func__ %s\n", __func__);
240 printf("__FUNCTION__ %s\n", __FUNCTION__);
241 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
242 }
243 } anonymousUnion;
244};
245
Anders Carlsson2fb08242009-09-08 18:24:21 +0000246extern void externFunction() {
247 printf("__func__ %s\n", __func__);
248 printf("__FUNCTION__ %s\n", __FUNCTION__);
249 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
250}
251
Sam Weinig07d211e2009-12-24 23:15:03 +0000252} // end NS namespace
Anders Carlsson2fb08242009-09-08 18:24:21 +0000253
254int main() {
Sam Weinig07d211e2009-12-24 23:15:03 +0000255 ClassInAnonymousNamespace anonymousNamespace;
256 anonymousNamespace.anonymousNamespaceFunction();
Anders Carlsson2fb08242009-09-08 18:24:21 +0000257
Sam Weinig07d211e2009-12-24 23:15:03 +0000258 ClassInTopLevelNamespace topLevelNamespace;
259 topLevelNamespace.topLevelNamespaceFunction();
260
261 NS::Base::staticFunc();
262
Anders Carlsson2fb08242009-09-08 18:24:21 +0000263 NS::Base b;
264 b.inlineFunction();
265 b.virtualFunction();
266 b.variadicFunction(0);
267 b.functionWithParameters(0, 0, 0);
268 b.functionReturningClass();
269
270 b.withTemplateParameter1(NS::ClassTemplate<int>());
271 b.withTemplateParameter2(NS::ClassTemplate<NS::Base *>());
272 b.functionReturingTemplate1();
273 b.functionReturingTemplate2();
274 b.functionTemplate1<int>(0);
275 b.functionTemplate1<NS::Base *>(0);
276
277 NS::Derived d;
278 d.virtualFunction();
279
280 NS::ClassTemplate<int> t1;
281 t1.classTemplateFunction();
282 NS::ClassTemplate<NS::Base *> t2;
283 t2.classTemplateFunction();
284
285 NS::Constructor c1;
286 NS::Constructor c2(0);
287 NS::Constructor c3((NS::Base *)0);
288
289 {
290 NS::Destructor destructor;
291 }
Sam Weinig07d211e2009-12-24 23:15:03 +0000292
293 NS::ContainerForAnonymousRecords anonymous;
294 anonymous.anonymousClass.anonymousClassFunction();
295 anonymous.anonymousStruct.anonymousStructFunction();
296 anonymous.anonymousUnion.anonymousUnionFunction();
297
Anders Carlsson2fb08242009-09-08 18:24:21 +0000298 NS::externFunction();
Sam Weinig07d211e2009-12-24 23:15:03 +0000299
Anders Carlsson2fb08242009-09-08 18:24:21 +0000300 return 0;
301}