• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
2 
3 // CHECK: private unnamed_addr constant [15 x i8] c"externFunction\00"
4 // CHECK: private unnamed_addr constant [26 x i8] c"void NS::externFunction()\00"
5 
6 // CHECK: private unnamed_addr constant [22 x i8] c"classTemplateFunction\00"
7 // CHECK: private unnamed_addr constant [60 x i8] c"void NS::ClassTemplate<NS::Base *>::classTemplateFunction()\00"
8 // CHECK: private unnamed_addr constant [53 x i8] c"void NS::ClassTemplate<int>::classTemplateFunction()\00"
9 
10 // CHECK: private unnamed_addr constant [18 x i8] c"functionTemplate1\00"
11 // CHECK: private unnamed_addr constant [45 x i8] c"void NS::Base::functionTemplate1(NS::Base *)\00"
12 // CHECK: private unnamed_addr constant [38 x i8] c"void NS::Base::functionTemplate1(int)\00"
13 
14 // CHECK: private unnamed_addr constant [23 x i8] c"anonymousUnionFunction\00"
15 // CHECK: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous union>::anonymousUnionFunction()\00"
16 
17 // CHECK: private unnamed_addr constant [24 x i8] c"anonymousStructFunction\00"
18 // CHECK: private unnamed_addr constant [85 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous struct>::anonymousStructFunction()\00"
19 
20 // CHECK: private unnamed_addr constant [23 x i8] c"anonymousClassFunction\00"
21 // CHECK: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous class>::anonymousClassFunction()\00"
22 
23 // CHECK: private unnamed_addr constant [12 x i8] c"~Destructor\00"
24 // CHECK: private unnamed_addr constant [30 x i8] c"NS::Destructor::~Destructor()\00"
25 
26 // CHECK: private unnamed_addr constant [12 x i8] c"Constructor\00"
27 // CHECK: private unnamed_addr constant [41 x i8] c"NS::Constructor::Constructor(NS::Base *)\00"
28 // CHECK: private unnamed_addr constant [34 x i8] c"NS::Constructor::Constructor(int)\00"
29 // CHECK: private unnamed_addr constant [31 x i8] c"NS::Constructor::Constructor()\00"
30 
31 // CHECK: private unnamed_addr constant [16 x i8] c"virtualFunction\00"
32 // CHECK: private unnamed_addr constant [44 x i8] c"virtual void NS::Derived::virtualFunction()\00"
33 
34 // CHECK: private unnamed_addr constant [22 x i8] c"constVolatileFunction\00"
35 // CHECK: private unnamed_addr constant [54 x i8] c"void NS::Base::constVolatileFunction() const volatile\00"
36 
37 // CHECK: private unnamed_addr constant [17 x i8] c"volatileFunction\00"
38 // CHECK: private unnamed_addr constant [43 x i8] c"void NS::Base::volatileFunction() volatile\00"
39 
40 // CHECK: private unnamed_addr constant [14 x i8] c"constFunction\00"
41 // CHECK: private unnamed_addr constant [37 x i8] c"void NS::Base::constFunction() const\00"
42 
43 // CHECK: private unnamed_addr constant [26 x i8] c"functionReturingTemplate2\00"
44 // CHECK: private unnamed_addr constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00"
45 
46 // CHECK: private unnamed_addr constant [26 x i8] c"functionReturingTemplate1\00"
47 // CHECK: private unnamed_addr constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00"
48 
49 // CHECK: private unnamed_addr constant [23 x i8] c"withTemplateParameter2\00"
50 // CHECK: private unnamed_addr constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00"
51 
52 // CHECK: private unnamed_addr constant [23 x i8] c"withTemplateParameter1\00"
53 // CHECK: private unnamed_addr constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00"
54 
55 // CHECK: private unnamed_addr constant [23 x i8] c"functionReturningClass\00"
56 // CHECK: private unnamed_addr constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00"
57 
58 // CHECK: private unnamed_addr constant [23 x i8] c"functionWithParameters\00"
59 // CHECK: private unnamed_addr constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00"
60 
61 // CHECK: private unnamed_addr constant [17 x i8] c"variadicFunction\00"
62 // CHECK: private unnamed_addr constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00"
63 
64 // CHECK: private unnamed_addr constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00"
65 
66 // CHECK: private unnamed_addr constant [15 x i8] c"inlineFunction\00"
67 // CHECK: private unnamed_addr constant [32 x i8] c"void NS::Base::inlineFunction()\00"
68 
69 // CHECK: private unnamed_addr constant [15 x i8] c"staticFunction\00"
70 // CHECK: private unnamed_addr constant [39 x i8] c"static void NS::Base::staticFunction()\00"
71 
72 // CHECK: private unnamed_addr constant [26 x i8] c"topLevelNamespaceFunction\00"
73 // CHECK: private unnamed_addr constant [59 x i8] c"void ClassInTopLevelNamespace::topLevelNamespaceFunction()\00"
74 
75 // CHECK: private unnamed_addr constant [27 x i8] c"anonymousNamespaceFunction\00"
76 // CHECK: private unnamed_addr constant [84 x i8] c"void <anonymous namespace>::ClassInAnonymousNamespace::anonymousNamespaceFunction()\00"
77 
78 // CHECK: private unnamed_addr constant [19 x i8] c"localClassFunction\00"
79 // CHECK: private unnamed_addr constant [59 x i8] c"void NS::localClass(int)::LocalClass::localClassFunction()\00"
80 
81 int printf(const char * _Format, ...);
82 
83 class ClassInTopLevelNamespace {
84 public:
topLevelNamespaceFunction()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 
92 namespace {
93 
94   class ClassInAnonymousNamespace {
95   public:
anonymousNamespaceFunction()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 
105 namespace NS {
106 
107 template<typename T>
108 class ClassTemplate {
109 public:
classTemplateFunction()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 
117 class Base {
118 public:
staticFunction()119   static void staticFunction() {
120     printf("__func__ %s\n", __func__);
121     printf("__FUNCTION__ %s\n", __FUNCTION__);
122     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
123   }
124 
inlineFunction()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 
virtualFunction()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 
functionWithParameters(int,float *,Base * base)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 
functionReturningClass()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 
variadicFunction(int,...)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 
withTemplateParameter1(ClassTemplate<int>)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 
withTemplateParameter2(ClassTemplate<Base * >)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 
functionReturingTemplate1()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 
functionReturingTemplate2()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>
functionTemplate1(T 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   }
188 
constFunction() const189   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 
volatileFunction()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 
constVolatileFunction() const201   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   }
206 };
207 
208 class Derived : public Base {
209 public:
210   // Virtual function without being explicitally written.
virtualFunction()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 
218 class Constructor {
219 public:
Constructor()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 
Constructor(int)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 
Constructor(Base *)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   }
237 };
238 
239 class Destructor {
240 public:
~Destructor()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 
248 class ContainerForAnonymousRecords {
249 public:
250   class {
251   public:
anonymousClassFunction()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 {
anonymousStructFunctionNS::ContainerForAnonymousRecords::__anone5b7b7810308260     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 {
anonymousUnionFunction()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 
localClass(int)276 void 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 
externFunction()289 extern 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 
295 } // end NS namespace
296 
main()297 int main() {
298   ClassInAnonymousNamespace anonymousNamespace;
299   anonymousNamespace.anonymousNamespaceFunction();
300 
301   ClassInTopLevelNamespace topLevelNamespace;
302   topLevelNamespace.topLevelNamespaceFunction();
303 
304   NS::Base::staticFunction();
305 
306   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);
319   b.constFunction();
320   b.volatileFunction();
321   b.constVolatileFunction();
322 
323   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   }
338 
339   NS::ContainerForAnonymousRecords anonymous;
340   anonymous.anonymousClass.anonymousClassFunction();
341   anonymous.anonymousStruct.anonymousStructFunction();
342   anonymous.anonymousUnion.anonymousUnionFunction();
343 
344   NS::localClass(0);
345 
346   NS::externFunction();
347 
348   return 0;
349 }
350