xref: /aosp_15_r20/external/clang/test/CodeGenCXX/predefined-expr.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fblocks %s -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [15 x i8] c"externFunction\00"
4*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [26 x i8] c"void NS::externFunction()\00"
5*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [49 x i8] c"void functionTemplateExplicitSpecialization(int)\00"
6*67e74705SXin Li 
7*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [95 x i8] c"void SpecializedClassTemplate<char>::memberFunctionTemplate(T, U) const [T = char, U = double]\00"
8*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [85 x i8] c"void SpecializedClassTemplate<int>::memberFunctionTemplate(int, U) const [U = float]\00"
9*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [57 x i8] c"void NonTypeTemplateParam<42>::size() const [Count = 42]\00"
10*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [122 x i8] c"static void ClassWithTemplateTemplateParam<char, NS::ClassTemplate>::staticMember() [T = char, Param = NS::ClassTemplate]\00"
11*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [106 x i8] c"void OuterClass<int *>::MiddleClass::InnerClass<float>::memberFunction(T, U) const [T = int *, U = float]\00"
12*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [51 x i8] c"void functionTemplateWithCapturedStmt(T) [T = int]\00"
13*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [76 x i8] c"auto functionTemplateWithLambda(int)::(anonymous class)::operator()() const\00"
14*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [65 x i8] c"void functionTemplateWithUnnamedTemplateParameter(T) [T = float]\00"
15*67e74705SXin Li 
16*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [60 x i8] c"void functionTemplateExplicitSpecialization(T) [T = double]\00"
17*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [52 x i8] c"T *functionTemplateWithCompoundTypes(T *) [T = int]\00"
18*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [54 x i8] c"T functionTemplateWithTemplateReturnType() [T = char]\00"
19*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [57 x i8] c"void functionTemplateWithoutParameterList() [T = double]\00"
20*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [62 x i8] c"void functionTemplateWithTwoParams(T, U) [T = int, U = float]\00"
21*67e74705SXin Li 
22*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [22 x i8] c"classTemplateFunction\00"
23*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [77 x i8] c"void NS::ClassTemplate<NS::Base *>::classTemplateFunction() [T = NS::Base *]\00"
24*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [63 x i8] c"void NS::ClassTemplate<int>::classTemplateFunction() [T = int]\00"
25*67e74705SXin Li 
26*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [18 x i8] c"functionTemplate1\00"
27*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [53 x i8] c"void NS::Base::functionTemplate1(T) [T = NS::Base *]\00"
28*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [46 x i8] c"void NS::Base::functionTemplate1(T) [T = int]\00"
29*67e74705SXin Li 
30*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [23 x i8] c"anonymousUnionFunction\00"
31*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::(anonymous union)::anonymousUnionFunction()\00"
32*67e74705SXin Li 
33*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [24 x i8] c"anonymousStructFunction\00"
34*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [85 x i8] c"void NS::ContainerForAnonymousRecords::(anonymous struct)::anonymousStructFunction()\00"
35*67e74705SXin Li 
36*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [23 x i8] c"anonymousClassFunction\00"
37*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::(anonymous class)::anonymousClassFunction()\00"
38*67e74705SXin Li 
39*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [12 x i8] c"~Destructor\00"
40*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [30 x i8] c"NS::Destructor::~Destructor()\00"
41*67e74705SXin Li 
42*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [12 x i8] c"Constructor\00"
43*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [41 x i8] c"NS::Constructor::Constructor(NS::Base *)\00"
44*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [34 x i8] c"NS::Constructor::Constructor(int)\00"
45*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [31 x i8] c"NS::Constructor::Constructor()\00"
46*67e74705SXin Li 
47*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [16 x i8] c"virtualFunction\00"
48*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [44 x i8] c"virtual void NS::Derived::virtualFunction()\00"
49*67e74705SXin Li 
50*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [21 x i8] c"refQualifiedFunction\00"
51*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [41 x i8] c"void NS::Base::refQualifiedFunction() &&\00"
52*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [40 x i8] c"void NS::Base::refQualifiedFunction() &\00"
53*67e74705SXin Li 
54*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [22 x i8] c"constVolatileFunction\00"
55*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [54 x i8] c"void NS::Base::constVolatileFunction() const volatile\00"
56*67e74705SXin Li 
57*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [17 x i8] c"volatileFunction\00"
58*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [43 x i8] c"void NS::Base::volatileFunction() volatile\00"
59*67e74705SXin Li 
60*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [14 x i8] c"constFunction\00"
61*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [37 x i8] c"void NS::Base::constFunction() const\00"
62*67e74705SXin Li 
63*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [26 x i8] c"functionReturingTemplate2\00"
64*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00"
65*67e74705SXin Li 
66*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [26 x i8] c"functionReturingTemplate1\00"
67*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00"
68*67e74705SXin Li 
69*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [23 x i8] c"withTemplateParameter2\00"
70*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00"
71*67e74705SXin Li 
72*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [23 x i8] c"withTemplateParameter1\00"
73*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00"
74*67e74705SXin Li 
75*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [23 x i8] c"functionReturningClass\00"
76*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00"
77*67e74705SXin Li 
78*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [23 x i8] c"functionWithParameters\00"
79*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00"
80*67e74705SXin Li 
81*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [17 x i8] c"variadicFunction\00"
82*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00"
83*67e74705SXin Li 
84*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00"
85*67e74705SXin Li 
86*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [15 x i8] c"inlineFunction\00"
87*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [32 x i8] c"void NS::Base::inlineFunction()\00"
88*67e74705SXin Li 
89*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [15 x i8] c"staticFunction\00"
90*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [39 x i8] c"static void NS::Base::staticFunction()\00"
91*67e74705SXin Li 
92*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [26 x i8] c"topLevelNamespaceFunction\00"
93*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [59 x i8] c"void ClassInTopLevelNamespace::topLevelNamespaceFunction()\00"
94*67e74705SXin Li 
95*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [27 x i8] c"anonymousNamespaceFunction\00"
96*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [84 x i8] c"void (anonymous namespace)::ClassInAnonymousNamespace::anonymousNamespaceFunction()\00"
97*67e74705SXin Li 
98*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [19 x i8] c"localClassFunction\00"
99*67e74705SXin Li // CHECK-DAG: private unnamed_addr constant [59 x i8] c"void NS::localClass(int)::LocalClass::localClassFunction()\00"
100*67e74705SXin Li 
101*67e74705SXin Li 
102*67e74705SXin Li 
103*67e74705SXin Li int printf(const char * _Format, ...);
104*67e74705SXin Li 
105*67e74705SXin Li class ClassInTopLevelNamespace {
106*67e74705SXin Li public:
topLevelNamespaceFunction()107*67e74705SXin Li   void topLevelNamespaceFunction() {
108*67e74705SXin Li     printf("__func__ %s\n", __func__);
109*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
110*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
111*67e74705SXin Li   }
112*67e74705SXin Li };
113*67e74705SXin Li 
114*67e74705SXin Li namespace {
115*67e74705SXin Li 
116*67e74705SXin Li   class ClassInAnonymousNamespace {
117*67e74705SXin Li   public:
anonymousNamespaceFunction()118*67e74705SXin Li     void anonymousNamespaceFunction() {
119*67e74705SXin Li       printf("__func__ %s\n", __func__);
120*67e74705SXin Li       printf("__FUNCTION__ %s\n", __FUNCTION__);
121*67e74705SXin Li       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
122*67e74705SXin Li     }
123*67e74705SXin Li   };
124*67e74705SXin Li 
125*67e74705SXin Li } // end anonymous namespace
126*67e74705SXin Li 
127*67e74705SXin Li namespace NS {
128*67e74705SXin Li 
129*67e74705SXin Li template<typename T>
130*67e74705SXin Li class ClassTemplate {
131*67e74705SXin Li public:
classTemplateFunction()132*67e74705SXin Li   void classTemplateFunction() {
133*67e74705SXin Li     printf("__func__ %s\n", __func__);
134*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
135*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
136*67e74705SXin Li   }
137*67e74705SXin Li };
138*67e74705SXin Li 
139*67e74705SXin Li class Base {
140*67e74705SXin Li public:
staticFunction()141*67e74705SXin Li   static void staticFunction() {
142*67e74705SXin Li     printf("__func__ %s\n", __func__);
143*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
144*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
145*67e74705SXin Li   }
146*67e74705SXin Li 
147*67e74705SXin Li   inline void (inlineFunction)() {
148*67e74705SXin Li     printf("__func__ %s\n", __func__);
149*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
150*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
151*67e74705SXin Li   }
152*67e74705SXin Li 
virtualFunction()153*67e74705SXin Li   virtual void virtualFunction() {
154*67e74705SXin Li     printf("__func__ %s\n", __func__);
155*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
156*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
157*67e74705SXin Li   }
158*67e74705SXin Li 
functionWithParameters(int,float *,Base * base)159*67e74705SXin Li   void functionWithParameters(int, float*, Base* base) {
160*67e74705SXin Li     printf("__func__ %s\n", __func__);
161*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
162*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
163*67e74705SXin Li   }
164*67e74705SXin Li 
functionReturningClass()165*67e74705SXin Li   Base *functionReturningClass() {
166*67e74705SXin Li     printf("__func__ %s\n", __func__);
167*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
168*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
169*67e74705SXin Li     return 0;
170*67e74705SXin Li   }
171*67e74705SXin Li 
variadicFunction(int,...)172*67e74705SXin Li   void variadicFunction(int, ...) {
173*67e74705SXin Li     printf("__func__ %s\n", __func__);
174*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
175*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
176*67e74705SXin Li   }
177*67e74705SXin Li 
withTemplateParameter1(ClassTemplate<int>)178*67e74705SXin Li   void withTemplateParameter1(ClassTemplate<int>) {
179*67e74705SXin Li     printf("__func__ %s\n", __func__);
180*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
181*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
182*67e74705SXin Li   }
183*67e74705SXin Li 
withTemplateParameter2(ClassTemplate<Base * >)184*67e74705SXin Li   void withTemplateParameter2(ClassTemplate<Base *>) {
185*67e74705SXin Li     printf("__func__ %s\n", __func__);
186*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
187*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
188*67e74705SXin Li   }
189*67e74705SXin Li 
functionReturingTemplate1()190*67e74705SXin Li   ClassTemplate<int> functionReturingTemplate1() {
191*67e74705SXin Li     printf("__func__ %s\n", __func__);
192*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
193*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
194*67e74705SXin Li     return ClassTemplate<int>();
195*67e74705SXin Li   }
196*67e74705SXin Li 
functionReturingTemplate2()197*67e74705SXin Li   ClassTemplate<Base *> functionReturingTemplate2() {
198*67e74705SXin Li     printf("__func__ %s\n", __func__);
199*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
200*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
201*67e74705SXin Li     return ClassTemplate<Base *>();
202*67e74705SXin Li   }
203*67e74705SXin Li 
204*67e74705SXin Li   template<typename T>
functionTemplate1(T t)205*67e74705SXin Li   void functionTemplate1(T t) {
206*67e74705SXin Li     printf("__func__ %s\n", __func__);
207*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
208*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
209*67e74705SXin Li   }
210*67e74705SXin Li 
constFunction() const211*67e74705SXin Li   void constFunction() const {
212*67e74705SXin Li     printf("__func__ %s\n", __func__);
213*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
214*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
215*67e74705SXin Li   }
216*67e74705SXin Li 
volatileFunction()217*67e74705SXin Li   void volatileFunction() volatile {
218*67e74705SXin Li     printf("__func__ %s\n", __func__);
219*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
220*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
221*67e74705SXin Li   }
222*67e74705SXin Li 
constVolatileFunction() const223*67e74705SXin Li   void constVolatileFunction() const volatile {
224*67e74705SXin Li     printf("__func__ %s\n", __func__);
225*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
226*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
227*67e74705SXin Li   }
228*67e74705SXin Li 
refQualifiedFunction()229*67e74705SXin Li   void refQualifiedFunction() & {
230*67e74705SXin Li     printf("__func__ %s\n", __func__);
231*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
232*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
233*67e74705SXin Li   }
234*67e74705SXin Li 
refQualifiedFunction()235*67e74705SXin Li   void refQualifiedFunction() && {
236*67e74705SXin Li     printf("__func__ %s\n", __func__);
237*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
238*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
239*67e74705SXin Li   }
240*67e74705SXin Li };
241*67e74705SXin Li 
242*67e74705SXin Li class Derived : public Base {
243*67e74705SXin Li public:
244*67e74705SXin Li   // Virtual function without being explicitly written.
virtualFunction()245*67e74705SXin Li   void virtualFunction() {
246*67e74705SXin Li     printf("__func__ %s\n", __func__);
247*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
248*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
249*67e74705SXin Li   }
250*67e74705SXin Li };
251*67e74705SXin Li 
252*67e74705SXin Li class Constructor {
253*67e74705SXin Li public:
Constructor()254*67e74705SXin Li   Constructor() {
255*67e74705SXin Li     printf("__func__ %s\n", __func__);
256*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
257*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
258*67e74705SXin Li   }
259*67e74705SXin Li 
Constructor(int)260*67e74705SXin Li   Constructor(int) {
261*67e74705SXin Li     printf("__func__ %s\n", __func__);
262*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
263*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
264*67e74705SXin Li   }
265*67e74705SXin Li 
Constructor(Base *)266*67e74705SXin Li   Constructor(Base *) {
267*67e74705SXin Li     printf("__func__ %s\n", __func__);
268*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
269*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
270*67e74705SXin Li   }
271*67e74705SXin Li };
272*67e74705SXin Li 
273*67e74705SXin Li class Destructor {
274*67e74705SXin Li public:
~Destructor()275*67e74705SXin Li   ~Destructor() {
276*67e74705SXin Li     printf("__func__ %s\n", __func__);
277*67e74705SXin Li     printf("__FUNCTION__ %s\n", __FUNCTION__);
278*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
279*67e74705SXin Li   }
280*67e74705SXin Li };
281*67e74705SXin Li 
282*67e74705SXin Li class ContainerForAnonymousRecords {
283*67e74705SXin Li public:
284*67e74705SXin Li   class {
285*67e74705SXin Li   public:
anonymousClassFunction()286*67e74705SXin Li     void anonymousClassFunction() {
287*67e74705SXin Li       printf("__func__ %s\n", __func__);
288*67e74705SXin Li       printf("__FUNCTION__ %s\n", __FUNCTION__);
289*67e74705SXin Li       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
290*67e74705SXin Li     }
291*67e74705SXin Li   } anonymousClass;
292*67e74705SXin Li 
293*67e74705SXin Li   struct {
anonymousStructFunctionNS::ContainerForAnonymousRecords::__anon0c2c4cb40308294*67e74705SXin Li     void anonymousStructFunction() {
295*67e74705SXin Li       printf("__func__ %s\n", __func__);
296*67e74705SXin Li       printf("__FUNCTION__ %s\n", __FUNCTION__);
297*67e74705SXin Li       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
298*67e74705SXin Li     }
299*67e74705SXin Li   } anonymousStruct;
300*67e74705SXin Li 
301*67e74705SXin Li   union {
anonymousUnionFunction()302*67e74705SXin Li     void anonymousUnionFunction() {
303*67e74705SXin Li       printf("__func__ %s\n", __func__);
304*67e74705SXin Li       printf("__FUNCTION__ %s\n", __FUNCTION__);
305*67e74705SXin Li       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
306*67e74705SXin Li     }
307*67e74705SXin Li   } anonymousUnion;
308*67e74705SXin Li };
309*67e74705SXin Li 
localClass(int)310*67e74705SXin Li void localClass(int) {
311*67e74705SXin Li   class LocalClass {
312*67e74705SXin Li   public:
313*67e74705SXin Li     void localClassFunction() {
314*67e74705SXin Li       printf("__func__ %s\n", __func__);
315*67e74705SXin Li       printf("__FUNCTION__ %s\n", __FUNCTION__);
316*67e74705SXin Li       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
317*67e74705SXin Li     }
318*67e74705SXin Li   };
319*67e74705SXin Li   LocalClass lc;
320*67e74705SXin Li   lc.localClassFunction();
321*67e74705SXin Li }
322*67e74705SXin Li 
externFunction()323*67e74705SXin Li extern void externFunction() {
324*67e74705SXin Li   printf("__func__ %s\n", __func__);
325*67e74705SXin Li   printf("__FUNCTION__ %s\n", __FUNCTION__);
326*67e74705SXin Li   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
327*67e74705SXin Li }
328*67e74705SXin Li 
329*67e74705SXin Li } // end NS namespace
330*67e74705SXin Li 
331*67e74705SXin Li // additional tests for __PRETTY_FUNCTION__
332*67e74705SXin Li template <typename T, typename U>
functionTemplateWithTwoParams(T,U)333*67e74705SXin Li void functionTemplateWithTwoParams(T, U)
334*67e74705SXin Li {
335*67e74705SXin Li   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
336*67e74705SXin Li }
337*67e74705SXin Li 
338*67e74705SXin Li template <typename T>
functionTemplateWithoutParameterList()339*67e74705SXin Li void functionTemplateWithoutParameterList()
340*67e74705SXin Li {
341*67e74705SXin Li   T t = T();
342*67e74705SXin Li 
343*67e74705SXin Li   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
344*67e74705SXin Li }
345*67e74705SXin Li 
346*67e74705SXin Li template <typename T>
functionTemplateWithTemplateReturnType()347*67e74705SXin Li T functionTemplateWithTemplateReturnType()
348*67e74705SXin Li {
349*67e74705SXin Li   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
350*67e74705SXin Li 
351*67e74705SXin Li   return T();
352*67e74705SXin Li }
353*67e74705SXin Li 
354*67e74705SXin Li template <typename T>
functionTemplateWithCompoundTypes(T a[])355*67e74705SXin Li T * functionTemplateWithCompoundTypes(T a[])
356*67e74705SXin Li {
357*67e74705SXin Li   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
358*67e74705SXin Li 
359*67e74705SXin Li   return 0;
360*67e74705SXin Li }
361*67e74705SXin Li 
362*67e74705SXin Li template <typename T>
functionTemplateExplicitSpecialization(T t)363*67e74705SXin Li void functionTemplateExplicitSpecialization(T t)
364*67e74705SXin Li {
365*67e74705SXin Li   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
366*67e74705SXin Li }
367*67e74705SXin Li 
368*67e74705SXin Li template <>
functionTemplateExplicitSpecialization(int i)369*67e74705SXin Li void functionTemplateExplicitSpecialization<int>(int i)
370*67e74705SXin Li {
371*67e74705SXin Li   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
372*67e74705SXin Li }
373*67e74705SXin Li 
374*67e74705SXin Li template <typename, typename T>
functionTemplateWithUnnamedTemplateParameter(T t)375*67e74705SXin Li void functionTemplateWithUnnamedTemplateParameter(T t)
376*67e74705SXin Li {
377*67e74705SXin Li   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
378*67e74705SXin Li }
379*67e74705SXin Li 
380*67e74705SXin Li template <typename T>
functionTemplateWithLambda(T t)381*67e74705SXin Li void functionTemplateWithLambda(T t)
382*67e74705SXin Li {
383*67e74705SXin Li   []() {
384*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
385*67e74705SXin Li   } ();
386*67e74705SXin Li }
387*67e74705SXin Li 
388*67e74705SXin Li template <typename T>
functionTemplateWithCapturedStmt(T t)389*67e74705SXin Li void functionTemplateWithCapturedStmt(T t)
390*67e74705SXin Li {
391*67e74705SXin Li   #pragma clang __debug captured
392*67e74705SXin Li   {
393*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
394*67e74705SXin Li   }
395*67e74705SXin Li }
396*67e74705SXin Li 
397*67e74705SXin Li template <typename T>
398*67e74705SXin Li class OuterClass
399*67e74705SXin Li {
400*67e74705SXin Li public:
401*67e74705SXin Li   class MiddleClass
402*67e74705SXin Li   {
403*67e74705SXin Li   public:
404*67e74705SXin Li     template <typename U>
405*67e74705SXin Li     class InnerClass
406*67e74705SXin Li     {
407*67e74705SXin Li     public:
memberFunction(T x,U y) const408*67e74705SXin Li       void memberFunction(T x, U y) const
409*67e74705SXin Li       {
410*67e74705SXin Li         printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
411*67e74705SXin Li       }
412*67e74705SXin Li     };
413*67e74705SXin Li   };
414*67e74705SXin Li };
415*67e74705SXin Li 
416*67e74705SXin Li template <typename T, template <typename> class Param = NS::ClassTemplate>
417*67e74705SXin Li class ClassWithTemplateTemplateParam
418*67e74705SXin Li {
419*67e74705SXin Li public:
staticMember()420*67e74705SXin Li   static void staticMember()
421*67e74705SXin Li   {
422*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
423*67e74705SXin Li   }
424*67e74705SXin Li };
425*67e74705SXin Li 
426*67e74705SXin Li template <int Count>
427*67e74705SXin Li class NonTypeTemplateParam
428*67e74705SXin Li {
429*67e74705SXin Li public:
size() const430*67e74705SXin Li   void size() const
431*67e74705SXin Li   {
432*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
433*67e74705SXin Li   }
434*67e74705SXin Li };
435*67e74705SXin Li 
436*67e74705SXin Li template <typename T>
437*67e74705SXin Li class SpecializedClassTemplate
438*67e74705SXin Li {
439*67e74705SXin Li public:
440*67e74705SXin Li   template <typename U>
memberFunctionTemplate(T t,U u) const441*67e74705SXin Li   void memberFunctionTemplate(T t, U u) const
442*67e74705SXin Li   {
443*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
444*67e74705SXin Li   }
445*67e74705SXin Li };
446*67e74705SXin Li 
447*67e74705SXin Li template <>
448*67e74705SXin Li class SpecializedClassTemplate<int>
449*67e74705SXin Li {
450*67e74705SXin Li public:
451*67e74705SXin Li   template <typename U>
memberFunctionTemplate(int i,U u) const452*67e74705SXin Li   void memberFunctionTemplate(int i, U u) const
453*67e74705SXin Li   {
454*67e74705SXin Li     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
455*67e74705SXin Li   }
456*67e74705SXin Li };
457*67e74705SXin Li 
main()458*67e74705SXin Li int main() {
459*67e74705SXin Li   ClassInAnonymousNamespace anonymousNamespace;
460*67e74705SXin Li   anonymousNamespace.anonymousNamespaceFunction();
461*67e74705SXin Li 
462*67e74705SXin Li   ClassInTopLevelNamespace topLevelNamespace;
463*67e74705SXin Li   topLevelNamespace.topLevelNamespaceFunction();
464*67e74705SXin Li 
465*67e74705SXin Li   NS::Base::staticFunction();
466*67e74705SXin Li 
467*67e74705SXin Li   NS::Base b;
468*67e74705SXin Li   b.inlineFunction();
469*67e74705SXin Li   b.virtualFunction();
470*67e74705SXin Li   b.variadicFunction(0);
471*67e74705SXin Li   b.functionWithParameters(0, 0, 0);
472*67e74705SXin Li   b.functionReturningClass();
473*67e74705SXin Li 
474*67e74705SXin Li   b.withTemplateParameter1(NS::ClassTemplate<int>());
475*67e74705SXin Li   b.withTemplateParameter2(NS::ClassTemplate<NS::Base *>());
476*67e74705SXin Li   b.functionReturingTemplate1();
477*67e74705SXin Li   b.functionReturingTemplate2();
478*67e74705SXin Li   b.functionTemplate1<int>(0);
479*67e74705SXin Li   b.functionTemplate1<NS::Base *>(0);
480*67e74705SXin Li   b.constFunction();
481*67e74705SXin Li   b.volatileFunction();
482*67e74705SXin Li   b.constVolatileFunction();
483*67e74705SXin Li   b.refQualifiedFunction();
484*67e74705SXin Li   NS::Base().refQualifiedFunction();
485*67e74705SXin Li 
486*67e74705SXin Li   NS::Derived d;
487*67e74705SXin Li   d.virtualFunction();
488*67e74705SXin Li 
489*67e74705SXin Li   NS::ClassTemplate<int> t1;
490*67e74705SXin Li   t1.classTemplateFunction();
491*67e74705SXin Li   NS::ClassTemplate<NS::Base *> t2;
492*67e74705SXin Li   t2.classTemplateFunction();
493*67e74705SXin Li 
494*67e74705SXin Li   NS::Constructor c1;
495*67e74705SXin Li   NS::Constructor c2(0);
496*67e74705SXin Li   NS::Constructor c3((NS::Base *)0);
497*67e74705SXin Li 
498*67e74705SXin Li   {
499*67e74705SXin Li     NS::Destructor destructor;
500*67e74705SXin Li   }
501*67e74705SXin Li 
502*67e74705SXin Li   NS::ContainerForAnonymousRecords anonymous;
503*67e74705SXin Li   anonymous.anonymousClass.anonymousClassFunction();
504*67e74705SXin Li   anonymous.anonymousStruct.anonymousStructFunction();
505*67e74705SXin Li   anonymous.anonymousUnion.anonymousUnionFunction();
506*67e74705SXin Li 
507*67e74705SXin Li   NS::localClass(0);
508*67e74705SXin Li 
509*67e74705SXin Li   NS::externFunction();
510*67e74705SXin Li 
511*67e74705SXin Li   // additional tests for __PRETTY_FUNCTION__
512*67e74705SXin Li 
513*67e74705SXin Li   functionTemplateWithTwoParams(0, 0.0f);
514*67e74705SXin Li   functionTemplateWithoutParameterList<double>();
515*67e74705SXin Li   functionTemplateWithTemplateReturnType<char>();
516*67e74705SXin Li   int array[] = { 1, 2, 3 };
517*67e74705SXin Li   functionTemplateWithCompoundTypes(array);
518*67e74705SXin Li   functionTemplateExplicitSpecialization(0);
519*67e74705SXin Li   functionTemplateExplicitSpecialization(0.0);
520*67e74705SXin Li   functionTemplateWithUnnamedTemplateParameter<int, float>(0.0f);
521*67e74705SXin Li 
522*67e74705SXin Li   functionTemplateWithLambda<int>(0);
523*67e74705SXin Li   functionTemplateWithCapturedStmt<int>(0);
524*67e74705SXin Li 
525*67e74705SXin Li   OuterClass<int *>::MiddleClass::InnerClass<float> omi;
526*67e74705SXin Li   omi.memberFunction(0, 0.0f);
527*67e74705SXin Li 
528*67e74705SXin Li   ClassWithTemplateTemplateParam<char>::staticMember();
529*67e74705SXin Li 
530*67e74705SXin Li   NonTypeTemplateParam<42> ntt;
531*67e74705SXin Li   ntt.size();
532*67e74705SXin Li 
533*67e74705SXin Li   SpecializedClassTemplate<int> sct1;
534*67e74705SXin Li   sct1.memberFunctionTemplate(0, 0.0f);
535*67e74705SXin Li   SpecializedClassTemplate<char> sct2;
536*67e74705SXin Li   sct2.memberFunctionTemplate('0', 0.0);
537*67e74705SXin Li 
538*67e74705SXin Li   return 0;
539*67e74705SXin Li }
540*67e74705SXin Li 
541*67e74705SXin Li // rdar://19065361
542*67e74705SXin Li class XXX {
543*67e74705SXin Li   XXX();
544*67e74705SXin Li   ~XXX();
545*67e74705SXin Li };
546*67e74705SXin Li 
XXLog(const char * functionName)547*67e74705SXin Li void XXLog(const char *functionName) { }
548*67e74705SXin Li 
549*67e74705SXin Li typedef void (^notify_handler_t)(int token);
550*67e74705SXin Li 
551*67e74705SXin Li typedef void (^dispatch_block_t)(void);
552*67e74705SXin Li 
553*67e74705SXin Li void notify_register_dispatch(notify_handler_t handler);
554*67e74705SXin Li 
555*67e74705SXin Li void _dispatch_once(dispatch_block_t block);
556*67e74705SXin Li 
XXX()557*67e74705SXin Li XXX::XXX()
558*67e74705SXin Li {
559*67e74705SXin Li    _dispatch_once(^{ notify_register_dispatch( ^(int token) { XXLog(__FUNCTION__); });
560*67e74705SXin Li    });
561*67e74705SXin Li }
562*67e74705SXin Li // CHECK: define internal {{.*}}void @___ZN3XXXC2Ev_block_invoke_
563*67e74705SXin Li 
~XXX()564*67e74705SXin Li XXX::~XXX()
565*67e74705SXin Li {
566*67e74705SXin Li    _dispatch_once(^{ notify_register_dispatch( ^(int token) { XXLog(__FUNCTION__); });
567*67e74705SXin Li    });
568*67e74705SXin Li }
569*67e74705SXin Li // CHECK: define internal {{.*}}void @___ZN3XXXD2Ev_block_invoke_
570