Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / CodeGenCXX / linkage.cpp
blob2918f027f57af4f589800f1397354210d9888a1c
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -std=c++11 -O1 -disable-llvm-passes %s -o - | FileCheck %s
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>);
11 void *h() { return g(); }
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>);
22 void *h() { return g(); }
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>);
33 void *h() { return g(); }
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>);
44 extern template void *g<1>();
45 template void *g<1>();
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>);
56 extern template void *g<1>();
57 void *h() { return g<1>(); }
60 namespace test6 {
61 // CHECK-DAG: define linkonce_odr void @_ZN5test61fIZZNS_1gEvEN1S1hEvE1TEEvv(
62 template <typename T> void f() {}
64 inline void *g() {
65 struct S {
66 void *h() {
67 struct T {
69 return (void *)f<T>;
71 } s;
72 return s.h();
75 void *h() { return g(); }
78 namespace test7 {
79 // CHECK-DAG: define internal void @_ZN5test71fIZZNS_1gEvEN1S1hEvE1TEEvv(
80 template <typename T> void f() {}
82 void *g() {
83 struct S {
84 void *h() {
85 struct T {
87 return (void *)f<T>;
89 } s;
90 return s.h();
93 void *h() { return g(); }
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 {
102 return reinterpret_cast<void *>(f<S>);
104 void *h() { return g(); }
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*>);
115 void *h() { return g(); }
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>);
127 void *h() { return g(); }
130 namespace test11 {
131 // CHECK-DAG: define internal void @_ZN6test111fIPFZNS_1gEvE1SPNS_12_GLOBAL__N_11IEEEEvT_(
132 namespace {
133 struct I {
137 template <typename T> void f(T) {}
138 inline void *g() {
139 struct S {
141 typedef S(*ftype)(I * x);
142 return reinterpret_cast<void *>(f<ftype>);
144 void *h() { return g(); }
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 {
153 return reinterpret_cast<void *>(foo<S1>);
155 inline void *zed() {
156 enum S2 {
158 return reinterpret_cast<void *>(bar<S2>);
160 void *h() { return zed(); }
163 namespace test13 {
164 // CHECK-DAG: define linkonce_odr void @_ZZN6test133fooEvEN1S3barEv(
165 inline void *foo() {
166 struct S {
167 static void bar() {}
169 return (void *)S::bar;
171 void *zed() { return foo(); }
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>; }
180 inline void *f() {
181 struct S {
183 return foo<S>::g();
185 void h() { f(); }
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 {
194 return reinterpret_cast<void *>(zed<bar>);
196 void test() { foo<int>(); }
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();
205 template <class T> void *foo<T>::bar() {
206 class S {
208 return reinterpret_cast<void *>(zed<S>);
210 void *test() { return foo<int>::bar(); }
213 namespace test17 {
214 // CHECK-DAG: @_ZZN6test173fooILi42EEEPivE3bar = linkonce_odr
215 // CHECK-DAG: define weak_odr noundef ptr @_ZN6test173fooILi42EEEPiv(
216 template<int I>
217 int *foo() {
218 static int bar;
219 return &bar;
221 template int *foo<42>();
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(