1*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 %s -triple %itanium_abi_triple -fblocks -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -x c++ -std=c++14 -triple %itanium_abi_triple -fblocks -emit-pch -o %t %s
3*67e74705SXin Li // RUN: %clang_cc1 -x c++ -triple %itanium_abi_triple -std=c++14 -fblocks -include-pch %t %s -emit-llvm -o - | FileCheck %s
4*67e74705SXin Li
5*67e74705SXin Li #ifndef HEADER
6*67e74705SXin Li #define HEADER
7*67e74705SXin Li
8*67e74705SXin Li // CHECK-DAG: @__func__._ZN13ClassTemplateIiE21classTemplateFunctionERi = private unnamed_addr constant [22 x i8] c"classTemplateFunction\00"
9*67e74705SXin Li // CHECK-DAG: @__PRETTY_FUNCTION__._ZN13ClassTemplateIiE21classTemplateFunctionERi = private unnamed_addr constant [69 x i8] c"const auto &ClassTemplate<int>::classTemplateFunction(T &) [T = int]\00"
10*67e74705SXin Li
11*67e74705SXin Li // CHECK-DAG: @__func__._ZN24ClassInTopLevelNamespace16functionTemplateIiEERDaRT_ = private unnamed_addr constant [17 x i8] c"functionTemplate\00"
12*67e74705SXin Li // CHECK-DAG: @__PRETTY_FUNCTION__._ZN24ClassInTopLevelNamespace16functionTemplateIiEERDaRT_ = private unnamed_addr constant [64 x i8] c"auto &ClassInTopLevelNamespace::functionTemplate(T &) [T = int]\00"
13*67e74705SXin Li
14*67e74705SXin Li // CHECK-DAG: @__func__._ZN24ClassInTopLevelNamespace16variadicFunctionEPiz = private unnamed_addr constant [17 x i8] c"variadicFunction\00"
15*67e74705SXin Li // CHECK-DAG: @__PRETTY_FUNCTION__._ZN24ClassInTopLevelNamespace16variadicFunctionEPiz = private unnamed_addr constant [70 x i8] c"decltype(auto) ClassInTopLevelNamespace::variadicFunction(int *, ...)\00"
16*67e74705SXin Li
17*67e74705SXin Li // CHECK-DAG: @__func__._ZN24ClassInTopLevelNamespace25topLevelNamespaceFunctionEv = private unnamed_addr constant [26 x i8] c"topLevelNamespaceFunction\00"
18*67e74705SXin Li // CHECK-DAG: @__PRETTY_FUNCTION__._ZN24ClassInTopLevelNamespace25topLevelNamespaceFunctionEv = private unnamed_addr constant [60 x i8] c"auto *ClassInTopLevelNamespace::topLevelNamespaceFunction()\00"
19*67e74705SXin Li
20*67e74705SXin Li // CHECK-DAG: @__func__.___ZN16ClassBlockConstrD2Ev_block_invoke = private unnamed_addr constant [41 x i8] c"___ZN16ClassBlockConstrD2Ev_block_invoke\00"
21*67e74705SXin Li // CHECK-DAG: @__func__.___ZN16ClassBlockConstrC2Ev_block_invoke = private unnamed_addr constant [41 x i8] c"___ZN16ClassBlockConstrC2Ev_block_invoke\00"
22*67e74705SXin Li
23*67e74705SXin Li int printf(const char * _Format, ...);
24*67e74705SXin Li
25*67e74705SXin Li class ClassInTopLevelNamespace {
26*67e74705SXin Li public:
topLevelNamespaceFunction()27*67e74705SXin Li auto *topLevelNamespaceFunction() {
28*67e74705SXin Li printf("__func__ %s\n", __func__);
29*67e74705SXin Li printf("__FUNCTION__ %s\n", __FUNCTION__);
30*67e74705SXin Li printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
31*67e74705SXin Li return static_cast<int *>(nullptr);
32*67e74705SXin Li }
33*67e74705SXin Li
variadicFunction(int * a,...)34*67e74705SXin Li decltype(auto) variadicFunction(int *a, ...) {
35*67e74705SXin Li printf("__func__ %s\n", __func__);
36*67e74705SXin Li printf("__FUNCTION__ %s\n", __FUNCTION__);
37*67e74705SXin Li printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
38*67e74705SXin Li return a;
39*67e74705SXin Li }
40*67e74705SXin Li
41*67e74705SXin Li template<typename T>
functionTemplate(T & t)42*67e74705SXin Li auto &functionTemplate(T &t) {
43*67e74705SXin Li printf("__func__ %s\n", __func__);
44*67e74705SXin Li printf("__FUNCTION__ %s\n", __FUNCTION__);
45*67e74705SXin Li printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
46*67e74705SXin Li return t;
47*67e74705SXin Li }
48*67e74705SXin Li };
49*67e74705SXin Li
50*67e74705SXin Li template<typename T>
51*67e74705SXin Li class ClassTemplate {
52*67e74705SXin Li public:
classTemplateFunction(T & t)53*67e74705SXin Li const auto &classTemplateFunction(T &t) {
54*67e74705SXin Li printf("__func__ %s\n", __func__);
55*67e74705SXin Li printf("__FUNCTION__ %s\n", __FUNCTION__);
56*67e74705SXin Li printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
57*67e74705SXin Li return t;
58*67e74705SXin Li }
59*67e74705SXin Li };
60*67e74705SXin Li
61*67e74705SXin Li struct ClassBlockConstr {
62*67e74705SXin Li const char *s;
ClassBlockConstrClassBlockConstr63*67e74705SXin Li ClassBlockConstr() {
64*67e74705SXin Li const char * (^b)() = ^() {
65*67e74705SXin Li return __func__;
66*67e74705SXin Li };
67*67e74705SXin Li s = b();
68*67e74705SXin Li }
~ClassBlockConstrClassBlockConstr69*67e74705SXin Li ~ClassBlockConstr() {
70*67e74705SXin Li const char * (^b)() = ^() {
71*67e74705SXin Li return __func__;
72*67e74705SXin Li };
73*67e74705SXin Li s = b();
74*67e74705SXin Li }
75*67e74705SXin Li };
76*67e74705SXin Li
77*67e74705SXin Li template <class T>
78*67e74705SXin Li class FuncTemplate {
79*67e74705SXin Li const char *Func;
80*67e74705SXin Li
81*67e74705SXin Li public:
FuncTemplate()82*67e74705SXin Li FuncTemplate() : Func(__func__) {}
getFunc() const83*67e74705SXin Li const char *getFunc() const { return Func; }
84*67e74705SXin Li };
85*67e74705SXin Li
86*67e74705SXin Li int
main()87*67e74705SXin Li main() {
88*67e74705SXin Li int a;
89*67e74705SXin Li ClassInTopLevelNamespace topLevelNamespace;
90*67e74705SXin Li ClassBlockConstr classBlockConstr;
91*67e74705SXin Li topLevelNamespace.topLevelNamespaceFunction();
92*67e74705SXin Li topLevelNamespace.variadicFunction(&a);
93*67e74705SXin Li topLevelNamespace.functionTemplate(a);
94*67e74705SXin Li
95*67e74705SXin Li ClassTemplate<int> t;
96*67e74705SXin Li t.classTemplateFunction(a);
97*67e74705SXin Li return 0;
98*67e74705SXin Li }
99*67e74705SXin Li #else
Foo()100*67e74705SXin Li void Foo() {
101*67e74705SXin Li FuncTemplate<int> FTi;
102*67e74705SXin Li (void)FTi.getFunc();
103*67e74705SXin Li }
104*67e74705SXin Li #endif
105*67e74705SXin Li
106