Skip to content

Commit a72d8d7

Browse files
committed
Update lambda mangling test to C++17
add some side effects so some (I guess guaranteed?) constant folding doesn't happen, keeping the test testing the things it was testing.. The test passes with 14, 17, and 20 - so let's just leave the version off so it might be able to be updated/used in C++20 when the default changes to C++20 in the future.
1 parent 1e054e6 commit a72d8d7

File tree

1 file changed

+25
-23
lines changed

1 file changed

+25
-23
lines changed

clang/test/CodeGenCXX/mangle-lambdas.cpp

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-macosx10.7.0 -emit-llvm -o - %s -w | FileCheck %s
1+
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.7.0 -emit-llvm -o - %s -w | FileCheck %s
2+
3+
void side_effect();
24

35
// CHECK-LABEL: define linkonce_odr void @_Z11inline_funci
46
inline void inline_func(int n) {
57
// CHECK: call noundef i32 @_ZZ11inline_funciENKUlvE_clEv
6-
int i = []{ return 1; }();
8+
int i = []{ return side_effect(), 1; }();
79

810
// CHECK: call noundef i32 @_ZZ11inline_funciENKUlvE0_clEv
911
int j = [=] { return n + i; }();
@@ -14,7 +16,7 @@ inline void inline_func(int n) {
1416
// CHECK: call noundef i32 @_ZZ11inline_funciENKUliE_clEi
1517
int l = [=] (int x) -> int { return x + i; }(n);
1618

17-
int inner(int i = []{ return 17; }());
19+
int inner(int i = []{ return side_effect(), 17; }());
1820
// CHECK: call noundef i32 @_ZZ11inline_funciENKUlvE2_clEv
1921
// CHECK-NEXT: call noundef i32 @_Z5inneri
2022
inner();
@@ -48,14 +50,14 @@ int *use_var_template = var_template<int>();
4850
void use_var_template_substitution(decltype(var_template<int>), decltype(var_template<float>)) {}
4951

5052
struct S {
51-
void f(int = []{return 1;}()
52-
+ []{return 2;}(),
53-
int = []{return 3;}());
53+
void f(int = []{return side_effect(), 1;}()
54+
+ []{return side_effect(), 2;}(),
55+
int = []{return side_effect(), 3;}());
5456
void g(int, int);
5557
};
5658

57-
void S::g(int i = []{return 1;}(),
58-
int j = []{return 2; }()) {}
59+
void S::g(int i = []{return side_effect(), 1;}(),
60+
int j = []{return side_effect(), 2; }()) {}
5961

6062
// CHECK-LABEL: define{{.*}} void @_Z6test_S1S
6163
void test_S(S s) {
@@ -128,16 +130,16 @@ struct StaticMembers {
128130
template<typename T> int accept_lambda(T);
129131

130132
template<typename T>
131-
T StaticMembers<T>::x = []{return 1;}() + []{return 2;}();
133+
T StaticMembers<T>::x = []{return side_effect(), 1;}() + []{return side_effect(), 2;}();
132134

133135
template<typename T>
134-
T StaticMembers<T>::y = []{return 3;}();
136+
T StaticMembers<T>::y = []{return side_effect(), 3;}();
135137

136138
template<typename T>
137-
T StaticMembers<T>::z = accept_lambda([]{return 4;});
139+
T StaticMembers<T>::z = accept_lambda([]{return side_effect(), 4;});
138140

139141
template<typename T>
140-
int (*StaticMembers<T>::f)() = []{return 5;};
142+
int (*StaticMembers<T>::f)() = (side_effect(), []{return side_effect(), 5;});
141143

142144
// CHECK-LABEL: define internal void @__cxx_global_var_init
143145
// CHECK: call noundef i32 @_ZNK13StaticMembersIfE1xMUlvE_clEv
@@ -169,7 +171,7 @@ template int (*StaticMembers<float>::f)();
169171
// CHECK: call noundef i32 @"_ZNK13StaticMembersIdE3$_2clEv"
170172
// CHECK-LABEL: define internal noundef i32 @"_ZNK13StaticMembersIdE3$_2clEv"
171173
// CHECK: ret i32 42
172-
template<> double StaticMembers<double>::z = []{return 42; }();
174+
template<> double StaticMembers<double>::z = []{return side_effect(), 42; }();
173175

174176
template<typename T>
175177
void func_template(T = []{ return T(); }());
@@ -212,7 +214,7 @@ int k = testVarargsLambdaNumbering();
212214

213215

214216
template<typename = int>
215-
void ft1(int = [](int p = [] { return 42; } ()) {
217+
void ft1(int = [](int p = [] { return side_effect(), 42; } ()) {
216218
return p;
217219
} ());
218220
void test_ft1() {
@@ -225,7 +227,7 @@ void test_ft1() {
225227

226228
struct c1 {
227229
template<typename = int>
228-
void mft1(int = [](int p = [] { return 42; } ()) {
230+
void mft1(int = [](int p = [] { return side_effect(), 42; } ()) {
229231
return p;
230232
} ());
231233
};
@@ -239,10 +241,10 @@ void test_c1_mft1() {
239241

240242
template<typename = int>
241243
struct ct1 {
242-
void mf1(int = [](int p = [] { return 42; } ()) {
244+
void mf1(int = [](int p = [] { return side_effect(), 42; } ()) {
243245
return p;
244246
} ());
245-
friend void ff(ct1, int = [](int p = [] { return 0; }()) { return p; }()) {}
247+
friend void ff(ct1, int = [](int p = [] { return side_effect(), 0; }()) { return p; }()) {}
246248
};
247249
void test_ct1_mft1() {
248250
// CHECK: call noundef i32 @_ZZZN3ct1IiE3mf1EiEd_NKUliE_clEiEd_NKUlvE_clEv
@@ -259,7 +261,7 @@ void test_ct1_mft1() {
259261

260262
template<typename = int>
261263
void ft2() {
262-
[](int p = [] { return 42; } ()) { return p; } ();
264+
[](int p = [] { return side_effect(), 42; } ()) { return p; } ();
263265
}
264266
template void ft2<>();
265267
// CHECK: call noundef i32 @_ZZZ3ft2IiEvvENKUliE_clEiEd_NKUlvE_clEv
@@ -269,7 +271,7 @@ template void ft2<>();
269271

270272
template<typename>
271273
void ft3() {
272-
void f(int = []{ return 0; }());
274+
void f(int = []{ return side_effect(), 0; }());
273275
f();
274276
}
275277
template void ft3<int>();
@@ -279,7 +281,7 @@ template void ft3<int>();
279281
template<typename>
280282
void ft4() {
281283
struct lc {
282-
void mf(int = []{ return 0; }()) {}
284+
void mf(int = []{ return side_effect(), 0; }()) {}
283285
};
284286
lc().mf();
285287
}
@@ -325,7 +327,7 @@ namespace PR12808 {
325327
template <typename L> constexpr B(L&& x) : a(x()) { }
326328
};
327329
template <typename> void b(int) {
328-
[&]{ (void)B<int>([&]{ return 1; }); }();
330+
[&]{ (void)B<int>([&]{ return side_effect(), 1; }); }();
329331
}
330332
void f() {
331333
b<int>(1);
@@ -336,8 +338,8 @@ namespace PR12808 {
336338

337339

338340
struct Members {
339-
int x = [] { return 1; }() + [] { return 2; }();
340-
int y = [] { return 3; }();
341+
int x = [] { return side_effect(), 1; }() + [] { return side_effect(), 2; }();
342+
int y = [] { return side_effect(), 3; }();
341343
};
342344

343345
void test_Members() {

0 commit comments

Comments
 (0)