| // RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - | FileCheck %s |
| |
| // CHECK: private unnamed_addr constant [15 x i8] c"externFunction\00" |
| // CHECK: private unnamed_addr constant [26 x i8] c"void NS::externFunction()\00" |
| // CHECK: private unnamed_addr constant [49 x i8] c"void functionTemplateExplicitSpecialization(int)\00" |
| |
| // CHECK: private unnamed_addr constant [95 x i8] c"void SpecializedClassTemplate<char>::memberFunctionTemplate(T, U) const [T = char, U = double]\00" |
| // CHECK: private unnamed_addr constant [85 x i8] c"void SpecializedClassTemplate<int>::memberFunctionTemplate(int, U) const [U = float]\00" |
| // CHECK: private unnamed_addr constant [57 x i8] c"void NonTypeTemplateParam<42>::size() const [Count = 42]\00" |
| // CHECK: private unnamed_addr constant [122 x i8] c"static void ClassWithTemplateTemplateParam<char, NS::ClassTemplate>::staticMember() [T = char, Param = NS::ClassTemplate]\00" |
| // CHECK: private unnamed_addr constant [106 x i8] c"void OuterClass<int *>::MiddleClass::InnerClass<float>::memberFunction(T, U) const [T = int *, U = float]\00" |
| // CHECK: private unnamed_addr constant [51 x i8] c"void functionTemplateWithCapturedStmt(T) [T = int]\00" |
| // CHECK: private unnamed_addr constant [76 x i8] c"auto functionTemplateWithLambda(int)::<anonymous class>::operator()() const\00" |
| // CHECK: private unnamed_addr constant [65 x i8] c"void functionTemplateWithUnnamedTemplateParameter(T) [T = float]\00" |
| |
| // CHECK: private unnamed_addr constant [60 x i8] c"void functionTemplateExplicitSpecialization(T) [T = double]\00" |
| // CHECK: private unnamed_addr constant [52 x i8] c"T *functionTemplateWithCompoundTypes(T *) [T = int]\00" |
| // CHECK: private unnamed_addr constant [54 x i8] c"T functionTemplateWithTemplateReturnType() [T = char]\00" |
| // CHECK: private unnamed_addr constant [57 x i8] c"void functionTemplateWithoutParameterList() [T = double]\00" |
| // CHECK: private unnamed_addr constant [62 x i8] c"void functionTemplateWithTwoParams(T, U) [T = int, U = float]\00" |
| |
| // CHECK: private unnamed_addr constant [22 x i8] c"classTemplateFunction\00" |
| // CHECK: private unnamed_addr constant [77 x i8] c"void NS::ClassTemplate<NS::Base *>::classTemplateFunction() [T = NS::Base *]\00" |
| // CHECK: private unnamed_addr constant [63 x i8] c"void NS::ClassTemplate<int>::classTemplateFunction() [T = int]\00" |
| |
| // CHECK: private unnamed_addr constant [18 x i8] c"functionTemplate1\00" |
| // CHECK: private unnamed_addr constant [53 x i8] c"void NS::Base::functionTemplate1(T) [T = NS::Base *]\00" |
| // CHECK: private unnamed_addr constant [46 x i8] c"void NS::Base::functionTemplate1(T) [T = int]\00" |
| |
| // CHECK: private unnamed_addr constant [23 x i8] c"anonymousUnionFunction\00" |
| // CHECK: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous union>::anonymousUnionFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [24 x i8] c"anonymousStructFunction\00" |
| // CHECK: private unnamed_addr constant [85 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous struct>::anonymousStructFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [23 x i8] c"anonymousClassFunction\00" |
| // CHECK: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous class>::anonymousClassFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [12 x i8] c"~Destructor\00" |
| // CHECK: private unnamed_addr constant [30 x i8] c"NS::Destructor::~Destructor()\00" |
| |
| // CHECK: private unnamed_addr constant [12 x i8] c"Constructor\00" |
| // CHECK: private unnamed_addr constant [41 x i8] c"NS::Constructor::Constructor(NS::Base *)\00" |
| // CHECK: private unnamed_addr constant [34 x i8] c"NS::Constructor::Constructor(int)\00" |
| // CHECK: private unnamed_addr constant [31 x i8] c"NS::Constructor::Constructor()\00" |
| |
| // CHECK: private unnamed_addr constant [16 x i8] c"virtualFunction\00" |
| // CHECK: private unnamed_addr constant [44 x i8] c"virtual void NS::Derived::virtualFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [21 x i8] c"refQualifiedFunction\00" |
| // CHECK: private unnamed_addr constant [41 x i8] c"void NS::Base::refQualifiedFunction() &&\00" |
| // CHECK: private unnamed_addr constant [40 x i8] c"void NS::Base::refQualifiedFunction() &\00" |
| |
| // CHECK: private unnamed_addr constant [22 x i8] c"constVolatileFunction\00" |
| // CHECK: private unnamed_addr constant [54 x i8] c"void NS::Base::constVolatileFunction() const volatile\00" |
| |
| // CHECK: private unnamed_addr constant [17 x i8] c"volatileFunction\00" |
| // CHECK: private unnamed_addr constant [43 x i8] c"void NS::Base::volatileFunction() volatile\00" |
| |
| // CHECK: private unnamed_addr constant [14 x i8] c"constFunction\00" |
| // CHECK: private unnamed_addr constant [37 x i8] c"void NS::Base::constFunction() const\00" |
| |
| // CHECK: private unnamed_addr constant [26 x i8] c"functionReturingTemplate2\00" |
| // CHECK: private unnamed_addr constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00" |
| |
| // CHECK: private unnamed_addr constant [26 x i8] c"functionReturingTemplate1\00" |
| // CHECK: private unnamed_addr constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00" |
| |
| // CHECK: private unnamed_addr constant [23 x i8] c"withTemplateParameter2\00" |
| // CHECK: private unnamed_addr constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00" |
| |
| // CHECK: private unnamed_addr constant [23 x i8] c"withTemplateParameter1\00" |
| // CHECK: private unnamed_addr constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00" |
| |
| // CHECK: private unnamed_addr constant [23 x i8] c"functionReturningClass\00" |
| // CHECK: private unnamed_addr constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00" |
| |
| // CHECK: private unnamed_addr constant [23 x i8] c"functionWithParameters\00" |
| // CHECK: private unnamed_addr constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00" |
| |
| // CHECK: private unnamed_addr constant [17 x i8] c"variadicFunction\00" |
| // CHECK: private unnamed_addr constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00" |
| |
| // CHECK: private unnamed_addr constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [15 x i8] c"inlineFunction\00" |
| // CHECK: private unnamed_addr constant [32 x i8] c"void NS::Base::inlineFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [15 x i8] c"staticFunction\00" |
| // CHECK: private unnamed_addr constant [39 x i8] c"static void NS::Base::staticFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [26 x i8] c"topLevelNamespaceFunction\00" |
| // CHECK: private unnamed_addr constant [59 x i8] c"void ClassInTopLevelNamespace::topLevelNamespaceFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [27 x i8] c"anonymousNamespaceFunction\00" |
| // CHECK: private unnamed_addr constant [84 x i8] c"void <anonymous namespace>::ClassInAnonymousNamespace::anonymousNamespaceFunction()\00" |
| |
| // CHECK: private unnamed_addr constant [19 x i8] c"localClassFunction\00" |
| // CHECK: 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; |
| } |