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