1 // RUN: clang-cc %s -emit-llvm -o - | FileCheck %s 2 3 // CHECK: private constant [15 x i8] c"externFunction\00" 4 // CHECK: private constant [26 x i8] c"void NS::externFunction()\00" 5 6 // 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" 9 10 // 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" 13 14 // CHECK: private constant [12 x i8] c"~Destructor\00" 15 // CHECK: private constant [35 x i8] c"void NS::Destructor::~Destructor()\00" 16 17 // CHECK: private constant [12 x i8] c"Constructor\00" 18 // CHECK: private constant [46 x i8] c"void NS::Constructor::Constructor(NS::Base *)\00" 19 // CHECK: private constant [39 x i8] c"void NS::Constructor::Constructor(int)\00" 20 // CHECK: private constant [36 x i8] c"void NS::Constructor::Constructor()\00" 21 22 // CHECK: private constant [16 x i8] c"virtualFunction\00" 23 // CHECK: private constant [44 x i8] c"virtual void NS::Derived::virtualFunction()\00" 24 25 // CHECK: private constant [26 x i8] c"functionReturingTemplate2\00" 26 // CHECK: private constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00" 27 28 // CHECK: private constant [26 x i8] c"functionReturingTemplate1\00" 29 // CHECK: private constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00" 30 31 // CHECK: private constant [23 x i8] c"withTemplateParameter2\00" 32 // CHECK: private constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00" 33 34 // CHECK: private constant [23 x i8] c"withTemplateParameter1\00" 35 // CHECK: private constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00" 36 37 // CHECK: private constant [23 x i8] c"functionReturningClass\00" 38 // CHECK: private constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00" 39 40 // CHECK: private constant [23 x i8] c"functionWithParameters\00" 41 // CHECK: private constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00" 42 43 // CHECK: private constant [17 x i8] c"variadicFunction\00" 44 // CHECK: private constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00" 45 46 // CHECK: private constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00" 47 48 // CHECK: private constant [15 x i8] c"inlineFunction\00" 49 // CHECK: private constant [32 x i8] c"void NS::Base::inlineFunction()\00" 50 51 // CHECK: private constant [11 x i8] c"staticFunc\00" 52 // CHECK: private constant [28 x i8] c"void NS::Base::staticFunc()\00" 53 54 #include <stdio.h> 55 56 namespace NS { 57 58 template<typename T> 59 class ClassTemplate { 60 public: 61 void classTemplateFunction() { 62 printf("__func__ %s\n", __func__); 63 printf("__FUNCTION__ %s\n", __FUNCTION__); 64 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 65 } 66 }; 67 68 class Base { 69 public: 70 static void staticFunc() { 71 printf("__func__ %s\n", __func__); 72 printf("__FUNCTION__ %s\n", __FUNCTION__); 73 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 74 } 75 76 inline void inlineFunction() { 77 printf("__func__ %s\n", __func__); 78 printf("__FUNCTION__ %s\n", __FUNCTION__); 79 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 80 } 81 82 virtual void virtualFunction() { 83 printf("__func__ %s\n", __func__); 84 printf("__FUNCTION__ %s\n", __FUNCTION__); 85 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 86 } 87 88 void functionWithParameters(int, float*, Base* base) { 89 printf("__func__ %s\n", __func__); 90 printf("__FUNCTION__ %s\n", __FUNCTION__); 91 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 92 } 93 94 Base *functionReturningClass() { 95 printf("__func__ %s\n", __func__); 96 printf("__FUNCTION__ %s\n", __FUNCTION__); 97 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 98 return 0; 99 } 100 101 void variadicFunction(int, ...) { 102 printf("__func__ %s\n", __func__); 103 printf("__FUNCTION__ %s\n", __FUNCTION__); 104 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 105 } 106 107 void withTemplateParameter1(ClassTemplate<int>) { 108 printf("__func__ %s\n", __func__); 109 printf("__FUNCTION__ %s\n", __FUNCTION__); 110 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 111 } 112 113 void withTemplateParameter2(ClassTemplate<Base *>) { 114 printf("__func__ %s\n", __func__); 115 printf("__FUNCTION__ %s\n", __FUNCTION__); 116 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 117 } 118 119 ClassTemplate<int> functionReturingTemplate1() { 120 printf("__func__ %s\n", __func__); 121 printf("__FUNCTION__ %s\n", __FUNCTION__); 122 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 123 return ClassTemplate<int>(); 124 } 125 126 ClassTemplate<Base *> functionReturingTemplate2() { 127 printf("__func__ %s\n", __func__); 128 printf("__FUNCTION__ %s\n", __FUNCTION__); 129 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 130 return ClassTemplate<Base *>(); 131 } 132 133 template<typename T> 134 void functionTemplate1(T t) { 135 printf("__func__ %s\n", __func__); 136 printf("__FUNCTION__ %s\n", __FUNCTION__); 137 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 138 } 139 }; 140 141 class Derived : public Base { 142 public: 143 // Virtual function without being explicitally written. 144 void virtualFunction() { 145 printf("__func__ %s\n", __func__); 146 printf("__FUNCTION__ %s\n", __FUNCTION__); 147 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 148 } 149 }; 150 151 class Constructor { 152 public: 153 Constructor() { 154 printf("__func__ %s\n", __func__); 155 printf("__FUNCTION__ %s\n", __FUNCTION__); 156 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 157 } 158 159 Constructor(int) { 160 printf("__func__ %s\n", __func__); 161 printf("__FUNCTION__ %s\n", __FUNCTION__); 162 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 163 } 164 165 Constructor(Base *) { 166 printf("__func__ %s\n", __func__); 167 printf("__FUNCTION__ %s\n", __FUNCTION__); 168 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 169 } 170 171 }; 172 173 class Destructor { 174 public: 175 ~Destructor() { 176 printf("__func__ %s\n", __func__); 177 printf("__FUNCTION__ %s\n", __FUNCTION__); 178 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 179 } 180 }; 181 182 extern void externFunction() { 183 printf("__func__ %s\n", __func__); 184 printf("__FUNCTION__ %s\n", __FUNCTION__); 185 printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); 186 } 187 188 } 189 190 int main() { 191 NS::Base::staticFunc(); 192 193 NS::Base b; 194 b.inlineFunction(); 195 b.virtualFunction(); 196 b.variadicFunction(0); 197 b.functionWithParameters(0, 0, 0); 198 b.functionReturningClass(); 199 200 b.withTemplateParameter1(NS::ClassTemplate<int>()); 201 b.withTemplateParameter2(NS::ClassTemplate<NS::Base *>()); 202 b.functionReturingTemplate1(); 203 b.functionReturingTemplate2(); 204 b.functionTemplate1<int>(0); 205 b.functionTemplate1<NS::Base *>(0); 206 207 NS::Derived d; 208 d.virtualFunction(); 209 210 NS::ClassTemplate<int> t1; 211 t1.classTemplateFunction(); 212 NS::ClassTemplate<NS::Base *> t2; 213 t2.classTemplateFunction(); 214 215 NS::Constructor c1; 216 NS::Constructor c2(0); 217 NS::Constructor c3((NS::Base *)0); 218 219 { 220 NS::Destructor destructor; 221 } 222 223 NS::externFunction(); 224 225 return 0; 226 } 227