linkage.cpp revision 8b00b8004eaffd42429ffb1f3fc9efaa3194cc15
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -std=c++11 -O1 -disable-llvm-optzns %s -o - | FileCheck %s
2
3namespace 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
14namespace test2 {
15  // CHECK-DAG: define internal void @_ZN5test21fIZNS_L1gEvE1S_0EEvT_(
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
25namespace 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
36namespace 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
48namespace test5 {
49  // CHECK-DAG: define linkonce_odr void @_ZN5test51fIZNS_1gILi1EEEPvvE1S_1EEvT_(
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
60namespace test6 {
61  // CHECK-DAG: define linkonce_odr void @_ZN5test61fIZZNS_1gEvEN1S1hE_2vE1T_3EEvv(
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
78namespace test7 {
79  // CHECK-DAG: define internal void @_ZN5test71fIZZNS_1gEvEN1S1hEvE1T_4EEvv(
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