Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 %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 
      6 // CHECK: private unnamed_addr constant [22 x i8] c"classTemplateFunction\00"
      7 // CHECK: private unnamed_addr constant [60 x i8] c"void NS::ClassTemplate<NS::Base *>::classTemplateFunction()\00"
      8 // CHECK: private unnamed_addr constant [53 x i8] c"void NS::ClassTemplate<int>::classTemplateFunction()\00"
      9 
     10 // CHECK: private unnamed_addr constant [18 x i8] c"functionTemplate1\00"
     11 // CHECK: private unnamed_addr constant [45 x i8] c"void NS::Base::functionTemplate1(NS::Base *)\00"
     12 // CHECK: private unnamed_addr constant [38 x i8] c"void NS::Base::functionTemplate1(int)\00"
     13 
     14 // CHECK: private unnamed_addr constant [23 x i8] c"anonymousUnionFunction\00"
     15 // CHECK: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous union>::anonymousUnionFunction()\00"
     16 
     17 // CHECK: private unnamed_addr constant [24 x i8] c"anonymousStructFunction\00"
     18 // CHECK: private unnamed_addr constant [85 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous struct>::anonymousStructFunction()\00"
     19 
     20 // CHECK: private unnamed_addr constant [23 x i8] c"anonymousClassFunction\00"
     21 // CHECK: private unnamed_addr constant [83 x i8] c"void NS::ContainerForAnonymousRecords::<anonymous class>::anonymousClassFunction()\00"
     22 
     23 // CHECK: private unnamed_addr constant [12 x i8] c"~Destructor\00"
     24 // CHECK: private unnamed_addr constant [30 x i8] c"NS::Destructor::~Destructor()\00"
     25 
     26 // CHECK: private unnamed_addr constant [12 x i8] c"Constructor\00"
     27 // CHECK: private unnamed_addr constant [41 x i8] c"NS::Constructor::Constructor(NS::Base *)\00"
     28 // CHECK: private unnamed_addr constant [34 x i8] c"NS::Constructor::Constructor(int)\00"
     29 // CHECK: private unnamed_addr constant [31 x i8] c"NS::Constructor::Constructor()\00"
     30 
     31 // CHECK: private unnamed_addr constant [16 x i8] c"virtualFunction\00"
     32 // CHECK: private unnamed_addr constant [44 x i8] c"virtual void NS::Derived::virtualFunction()\00"
     33 
     34 // CHECK: private unnamed_addr constant [22 x i8] c"constVolatileFunction\00"
     35 // CHECK: private unnamed_addr constant [54 x i8] c"void NS::Base::constVolatileFunction() const volatile\00"
     36 
     37 // CHECK: private unnamed_addr constant [17 x i8] c"volatileFunction\00"
     38 // CHECK: private unnamed_addr constant [43 x i8] c"void NS::Base::volatileFunction() volatile\00"
     39 
     40 // CHECK: private unnamed_addr constant [14 x i8] c"constFunction\00"
     41 // CHECK: private unnamed_addr constant [37 x i8] c"void NS::Base::constFunction() const\00"
     42 
     43 // CHECK: private unnamed_addr constant [26 x i8] c"functionReturingTemplate2\00"
     44 // CHECK: private unnamed_addr constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00"
     45 
     46 // CHECK: private unnamed_addr constant [26 x i8] c"functionReturingTemplate1\00"
     47 // CHECK: private unnamed_addr constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00"
     48 
     49 // CHECK: private unnamed_addr constant [23 x i8] c"withTemplateParameter2\00"
     50 // CHECK: private unnamed_addr constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00"
     51 
     52 // CHECK: private unnamed_addr constant [23 x i8] c"withTemplateParameter1\00"
     53 // CHECK: private unnamed_addr constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00"
     54 
     55 // CHECK: private unnamed_addr constant [23 x i8] c"functionReturningClass\00"
     56 // CHECK: private unnamed_addr constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00"
     57 
     58 // CHECK: private unnamed_addr constant [23 x i8] c"functionWithParameters\00"
     59 // CHECK: private unnamed_addr constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00"
     60 
     61 // CHECK: private unnamed_addr constant [17 x i8] c"variadicFunction\00"
     62 // CHECK: private unnamed_addr constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00"
     63 
     64 // CHECK: private unnamed_addr constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00"
     65 
     66 // CHECK: private unnamed_addr constant [15 x i8] c"inlineFunction\00"
     67 // CHECK: private unnamed_addr constant [32 x i8] c"void NS::Base::inlineFunction()\00"
     68 
     69 // CHECK: private unnamed_addr constant [15 x i8] c"staticFunction\00"
     70 // CHECK: private unnamed_addr constant [39 x i8] c"static void NS::Base::staticFunction()\00"
     71 
     72 // CHECK: private unnamed_addr constant [26 x i8] c"topLevelNamespaceFunction\00"
     73 // CHECK: private unnamed_addr constant [59 x i8] c"void ClassInTopLevelNamespace::topLevelNamespaceFunction()\00"
     74 
     75 // CHECK: private unnamed_addr constant [27 x i8] c"anonymousNamespaceFunction\00"
     76 // CHECK: private unnamed_addr constant [84 x i8] c"void <anonymous namespace>::ClassInAnonymousNamespace::anonymousNamespaceFunction()\00"
     77 
     78 // CHECK: private unnamed_addr constant [19 x i8] c"localClassFunction\00"
     79 // CHECK: private unnamed_addr constant [59 x i8] c"void NS::localClass(int)::LocalClass::localClassFunction()\00"
     80 
     81 int printf(const char * _Format, ...);
     82 
     83 class ClassInTopLevelNamespace {
     84 public:
     85   void topLevelNamespaceFunction() {
     86     printf("__func__ %s\n", __func__);
     87     printf("__FUNCTION__ %s\n", __FUNCTION__);
     88     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
     89   }
     90 };
     91 
     92 namespace {
     93 
     94   class ClassInAnonymousNamespace {
     95   public:
     96     void anonymousNamespaceFunction() {
     97       printf("__func__ %s\n", __func__);
     98       printf("__FUNCTION__ %s\n", __FUNCTION__);
     99       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    100     }
    101   };
    102 
    103 } // end anonymous namespace
    104 
    105 namespace NS {
    106 
    107 template<typename T>
    108 class ClassTemplate {
    109 public:
    110   void classTemplateFunction() {
    111     printf("__func__ %s\n", __func__);
    112     printf("__FUNCTION__ %s\n", __FUNCTION__);
    113     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    114   }
    115 };
    116 
    117 class Base {
    118 public:
    119   static void staticFunction() {
    120     printf("__func__ %s\n", __func__);
    121     printf("__FUNCTION__ %s\n", __FUNCTION__);
    122     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    123   }
    124 
    125   inline void inlineFunction() {
    126     printf("__func__ %s\n", __func__);
    127     printf("__FUNCTION__ %s\n", __FUNCTION__);
    128     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    129   }
    130 
    131   virtual void virtualFunction() {
    132     printf("__func__ %s\n", __func__);
    133     printf("__FUNCTION__ %s\n", __FUNCTION__);
    134     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    135   }
    136 
    137   void functionWithParameters(int, float*, Base* base) {
    138     printf("__func__ %s\n", __func__);
    139     printf("__FUNCTION__ %s\n", __FUNCTION__);
    140     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    141   }
    142 
    143   Base *functionReturningClass() {
    144     printf("__func__ %s\n", __func__);
    145     printf("__FUNCTION__ %s\n", __FUNCTION__);
    146     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    147     return 0;
    148   }
    149 
    150   void variadicFunction(int, ...) {
    151     printf("__func__ %s\n", __func__);
    152     printf("__FUNCTION__ %s\n", __FUNCTION__);
    153     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    154   }
    155 
    156   void withTemplateParameter1(ClassTemplate<int>) {
    157     printf("__func__ %s\n", __func__);
    158     printf("__FUNCTION__ %s\n", __FUNCTION__);
    159     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    160   }
    161 
    162   void withTemplateParameter2(ClassTemplate<Base *>) {
    163     printf("__func__ %s\n", __func__);
    164     printf("__FUNCTION__ %s\n", __FUNCTION__);
    165     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    166   }
    167 
    168   ClassTemplate<int> functionReturingTemplate1() {
    169     printf("__func__ %s\n", __func__);
    170     printf("__FUNCTION__ %s\n", __FUNCTION__);
    171     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    172     return ClassTemplate<int>();
    173   }
    174 
    175   ClassTemplate<Base *> functionReturingTemplate2() {
    176     printf("__func__ %s\n", __func__);
    177     printf("__FUNCTION__ %s\n", __FUNCTION__);
    178     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    179     return ClassTemplate<Base *>();
    180   }
    181 
    182   template<typename T>
    183   void functionTemplate1(T t) {
    184     printf("__func__ %s\n", __func__);
    185     printf("__FUNCTION__ %s\n", __FUNCTION__);
    186     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    187   }
    188 
    189   void constFunction() const {
    190     printf("__func__ %s\n", __func__);
    191     printf("__FUNCTION__ %s\n", __FUNCTION__);
    192     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    193   }
    194 
    195   void volatileFunction() volatile {
    196     printf("__func__ %s\n", __func__);
    197     printf("__FUNCTION__ %s\n", __FUNCTION__);
    198     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    199   }
    200 
    201   void constVolatileFunction() const volatile {
    202     printf("__func__ %s\n", __func__);
    203     printf("__FUNCTION__ %s\n", __FUNCTION__);
    204     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    205   }
    206 };
    207 
    208 class Derived : public Base {
    209 public:
    210   // Virtual function without being explicitally written.
    211   void virtualFunction() {
    212     printf("__func__ %s\n", __func__);
    213     printf("__FUNCTION__ %s\n", __FUNCTION__);
    214     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    215   }
    216 };
    217 
    218 class Constructor {
    219 public:
    220   Constructor() {
    221     printf("__func__ %s\n", __func__);
    222     printf("__FUNCTION__ %s\n", __FUNCTION__);
    223     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    224   }
    225 
    226   Constructor(int) {
    227     printf("__func__ %s\n", __func__);
    228     printf("__FUNCTION__ %s\n", __FUNCTION__);
    229     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    230   }
    231 
    232   Constructor(Base *) {
    233     printf("__func__ %s\n", __func__);
    234     printf("__FUNCTION__ %s\n", __FUNCTION__);
    235     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    236   }
    237 };
    238 
    239 class Destructor {
    240 public:
    241   ~Destructor() {
    242     printf("__func__ %s\n", __func__);
    243     printf("__FUNCTION__ %s\n", __FUNCTION__);
    244     printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    245   }
    246 };
    247 
    248 class ContainerForAnonymousRecords {
    249 public:
    250   class {
    251   public:
    252     void anonymousClassFunction() {
    253       printf("__func__ %s\n", __func__);
    254       printf("__FUNCTION__ %s\n", __FUNCTION__);
    255       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    256     }
    257   } anonymousClass;
    258 
    259   struct {
    260     void anonymousStructFunction() {
    261       printf("__func__ %s\n", __func__);
    262       printf("__FUNCTION__ %s\n", __FUNCTION__);
    263       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    264     }
    265   } anonymousStruct;
    266 
    267   union {
    268     void anonymousUnionFunction() {
    269       printf("__func__ %s\n", __func__);
    270       printf("__FUNCTION__ %s\n", __FUNCTION__);
    271       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    272     }
    273   } anonymousUnion;
    274 };
    275 
    276 void localClass(int) {
    277   class LocalClass {
    278   public:
    279     void localClassFunction() {
    280       printf("__func__ %s\n", __func__);
    281       printf("__FUNCTION__ %s\n", __FUNCTION__);
    282       printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    283     }
    284   };
    285   LocalClass lc;
    286   lc.localClassFunction();
    287 }
    288 
    289 extern void externFunction() {
    290   printf("__func__ %s\n", __func__);
    291   printf("__FUNCTION__ %s\n", __FUNCTION__);
    292   printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
    293 }
    294 
    295 } // end NS namespace
    296 
    297 int main() {
    298   ClassInAnonymousNamespace anonymousNamespace;
    299   anonymousNamespace.anonymousNamespaceFunction();
    300 
    301   ClassInTopLevelNamespace topLevelNamespace;
    302   topLevelNamespace.topLevelNamespaceFunction();
    303 
    304   NS::Base::staticFunction();
    305 
    306   NS::Base b;
    307   b.inlineFunction();
    308   b.virtualFunction();
    309   b.variadicFunction(0);
    310   b.functionWithParameters(0, 0, 0);
    311   b.functionReturningClass();
    312 
    313   b.withTemplateParameter1(NS::ClassTemplate<int>());
    314   b.withTemplateParameter2(NS::ClassTemplate<NS::Base *>());
    315   b.functionReturingTemplate1();
    316   b.functionReturingTemplate2();
    317   b.functionTemplate1<int>(0);
    318   b.functionTemplate1<NS::Base *>(0);
    319   b.constFunction();
    320   b.volatileFunction();
    321   b.constVolatileFunction();
    322 
    323   NS::Derived d;
    324   d.virtualFunction();
    325 
    326   NS::ClassTemplate<int> t1;
    327   t1.classTemplateFunction();
    328   NS::ClassTemplate<NS::Base *> t2;
    329   t2.classTemplateFunction();
    330 
    331   NS::Constructor c1;
    332   NS::Constructor c2(0);
    333   NS::Constructor c3((NS::Base *)0);
    334 
    335   {
    336     NS::Destructor destructor;
    337   }
    338 
    339   NS::ContainerForAnonymousRecords anonymous;
    340   anonymous.anonymousClass.anonymousClassFunction();
    341   anonymous.anonymousStruct.anonymousStructFunction();
    342   anonymous.anonymousUnion.anonymousUnionFunction();
    343 
    344   NS::localClass(0);
    345 
    346   NS::externFunction();
    347 
    348   return 0;
    349 }
    350