blob: 659b437a0ef3d5ed425a3617c512e28fcfc0b6ff [file] [log] [blame]
Douglas Gregor9e8c92a2012-02-20 19:44:39 +00001// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-macosx10.7.0 -emit-llvm -o - %s | FileCheck %s
2
Richard Smithadb1d4c2012-07-22 23:45:10 +00003// CHECK: @_ZZNK7PR12917IJiiEE1nMUlvE_clEvE1n = linkonce_odr global i32 0
Eli Friedman1cf7c3f2013-07-02 02:01:18 +00004// CHECK: @_ZZZN7PR12917IJicdEEC1EicdEd_NKUlvE_clEvE1n = linkonce_odr global i32 0
5// CHECK: @_ZZZN7PR12917IJicdEEC1EicdEd0_NKUlvE_clEvE1n = linkonce_odr global i32 0
6// CHECK: @_ZZZN7PR12917IJicdEEC1EicdEd1_NKUlvE_clEvE1n = linkonce_odr global i32 0
Richard Smithadb1d4c2012-07-22 23:45:10 +00007
Stephen Lin93ab6bf2013-08-15 06:47:53 +00008// CHECK-LABEL: define linkonce_odr void @_Z11inline_funci
Douglas Gregor9e8c92a2012-02-20 19:44:39 +00009inline void inline_func(int n) {
10 // CHECK: call i32 @_ZZ11inline_funciENKUlvE_clEv
11 int i = []{ return 1; }();
12
13 // CHECK: call i32 @_ZZ11inline_funciENKUlvE0_clEv
14 int j = [=] { return n + i; }();
15
16 // CHECK: call double @_ZZ11inline_funciENKUlvE1_clEv
17 int k = [=] () -> double { return n + i; }();
18
19 // CHECK: call i32 @_ZZ11inline_funciENKUliE_clEi
20 int l = [=] (int x) -> int { return x + i; }(n);
21
Douglas Gregor5878cbc2012-02-21 04:17:39 +000022 int inner(int i = []{ return 17; }());
Douglas Gregorccc1b5e2012-02-21 00:37:24 +000023 // CHECK: call i32 @_ZZ11inline_funciENKUlvE2_clEv
24 // CHECK-NEXT: call i32 @_Z5inneri
25 inner();
26
27 // CHECK-NEXT: ret void
Douglas Gregor9e8c92a2012-02-20 19:44:39 +000028}
29
30void call_inline_func() {
31 inline_func(17);
32}
Douglas Gregorccc1b5e2012-02-21 00:37:24 +000033
34struct S {
35 void f(int = []{return 1;}()
36 + []{return 2;}(),
37 int = []{return 3;}());
38 void g(int, int);
39};
40
41void S::g(int i = []{return 1;}(),
42 int j = []{return 2; }()) {}
43
Stephen Lin93ab6bf2013-08-15 06:47:53 +000044// CHECK-LABEL: define void @_Z6test_S1S
Douglas Gregorccc1b5e2012-02-21 00:37:24 +000045void test_S(S s) {
46 // CHECK: call i32 @_ZZN1S1fEiiEd0_NKUlvE_clEv
47 // CHECK-NEXT: call i32 @_ZZN1S1fEiiEd0_NKUlvE0_clEv
48 // CHECK-NEXT: add nsw i32
49 // CHECK-NEXT: call i32 @_ZZN1S1fEiiEd_NKUlvE_clEv
50 // CHECK-NEXT: call void @_ZN1S1fEii
51 s.f();
52
53 // NOTE: These manglings don't actually matter that much, because
54 // the lambdas in the default arguments of g() won't be seen by
55 // multiple translation units. We check them mainly to ensure that they don't
56 // get the special mangling for lambdas in in-class default arguments.
Douglas Gregor5878cbc2012-02-21 04:17:39 +000057 // CHECK: call i32 @"_ZNK1S3$_0clEv"
58 // CHECK-NEXT: call i32 @"_ZNK1S3$_1clEv"
Douglas Gregorccc1b5e2012-02-21 00:37:24 +000059 // CHECK-NEXT: call void @_ZN1S1gEi
60 s.g();
61
62 // CHECK-NEXT: ret void
63}
64
Douglas Gregor5878cbc2012-02-21 04:17:39 +000065// Check the linkage of the lambda call operators used in test_S.
Stephen Lin93ab6bf2013-08-15 06:47:53 +000066// CHECK-LABEL: define linkonce_odr i32 @_ZZN1S1fEiiEd0_NKUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +000067// CHECK: ret i32 1
Stephen Lin93ab6bf2013-08-15 06:47:53 +000068// CHECK-LABEL: define linkonce_odr i32 @_ZZN1S1fEiiEd0_NKUlvE0_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +000069// CHECK: ret i32 2
Stephen Lin93ab6bf2013-08-15 06:47:53 +000070// CHECK-LABEL: define linkonce_odr i32 @_ZZN1S1fEiiEd_NKUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +000071// CHECK: ret i32 3
Stephen Lin93ab6bf2013-08-15 06:47:53 +000072// CHECK-LABEL: define internal i32 @"_ZNK1S3$_0clEv"
Douglas Gregor5878cbc2012-02-21 04:17:39 +000073// CHECK: ret i32 1
Stephen Lin93ab6bf2013-08-15 06:47:53 +000074// CHECK-LABEL: define internal i32 @"_ZNK1S3$_1clEv"
Douglas Gregor5878cbc2012-02-21 04:17:39 +000075// CHECK: ret i32 2
76
Douglas Gregorccc1b5e2012-02-21 00:37:24 +000077template<typename T>
78struct ST {
79 void f(T = []{return T() + 1;}()
80 + []{return T() + 2;}(),
81 T = []{return T(3);}());
82};
83
Stephen Lin93ab6bf2013-08-15 06:47:53 +000084// CHECK-LABEL: define void @_Z7test_ST2STIdE
Douglas Gregorccc1b5e2012-02-21 00:37:24 +000085void test_ST(ST<double> st) {
Richard Smithadb1d4c2012-07-22 23:45:10 +000086 // CHECK: call double @_ZZN2STIdE1fEddEd0_NKUlvE_clEv
87 // CHECK-NEXT: call double @_ZZN2STIdE1fEddEd0_NKUlvE0_clEv
Douglas Gregorccc1b5e2012-02-21 00:37:24 +000088 // CHECK-NEXT: fadd double
Richard Smithadb1d4c2012-07-22 23:45:10 +000089 // CHECK-NEXT: call double @_ZZN2STIdE1fEddEd_NKUlvE_clEv
Douglas Gregorccc1b5e2012-02-21 00:37:24 +000090 // CHECK-NEXT: call void @_ZN2STIdE1fEdd
91 st.f();
92
93 // CHECK-NEXT: ret void
94}
Douglas Gregor552e2992012-02-21 02:22:07 +000095
Douglas Gregor5878cbc2012-02-21 04:17:39 +000096// Check the linkage of the lambda call operators used in test_ST.
Stephen Lin93ab6bf2013-08-15 06:47:53 +000097// CHECK-LABEL: define linkonce_odr double @_ZZN2STIdE1fEddEd0_NKUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +000098// CHECK: ret double 1
Stephen Lin93ab6bf2013-08-15 06:47:53 +000099// CHECK-LABEL: define linkonce_odr double @_ZZN2STIdE1fEddEd0_NKUlvE0_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000100// CHECK: ret double 2
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000101// CHECK-LABEL: define linkonce_odr double @_ZZN2STIdE1fEddEd_NKUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000102// CHECK: ret double 3
103
Douglas Gregor552e2992012-02-21 02:22:07 +0000104template<typename T>
105struct StaticMembers {
106 static T x;
107 static T y;
108 static T z;
Eli Friedman38fa9612013-06-13 19:39:48 +0000109 static int (*f)();
Douglas Gregor552e2992012-02-21 02:22:07 +0000110};
111
112template<typename T> int accept_lambda(T);
113
114template<typename T>
115T StaticMembers<T>::x = []{return 1;}() + []{return 2;}();
116
117template<typename T>
118T StaticMembers<T>::y = []{return 3;}();
119
120template<typename T>
121T StaticMembers<T>::z = accept_lambda([]{return 4;});
122
Eli Friedman38fa9612013-06-13 19:39:48 +0000123template<typename T>
124int (*StaticMembers<T>::f)() = []{return 5;};
125
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000126// CHECK-LABEL: define internal void @__cxx_global_var_init()
Douglas Gregor552e2992012-02-21 02:22:07 +0000127// CHECK: call i32 @_ZNK13StaticMembersIfE1xMUlvE_clEv
128// CHECK-NEXT: call i32 @_ZNK13StaticMembersIfE1xMUlvE0_clEv
129// CHECK-NEXT: add nsw
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000130// CHECK-LABEL: define linkonce_odr i32 @_ZNK13StaticMembersIfE1xMUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000131// CHECK: ret i32 1
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000132// CHECK-LABEL: define linkonce_odr i32 @_ZNK13StaticMembersIfE1xMUlvE0_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000133// CHECK: ret i32 2
Douglas Gregor552e2992012-02-21 02:22:07 +0000134template float StaticMembers<float>::x;
135
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000136// CHECK-LABEL: define internal void @__cxx_global_var_init1()
Douglas Gregor552e2992012-02-21 02:22:07 +0000137// CHECK: call i32 @_ZNK13StaticMembersIfE1yMUlvE_clEv
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000138// CHECK-LABEL: define linkonce_odr i32 @_ZNK13StaticMembersIfE1yMUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000139// CHECK: ret i32 3
Douglas Gregor552e2992012-02-21 02:22:07 +0000140template float StaticMembers<float>::y;
141
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000142// CHECK-LABEL: define internal void @__cxx_global_var_init2()
Douglas Gregor552e2992012-02-21 02:22:07 +0000143// CHECK: call i32 @_Z13accept_lambdaIN13StaticMembersIfE1zMUlvE_EEiT_
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000144// CHECK: declare i32 @_Z13accept_lambdaIN13StaticMembersIfE1zMUlvE_EEiT_()
Douglas Gregor552e2992012-02-21 02:22:07 +0000145template float StaticMembers<float>::z;
146
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000147// CHECK-LABEL: define internal void @__cxx_global_var_init3()
Eli Friedman38fa9612013-06-13 19:39:48 +0000148// CHECK: call {{.*}} @_ZNK13StaticMembersIfE1fMUlvE_cvPFivEEv
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000149// CHECK-LABEL: define linkonce_odr i32 ()* @_ZNK13StaticMembersIfE1fMUlvE_cvPFivEEv
Eli Friedman38fa9612013-06-13 19:39:48 +0000150template int (*StaticMembers<float>::f)();
151
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000152// CHECK-LABEL: define internal void @__cxx_global_var_init4
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000153// CHECK: call i32 @"_ZNK13StaticMembersIdE3$_2clEv"
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000154// CHECK-LABEL: define internal i32 @"_ZNK13StaticMembersIdE3$_2clEv"
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000155// CHECK: ret i32 42
156template<> double StaticMembers<double>::z = []{return 42; }();
157
158template<typename T>
159void func_template(T = []{ return T(); }());
160
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000161// CHECK-LABEL: define void @_Z17use_func_templatev()
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000162void use_func_template() {
Eli Friedman84431882013-07-02 17:52:28 +0000163 // CHECK: call i32 @"_ZZ13func_templateIiEvT_ENK3$_3clEv"
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000164 func_template<int>();
165}
166
Richard Smithadb1d4c2012-07-22 23:45:10 +0000167
168template<typename...T> struct PR12917 {
169 PR12917(T ...t = []{ static int n = 0; return ++n; }());
170
171 static int n[3];
172};
173template<typename...T> int PR12917<T...>::n[3] = {
174 []{ static int n = 0; return ++n; }()
175};
176
177// CHECK: call i32 @_ZZN7PR12917IJicdEEC1EicdEd1_NKUlvE_clEv(
178// CHECK: call i32 @_ZZN7PR12917IJicdEEC1EicdEd0_NKUlvE_clEv(
179// CHECK: call i32 @_ZZN7PR12917IJicdEEC1EicdEd_NKUlvE_clEv(
180// CHECK: call void @_ZN7PR12917IJicdEEC1Eicd(
181PR12917<int, char, double> pr12917;
182int *pr12917_p = PR12917<int, int>::n;
183
Eli Friedman80bfa3d2012-09-26 04:34:21 +0000184namespace std {
185 struct type_info;
186}
187namespace PR12123 {
188 struct A { virtual ~A(); } g;
189 struct B {
190 void f(const std::type_info& x = typeid([]()->A& { return g; }()));
191 void h();
192 };
193 void B::h() { f(); }
194}
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000195// CHECK-LABEL: define linkonce_odr %"struct.PR12123::A"* @_ZZN7PR121231B1fERKSt9type_infoEd_NKUlvE_clEv
Eli Friedman80bfa3d2012-09-26 04:34:21 +0000196
Eli Friedman11267a32012-09-19 01:35:20 +0000197namespace PR12808 {
198 template <typename> struct B {
199 int a;
200 template <typename L> constexpr B(L&& x) : a(x()) { }
201 };
202 template <typename> void b(int) {
203 [&]{ (void)B<int>([&]{ return 1; }); }();
204 }
205 void f() {
206 b<int>(1);
207 }
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000208 // CHECK-LABEL: define linkonce_odr void @_ZZN7PR128081bIiEEviENKUlvE_clEv
209 // CHECK-LABEL: define linkonce_odr i32 @_ZZZN7PR128081bIiEEviENKUlvE_clEvENKUlvE_clEv
Eli Friedman11267a32012-09-19 01:35:20 +0000210}
Richard Smithadb1d4c2012-07-22 23:45:10 +0000211
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000212// CHECK-LABEL: define linkonce_odr void @_Z1fIZZNK23TestNestedInstantiationclEvENKUlvE_clEvEUlvE_EvT_
Douglas Gregorf54486a2012-04-04 17:40:10 +0000213
Douglas Gregor552e2992012-02-21 02:22:07 +0000214struct Members {
215 int x = [] { return 1; }() + [] { return 2; }();
216 int y = [] { return 3; }();
217};
218
219void test_Members() {
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000220 // CHECK-LABEL: define linkonce_odr void @_ZN7MembersC2Ev
Douglas Gregor552e2992012-02-21 02:22:07 +0000221 // CHECK: call i32 @_ZNK7Members1xMUlvE_clEv
222 // CHECK-NEXT: call i32 @_ZNK7Members1xMUlvE0_clE
223 // CHECK-NEXT: add nsw i32
224 // CHECK: call i32 @_ZNK7Members1yMUlvE_clEv
225 Members members;
226 // CHECK: ret void
227}
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000228
Douglas Gregorf54486a2012-04-04 17:40:10 +0000229template<typename P> void f(P) { }
230
231struct TestNestedInstantiation {
232 void operator()() const {
233 []() -> void {
234 return f([]{});
235 }();
236 }
237};
238
239void test_NestedInstantiation() {
240 TestNestedInstantiation()();
241}
242
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000243// Check the linkage of the lambdas used in test_Members.
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000244// CHECK-LABEL: define linkonce_odr i32 @_ZNK7Members1xMUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000245// CHECK: ret i32 1
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000246// CHECK-LABEL: define linkonce_odr i32 @_ZNK7Members1xMUlvE0_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000247// CHECK: ret i32 2
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000248// CHECK-LABEL: define linkonce_odr i32 @_ZNK7Members1yMUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000249// CHECK: ret i32 3
250
251// Check linkage of the various lambdas.
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000252// CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000253// CHECK: ret i32 1
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000254// CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE0_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000255// CHECK: ret i32
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000256// CHECK-LABEL: define linkonce_odr double @_ZZ11inline_funciENKUlvE1_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000257// CHECK: ret double
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000258// CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUliE_clEi
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000259// CHECK: ret i32
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000260// CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE2_clEv
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000261// CHECK: ret i32 17