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