forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			570 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			570 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -std=c++11 -fblocks %s -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %s
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [15 x i8] c"externFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [26 x i8] c"void NS::externFunction()\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [49 x i8] c"void functionTemplateExplicitSpecialization(int)\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [95 x i8] c"void SpecializedClassTemplate<char>::memberFunctionTemplate(T, U) const [T = char, U = double]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [85 x i8] c"void SpecializedClassTemplate<int>::memberFunctionTemplate(int, U) const [U = float]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [57 x i8] c"void NonTypeTemplateParam<42>::size() const [Count = 42]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [122 x i8] c"static void ClassWithTemplateTemplateParam<char, NS::ClassTemplate>::staticMember() [T = char, Param = NS::ClassTemplate]\00"
 | |
| // 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"
 | |
| // CHECK-DAG: private unnamed_addr constant [51 x i8] c"void functionTemplateWithCapturedStmt(T) [T = int]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [76 x i8] c"auto functionTemplateWithLambda(int)::(anonymous class)::operator()() const\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [65 x i8] c"void functionTemplateWithUnnamedTemplateParameter(T) [T = float]\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [60 x i8] c"void functionTemplateExplicitSpecialization(T) [T = double]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [52 x i8] c"T *functionTemplateWithCompoundTypes(T *) [T = int]\00" 
 | |
| // CHECK-DAG: private unnamed_addr constant [54 x i8] c"T functionTemplateWithTemplateReturnType() [T = char]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [57 x i8] c"void functionTemplateWithoutParameterList() [T = double]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [62 x i8] c"void functionTemplateWithTwoParams(T, U) [T = int, U = float]\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [22 x i8] c"classTemplateFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [77 x i8] c"void NS::ClassTemplate<NS::Base *>::classTemplateFunction() [T = NS::Base *]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [63 x i8] c"void NS::ClassTemplate<int>::classTemplateFunction() [T = int]\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [18 x i8] c"functionTemplate1\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [53 x i8] c"void NS::Base::functionTemplate1(T) [T = NS::Base *]\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [46 x i8] c"void NS::Base::functionTemplate1(T) [T = int]\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [23 x i8] c"anonymousUnionFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::(anonymous union)::anonymousUnionFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [24 x i8] c"anonymousStructFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [85 x i8] c"void NS::ContainerForAnonymousRecords::(anonymous struct)::anonymousStructFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [23 x i8] c"anonymousClassFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::(anonymous class)::anonymousClassFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [12 x i8] c"~Destructor\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [30 x i8] c"NS::Destructor::~Destructor()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [12 x i8] c"Constructor\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [41 x i8] c"NS::Constructor::Constructor(NS::Base *)\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [34 x i8] c"NS::Constructor::Constructor(int)\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [31 x i8] c"NS::Constructor::Constructor()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [16 x i8] c"virtualFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [44 x i8] c"virtual void NS::Derived::virtualFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [21 x i8] c"refQualifiedFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [41 x i8] c"void NS::Base::refQualifiedFunction() &&\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [40 x i8] c"void NS::Base::refQualifiedFunction() &\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [22 x i8] c"constVolatileFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [54 x i8] c"void NS::Base::constVolatileFunction() const volatile\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [17 x i8] c"volatileFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [43 x i8] c"void NS::Base::volatileFunction() volatile\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [14 x i8] c"constFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [37 x i8] c"void NS::Base::constFunction() const\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [26 x i8] c"functionReturingTemplate2\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [26 x i8] c"functionReturingTemplate1\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [23 x i8] c"withTemplateParameter2\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [23 x i8] c"withTemplateParameter1\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [23 x i8] c"functionReturningClass\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [23 x i8] c"functionWithParameters\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [17 x i8] c"variadicFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [15 x i8] c"inlineFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [32 x i8] c"void NS::Base::inlineFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [15 x i8] c"staticFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [39 x i8] c"static void NS::Base::staticFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [26 x i8] c"topLevelNamespaceFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [59 x i8] c"void ClassInTopLevelNamespace::topLevelNamespaceFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [27 x i8] c"anonymousNamespaceFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [84 x i8] c"void (anonymous namespace)::ClassInAnonymousNamespace::anonymousNamespaceFunction()\00"
 | |
| 
 | |
| // CHECK-DAG: private unnamed_addr constant [19 x i8] c"localClassFunction\00"
 | |
| // CHECK-DAG: private unnamed_addr constant [59 x i8] c"void NS::localClass(int)::LocalClass::localClassFunction()\00"
 | |
| 
 | |
| 
 | |
| 
 | |
| int printf(const char * _Format, ...);
 | |
| 
 | |
| class ClassInTopLevelNamespace {
 | |
| public:
 | |
|   void topLevelNamespaceFunction() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| namespace {
 | |
| 
 | |
|   class ClassInAnonymousNamespace {
 | |
|   public:
 | |
|     void anonymousNamespaceFunction() {
 | |
|       printf("__func__ %s\n", __func__);
 | |
|       printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|     }
 | |
|   };
 | |
| 
 | |
| } // end anonymous namespace
 | |
| 
 | |
| namespace NS {
 | |
| 
 | |
| template<typename T>
 | |
| class ClassTemplate {
 | |
| public:
 | |
|   void classTemplateFunction() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| class Base {
 | |
| public:
 | |
|   static void staticFunction() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   inline void (inlineFunction)() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   virtual void virtualFunction() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   void functionWithParameters(int, float*, Base* base) {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   Base *functionReturningClass() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   void variadicFunction(int, ...) {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   void withTemplateParameter1(ClassTemplate<int>) {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   void withTemplateParameter2(ClassTemplate<Base *>) {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   ClassTemplate<int> functionReturingTemplate1() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|     return ClassTemplate<int>();
 | |
|   }
 | |
| 
 | |
|   ClassTemplate<Base *> functionReturingTemplate2() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|     return ClassTemplate<Base *>();
 | |
|   }
 | |
| 
 | |
|   template<typename T>
 | |
|   void functionTemplate1(T t) {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   void constFunction() const {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   void volatileFunction() volatile {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
|   
 | |
|   void constVolatileFunction() const volatile {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   void refQualifiedFunction() & {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   void refQualifiedFunction() && {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| class Derived : public Base {
 | |
| public:
 | |
|   // Virtual function without being explicitly written.
 | |
|   void virtualFunction() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| class Constructor {
 | |
| public:
 | |
|   Constructor() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   Constructor(int) {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| 
 | |
|   Constructor(Base *) {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| class Destructor {
 | |
| public:
 | |
|   ~Destructor() {
 | |
|     printf("__func__ %s\n", __func__);
 | |
|     printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| class ContainerForAnonymousRecords {
 | |
| public:
 | |
|   class {
 | |
|   public:
 | |
|     void anonymousClassFunction() {
 | |
|       printf("__func__ %s\n", __func__);
 | |
|       printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|     }
 | |
|   } anonymousClass;
 | |
| 
 | |
|   struct {
 | |
|     void anonymousStructFunction() {
 | |
|       printf("__func__ %s\n", __func__);
 | |
|       printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|     }
 | |
|   } anonymousStruct;
 | |
| 
 | |
|   union {
 | |
|     void anonymousUnionFunction() {
 | |
|       printf("__func__ %s\n", __func__);
 | |
|       printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|     }
 | |
|   } anonymousUnion;
 | |
| };
 | |
| 
 | |
| void localClass(int) {
 | |
|   class LocalClass {
 | |
|   public:
 | |
|     void localClassFunction() {
 | |
|       printf("__func__ %s\n", __func__);
 | |
|       printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|     }
 | |
|   };
 | |
|   LocalClass lc;
 | |
|   lc.localClassFunction();
 | |
| }
 | |
| 
 | |
| extern void externFunction() {
 | |
|   printf("__func__ %s\n", __func__);
 | |
|   printf("__FUNCTION__ %s\n", __FUNCTION__);
 | |
|   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
| }
 | |
| 
 | |
| } // end NS namespace
 | |
| 
 | |
| // additional tests for __PRETTY_FUNCTION__
 | |
| template <typename T, typename U>
 | |
| void functionTemplateWithTwoParams(T, U)
 | |
| {
 | |
|   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| void functionTemplateWithoutParameterList()
 | |
| {
 | |
|   T t = T();
 | |
| 
 | |
|   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| T functionTemplateWithTemplateReturnType()
 | |
| {
 | |
|   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
| 
 | |
|   return T();
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| T * functionTemplateWithCompoundTypes(T a[])
 | |
| {
 | |
|   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| void functionTemplateExplicitSpecialization(T t)
 | |
| {
 | |
|   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
| }
 | |
| 
 | |
| template <>
 | |
| void functionTemplateExplicitSpecialization<int>(int i)
 | |
| {
 | |
|   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
| }
 | |
| 
 | |
| template <typename, typename T>
 | |
| void functionTemplateWithUnnamedTemplateParameter(T t)
 | |
| {
 | |
|   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| void functionTemplateWithLambda(T t)
 | |
| {
 | |
|   []() {
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   } ();
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| void functionTemplateWithCapturedStmt(T t)
 | |
| {
 | |
|   #pragma clang __debug captured
 | |
|   {
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| class OuterClass
 | |
| {
 | |
| public:
 | |
|   class MiddleClass
 | |
|   {
 | |
|   public:
 | |
|     template <typename U>
 | |
|     class InnerClass
 | |
|     {
 | |
|     public:
 | |
|       void memberFunction(T x, U y) const
 | |
|       {
 | |
|         printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|       }
 | |
|     };
 | |
|   };
 | |
| };
 | |
| 
 | |
| template <typename T, template <typename> class Param = NS::ClassTemplate>
 | |
| class ClassWithTemplateTemplateParam
 | |
| {
 | |
| public:
 | |
|   static void staticMember()
 | |
|   {
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <int Count>
 | |
| class NonTypeTemplateParam
 | |
| {
 | |
| public:
 | |
|   void size() const
 | |
|   {
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <typename T>
 | |
| class SpecializedClassTemplate
 | |
| {
 | |
| public:
 | |
|   template <typename U>
 | |
|   void memberFunctionTemplate(T t, U u) const
 | |
|   {
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <>
 | |
| class SpecializedClassTemplate<int>
 | |
| {
 | |
| public:
 | |
|   template <typename U>
 | |
|   void memberFunctionTemplate(int i, U u) const
 | |
|   {
 | |
|     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
 | |
|   }
 | |
| };
 | |
| 
 | |
| int main() {
 | |
|   ClassInAnonymousNamespace anonymousNamespace;
 | |
|   anonymousNamespace.anonymousNamespaceFunction();
 | |
| 
 | |
|   ClassInTopLevelNamespace topLevelNamespace;
 | |
|   topLevelNamespace.topLevelNamespaceFunction();
 | |
| 
 | |
|   NS::Base::staticFunction();
 | |
|   
 | |
|   NS::Base b;
 | |
|   b.inlineFunction();
 | |
|   b.virtualFunction();
 | |
|   b.variadicFunction(0);
 | |
|   b.functionWithParameters(0, 0, 0);
 | |
|   b.functionReturningClass();
 | |
|   
 | |
|   b.withTemplateParameter1(NS::ClassTemplate<int>());
 | |
|   b.withTemplateParameter2(NS::ClassTemplate<NS::Base *>());
 | |
|   b.functionReturingTemplate1();
 | |
|   b.functionReturingTemplate2();
 | |
|   b.functionTemplate1<int>(0);
 | |
|   b.functionTemplate1<NS::Base *>(0);
 | |
|   b.constFunction();
 | |
|   b.volatileFunction();
 | |
|   b.constVolatileFunction();
 | |
|   b.refQualifiedFunction();
 | |
|   NS::Base().refQualifiedFunction();
 | |
| 
 | |
|   NS::Derived d;
 | |
|   d.virtualFunction();
 | |
|   
 | |
|   NS::ClassTemplate<int> t1;
 | |
|   t1.classTemplateFunction();
 | |
|   NS::ClassTemplate<NS::Base *> t2;
 | |
|   t2.classTemplateFunction();
 | |
|   
 | |
|   NS::Constructor c1;
 | |
|   NS::Constructor c2(0);
 | |
|   NS::Constructor c3((NS::Base *)0);
 | |
|   
 | |
|   {
 | |
|     NS::Destructor destructor;
 | |
|   }
 | |
| 
 | |
|   NS::ContainerForAnonymousRecords anonymous; 
 | |
|   anonymous.anonymousClass.anonymousClassFunction();
 | |
|   anonymous.anonymousStruct.anonymousStructFunction();
 | |
|   anonymous.anonymousUnion.anonymousUnionFunction();
 | |
| 
 | |
|   NS::localClass(0);
 | |
| 
 | |
|   NS::externFunction();
 | |
| 
 | |
|   // additional tests for __PRETTY_FUNCTION__
 | |
| 
 | |
|   functionTemplateWithTwoParams(0, 0.0f);
 | |
|   functionTemplateWithoutParameterList<double>();
 | |
|   functionTemplateWithTemplateReturnType<char>();
 | |
|   int array[] = { 1, 2, 3 };
 | |
|   functionTemplateWithCompoundTypes(array);
 | |
|   functionTemplateExplicitSpecialization(0);
 | |
|   functionTemplateExplicitSpecialization(0.0);
 | |
|   functionTemplateWithUnnamedTemplateParameter<int, float>(0.0f);
 | |
| 
 | |
|   functionTemplateWithLambda<int>(0);
 | |
|   functionTemplateWithCapturedStmt<int>(0);
 | |
| 
 | |
|   OuterClass<int *>::MiddleClass::InnerClass<float> omi;
 | |
|   omi.memberFunction(0, 0.0f);
 | |
| 
 | |
|   ClassWithTemplateTemplateParam<char>::staticMember();
 | |
| 
 | |
|   NonTypeTemplateParam<42> ntt;
 | |
|   ntt.size();
 | |
| 
 | |
|   SpecializedClassTemplate<int> sct1;
 | |
|   sct1.memberFunctionTemplate(0, 0.0f);
 | |
|   SpecializedClassTemplate<char> sct2;
 | |
|   sct2.memberFunctionTemplate('0', 0.0);
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| // rdar://19065361
 | |
| class XXX {
 | |
|   XXX();
 | |
|   ~XXX();
 | |
| };
 | |
| 
 | |
| void XXLog(const char *functionName) { }
 | |
| 
 | |
| typedef void (^notify_handler_t)(int token);
 | |
| 
 | |
| typedef void (^dispatch_block_t)(void);
 | |
| 
 | |
| void notify_register_dispatch(notify_handler_t handler);
 | |
| 
 | |
| void _dispatch_once(dispatch_block_t block);
 | |
| 
 | |
| XXX::XXX()
 | |
| {
 | |
|    _dispatch_once(^{ notify_register_dispatch( ^(int token) { XXLog(__FUNCTION__); }); 
 | |
|    });
 | |
| }
 | |
| // CHECK: define internal {{.*}}void @___ZN3XXXC2Ev_block_invoke_
 | |
| 
 | |
| XXX::~XXX()
 | |
| {
 | |
|    _dispatch_once(^{ notify_register_dispatch( ^(int token) { XXLog(__FUNCTION__); }); 
 | |
|    });
 | |
| }
 | |
| // CHECK: define internal {{.*}}void @___ZN3XXXD2Ev_block_invoke_
 |