Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -std=c++11 -O1 -disable-llvm-optzns %s -o - | FileCheck %s
      2 
      3 namespace test1 {
      4   // CHECK-DAG: define linkonce_odr void @_ZN5test11fIZNS_1gEvE1SEEvT_(
      5   template <typename T> void f(T) {}
      6   inline void *g() {
      7     struct S {
      8     } s;
      9     return reinterpret_cast<void *>(f<S>);
     10   }
     11   void *h() { return g(); }
     12 }
     13 
     14 namespace test2 {
     15   // CHECK-DAG: define internal void @_ZN5test21fIZNS_L1gEvE1SEEvT_(
     16   template <typename T> void f(T) {}
     17   static inline void *g() {
     18     struct S {
     19     } s;
     20     return reinterpret_cast<void *>(f<S>);
     21   }
     22   void *h() { return g(); }
     23 }
     24 
     25 namespace test3 {
     26   // CHECK-DAG: define internal void @_ZN5test31fIZNS_1gEvE1SEEvT_(
     27   template <typename T> void f(T) {}
     28   void *g() {
     29     struct S {
     30     } s;
     31     return reinterpret_cast<void *>(f<S>);
     32   }
     33   void *h() { return g(); }
     34 }
     35 
     36 namespace test4 {
     37   // CHECK-DAG: define linkonce_odr void @_ZN5test41fIZNS_1gILi1EEEPvvE1SEEvT_(
     38   template <typename T> void f(T) {}
     39   template <int N> inline void *g() {
     40     struct S {
     41     } s;
     42     return reinterpret_cast<void *>(f<S>);
     43   }
     44   extern template void *g<1>();
     45   template void *g<1>();
     46 }
     47 
     48 namespace test5 {
     49   // CHECK-DAG: define linkonce_odr void @_ZN5test51fIZNS_1gILi1EEEPvvE1SEEvT_(
     50   template <typename T> void f(T) {}
     51   template <int N> inline void *g() {
     52     struct S {
     53     } s;
     54     return reinterpret_cast<void *>(f<S>);
     55   }
     56   extern template void *g<1>();
     57   void *h() { return g<1>(); }
     58 }
     59 
     60 namespace test6 {
     61   // CHECK-DAG: define linkonce_odr void @_ZN5test61fIZZNS_1gEvEN1S1hEvE1TEEvv(
     62   template <typename T> void f() {}
     63 
     64   inline void *g() {
     65     struct S {
     66       void *h() {
     67         struct T {
     68         };
     69         return (void *)f<T>;
     70       }
     71     } s;
     72     return s.h();
     73   }
     74 
     75   void *h() { return g(); }
     76 }
     77 
     78 namespace test7 {
     79   // CHECK-DAG: define internal void @_ZN5test71fIZZNS_1gEvEN1S1hEvE1TEEvv(
     80   template <typename T> void f() {}
     81 
     82   void *g() {
     83     struct S {
     84       void *h() {
     85         struct T {
     86         };
     87         return (void *)f<T>;
     88       }
     89     } s;
     90     return s.h();
     91   }
     92 
     93   void *h() { return g(); }
     94 }
     95 
     96 namespace test8 {
     97   // CHECK-DAG: define linkonce_odr void @_ZN5test81fIZNS_1gEvE1SEEvT_(
     98   template <typename T> void f(T) {}
     99   inline void *g() {
    100     enum S {
    101     };
    102     return reinterpret_cast<void *>(f<S>);
    103   }
    104   void *h() { return g(); }
    105 }
    106 
    107 namespace test9 {
    108   // CHECK-DAG: define linkonce_odr void @_ZN5test91fIPZNS_1gEvE1SEEvT_(
    109   template <typename T> void f(T) {}
    110   inline void *g() {
    111     struct S {
    112     } s;
    113     return reinterpret_cast<void *>(f<S*>);
    114   }
    115   void *h() { return g(); }
    116 }
    117 
    118 namespace test10 {
    119   // CHECK-DAG: define linkonce_odr void @_ZN6test101fIPFZNS_1gEvE1SvEEEvT_(
    120   template <typename T> void f(T) {}
    121   inline void *g() {
    122     struct S {
    123     } s;
    124     typedef S(*ftype)();
    125     return reinterpret_cast<void *>(f<ftype>);
    126   }
    127   void *h() { return g(); }
    128 }
    129 
    130 namespace test11 {
    131   // CHECK-DAG: define internal void @_ZN6test111fIPFZNS_1gEvE1SPNS_12_GLOBAL__N_11IEEEEvT_(
    132   namespace {
    133     struct I {
    134     };
    135   }
    136 
    137   template <typename T> void f(T) {}
    138   inline void *g() {
    139     struct S {
    140     };
    141     typedef S(*ftype)(I * x);
    142     return reinterpret_cast<void *>(f<ftype>);
    143   }
    144   void *h() { return g(); }
    145 }
    146 
    147 namespace test12 {
    148   // CHECK-DAG: define linkonce_odr void @_ZN6test123fooIZNS_3barIZNS_3zedEvE2S2EEPvvE2S1EEvv
    149   template <typename T> void foo() {}
    150   template <typename T> inline void *bar() {
    151     enum S1 {
    152     };
    153     return reinterpret_cast<void *>(foo<S1>);
    154   }
    155   inline void *zed() {
    156     enum S2 {
    157     };
    158     return reinterpret_cast<void *>(bar<S2>);
    159   }
    160   void *h() { return zed(); }
    161 }
    162 
    163 namespace test13 {
    164   // CHECK-DAG: define linkonce_odr void @_ZZN6test133fooEvEN1S3barEv(
    165   inline void *foo() {
    166     struct S {
    167       static void bar() {}
    168     };
    169     return (void *)S::bar;
    170   }
    171   void *zed() { return foo(); }
    172 }
    173 
    174 namespace test14 {
    175   // CHECK-DAG: define linkonce_odr void @_ZN6test143fooIZNS_1fEvE1SE3barILPS1_0EEEvv(
    176   template <typename T> struct foo {
    177     template <T *P> static void bar() {}
    178     static void *g() { return (void *)bar<nullptr>; }
    179   };
    180   inline void *f() {
    181     struct S {
    182     };
    183     return foo<S>::g();
    184   }
    185   void h() { f(); }
    186 }
    187 
    188 namespace test15 {
    189   // CHECK-DAG: define linkonce_odr void @_ZN6test153zedIZNS_3fooIiEEPvvE3barEEvv(
    190   template <class T> void zed() {}
    191   template <class T> void *foo() {
    192     class bar {
    193     };
    194     return reinterpret_cast<void *>(zed<bar>);
    195   }
    196   void test() { foo<int>(); }
    197 }
    198 
    199 namespace test16 {
    200   // CHECK-DAG: define linkonce_odr void @_ZN6test163zedIZNS_3fooIiE3barEvE1SEEvv(
    201   template <class T> void zed() {}
    202   template <class T> struct foo {
    203     static void *bar();
    204   };
    205   template <class T> void *foo<T>::bar() {
    206     class S {
    207     };
    208     return reinterpret_cast<void *>(zed<S>);
    209   }
    210   void *test() { return foo<int>::bar(); }
    211 }
    212 
    213 namespace test17 {
    214   // CHECK-DAG: @_ZZN6test173fooILi42EEEPivE3bar = linkonce_odr
    215   // CHECK-DAG: define weak_odr i32* @_ZN6test173fooILi42EEEPiv(
    216   template<int I>
    217   int *foo() {
    218     static int bar;
    219     return &bar;
    220   }
    221   template int *foo<42>();
    222 }
    223 
    224 // PR18408
    225 namespace test18 {
    226   template<template<typename> class> struct A {};
    227   struct B { template<typename> struct C; };
    228   void f(A<B::C>) {}
    229   // CHECK-DAG: define void @_ZN6test181fENS_1AINS_1B1CEEE(
    230 }
    231