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