blob: a940e89c1d4cf4d0d4ce19999ae108eb1991dc36 [file] [log] [blame]
Rafael Espindolac1b38a22013-05-16 04:30:21 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -std=c++11 -O1 -disable-llvm-optzns %s -o - | FileCheck %s
2
3// CHECK: define internal void @_ZN5test31fIZNS_1gEvE1SEEvT_(
4// CHECK: define linkonce_odr void @_ZN5test41fIZNS_1gILi1EEEPvvE1SEEvT_(
5// CHECK: define linkonce_odr void @_ZN5test51fIZNS_1gILi1EEEPvvE1S_1EEvT_(
6// CHECK: define internal void @_ZN5test71fIZZNS_1gEvEN1S1hEvE1T_4EEvv(
7// CHECK: define linkonce_odr void @_ZN5test61fIZZNS_1gEvEN1S1hE_2vE1T_3EEvv(
8// CHECK: define internal void @_ZN5test21fIZNS_L1gEvE1S_0EEvT_(
9// CHECK: define linkonce_odr void @_ZN5test11fIZNS_1gEvE1SEEvT_(
10
11namespace test1 {
12 template <typename T> void f(T) {}
13 inline void *g() {
14 struct S {
15 } s;
16 return reinterpret_cast<void *>(f<S>);
17 }
18 void *h() { return g(); }
19}
20
21namespace test2 {
22 template <typename T> void f(T) {}
23 static inline void *g() {
24 struct S {
25 } s;
26 return reinterpret_cast<void *>(f<S>);
27 }
28 void *h() { return g(); }
29}
30
31namespace test3 {
32 template <typename T> void f(T) {}
33 void *g() {
34 struct S {
35 } s;
36 return reinterpret_cast<void *>(f<S>);
37 }
38 void *h() { return g(); }
39}
40
41namespace test4 {
42 template <typename T> void f(T) {}
43 template <int N> inline void *g() {
44 struct S {
45 } s;
46 return reinterpret_cast<void *>(f<S>);
47 }
48 extern template void *g<1>();
49 template void *g<1>();
50}
51
52namespace test5 {
53 template <typename T> void f(T) {}
54 template <int N> inline void *g() {
55 struct S {
56 } s;
57 return reinterpret_cast<void *>(f<S>);
58 }
59 extern template void *g<1>();
60 void *h() { return g<1>(); }
61}
62
63namespace test6 {
64 template <typename T> void f() {}
65
66 inline void *g() {
67 struct S {
68 void *h() {
69 struct T {
70 };
71 return (void *)f<T>;
72 }
73 } s;
74 return s.h();
75 }
76
77 void *h() { return g(); }
78}
79
80namespace test7 {
81 template <typename T> void f() {}
82
83 void *g() {
84 struct S {
85 void *h() {
86 struct T {
87 };
88 return (void *)f<T>;
89 }
90 } s;
91 return s.h();
92 }
93
94 void *h() { return g(); }
95}