19e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-macosx10.7.0 -emit-llvm -o - %s | FileCheck %s
29e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
3adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: @_ZZNK7PR12917IJiiEE1nMUlvE_clEvE1n = linkonce_odr global i32 0
4adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: @_ZZN7PR12917IJicdEEC1EicdEd_N1nE = linkonce_odr global i32 0
5adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: @_ZZN7PR12917IJicdEEC1EicdEd0_N1nE = linkonce_odr global i32 0
6adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: @_ZZN7PR12917IJicdEEC1EicdEd1_N1nE = linkonce_odr global i32 0
7adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith
89e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// CHECK: define linkonce_odr void @_Z11inline_funci
99e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorinline void inline_func(int n) {
109e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  // CHECK: call i32 @_ZZ11inline_funciENKUlvE_clEv
119e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  int i = []{ return 1; }();
129e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
139e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  // CHECK: call i32 @_ZZ11inline_funciENKUlvE0_clEv
149e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  int j = [=] { return n + i; }();
159e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
169e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  // CHECK: call double @_ZZ11inline_funciENKUlvE1_clEv
179e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  int k = [=] () -> double { return n + i; }();
189e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
199e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  // CHECK: call i32 @_ZZ11inline_funciENKUliE_clEi
209e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  int l = [=] (int x) -> int { return x + i; }(n);
219e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
225878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor  int inner(int i = []{ return 17; }());
23ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK: call i32 @_ZZ11inline_funciENKUlvE2_clEv
24ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: call i32 @_Z5inneri
25ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  inner();
26ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
27ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: ret void
289e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor}
299e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
309e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorvoid call_inline_func() {
319e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  inline_func(17);
329e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor}
33ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
34ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregorstruct S {
35ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  void f(int = []{return 1;}()
36ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor             + []{return 2;}(),
37ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor         int = []{return 3;}());
38ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  void g(int, int);
39ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor};
40ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
41ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregorvoid S::g(int i = []{return 1;}(),
42ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor          int j = []{return 2; }()) {}
43ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
44ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor// CHECK: define void @_Z6test_S1S
45ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregorvoid test_S(S s) {
46ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK: call i32 @_ZZN1S1fEiiEd0_NKUlvE_clEv
47ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: call i32 @_ZZN1S1fEiiEd0_NKUlvE0_clEv
48ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: add nsw i32
49ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: call i32 @_ZZN1S1fEiiEd_NKUlvE_clEv
50ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: call void @_ZN1S1fEii
51ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  s.f();
52ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
53ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // NOTE: These manglings don't actually matter that much, because
54ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // the lambdas in the default arguments of g() won't be seen by
55ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // multiple translation units. We check them mainly to ensure that they don't
56ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // get the special mangling for lambdas in in-class default arguments.
575878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor  // CHECK: call i32 @"_ZNK1S3$_0clEv"
585878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor  // CHECK-NEXT: call i32 @"_ZNK1S3$_1clEv"
59ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: call void @_ZN1S1gEi
60ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  s.g();
61ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
62ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: ret void
63ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor}
64ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
655878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// Check the linkage of the lambda call operators used in test_S.
665878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZZN1S1fEiiEd0_NKUlvE_clEv
675878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 1
685878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZZN1S1fEiiEd0_NKUlvE0_clEv
695878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 2
705878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZZN1S1fEiiEd_NKUlvE_clEv
715878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 3
725878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define internal i32 @"_ZNK1S3$_0clEv"
735878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 1
745878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define internal i32 @"_ZNK1S3$_1clEv"
755878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 2
765878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor
77ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregortemplate<typename T>
78ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregorstruct ST {
79ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  void f(T = []{return T() + 1;}()
80ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor           + []{return T() + 2;}(),
81ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor         T = []{return T(3);}());
82ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor};
83ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
84ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor// CHECK: define void @_Z7test_ST2STIdE
85ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregorvoid test_ST(ST<double> st) {
86adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith  // CHECK: call double @_ZZN2STIdE1fEddEd0_NKUlvE_clEv
87adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith  // CHECK-NEXT: call double @_ZZN2STIdE1fEddEd0_NKUlvE0_clEv
88ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: fadd double
89adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith  // CHECK-NEXT: call double @_ZZN2STIdE1fEddEd_NKUlvE_clEv
90ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: call void @_ZN2STIdE1fEdd
91ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  st.f();
92ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor
93ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor  // CHECK-NEXT: ret void
94ccc1b5eebc6ca8a904c58c0468b9a71483b7c7cfDouglas Gregor}
95552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
965878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// Check the linkage of the lambda call operators used in test_ST.
97adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: define linkonce_odr double @_ZZN2STIdE1fEddEd0_NKUlvE_clEv
985878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret double 1
99adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: define linkonce_odr double @_ZZN2STIdE1fEddEd0_NKUlvE0_clEv
1005878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret double 2
101adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: define linkonce_odr double @_ZZN2STIdE1fEddEd_NKUlvE_clEv
1025878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret double 3
1035878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor
104552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregortemplate<typename T>
105552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregorstruct StaticMembers {
106552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  static T x;
107552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  static T y;
108552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  static T z;
109552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor};
110552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
111552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregortemplate<typename T> int accept_lambda(T);
112552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
113552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregortemplate<typename T>
114552e29985a710f4ced62b39d70557501bd31ca9bDouglas GregorT StaticMembers<T>::x = []{return 1;}() + []{return 2;}();
115552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
116552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregortemplate<typename T>
117552e29985a710f4ced62b39d70557501bd31ca9bDouglas GregorT StaticMembers<T>::y = []{return 3;}();
118552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
119552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregortemplate<typename T>
120552e29985a710f4ced62b39d70557501bd31ca9bDouglas GregorT StaticMembers<T>::z = accept_lambda([]{return 4;});
121552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
122552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor// CHECK: define internal void @__cxx_global_var_init()
123552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor// CHECK: call i32 @_ZNK13StaticMembersIfE1xMUlvE_clEv
124552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor// CHECK-NEXT: call i32 @_ZNK13StaticMembersIfE1xMUlvE0_clEv
125552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor// CHECK-NEXT: add nsw
1265878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZNK13StaticMembersIfE1xMUlvE_clEv
1275878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 1
1285878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZNK13StaticMembersIfE1xMUlvE0_clEv
1295878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 2
130552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregortemplate float StaticMembers<float>::x;
131552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
132552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor// CHECK: define internal void @__cxx_global_var_init1()
133552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor// CHECK: call i32 @_ZNK13StaticMembersIfE1yMUlvE_clEv
1345878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZNK13StaticMembersIfE1yMUlvE_clEv
1355878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 3
136552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregortemplate float StaticMembers<float>::y;
137552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
138552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor// CHECK: define internal void @__cxx_global_var_init2()
139552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor// CHECK: call i32 @_Z13accept_lambdaIN13StaticMembersIfE1zMUlvE_EEiT_
1405878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: declare i32 @_Z13accept_lambdaIN13StaticMembersIfE1zMUlvE_EEiT_()
141552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregortemplate float StaticMembers<float>::z;
142552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
1435878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define internal void @__cxx_global_var_init3
1445878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: call i32 @"_ZNK13StaticMembersIdE3$_2clEv"
1455878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define internal i32 @"_ZNK13StaticMembersIdE3$_2clEv"
1465878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 42
1475878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregortemplate<> double StaticMembers<double>::z = []{return 42; }();
1485878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor
1495878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregortemplate<typename T>
1505878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregorvoid func_template(T = []{ return T(); }());
1515878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor
1525878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define void @_Z17use_func_templatev()
1535878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregorvoid use_func_template() {
1545878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor  // CHECK: call i32 @"_ZZ13func_templateIiEvT_ENKS_IiE3$_3clEv"
1555878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor  func_template<int>();
1565878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor}
1575878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor
158adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith
159adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smithtemplate<typename...T> struct PR12917 {
160adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith  PR12917(T ...t = []{ static int n = 0; return ++n; }());
161adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith
162adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith  static int n[3];
163adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith};
164adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smithtemplate<typename...T> int PR12917<T...>::n[3] = {
165adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith  []{ static int n = 0; return ++n; }()
166adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith};
167adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith
168adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: call i32 @_ZZN7PR12917IJicdEEC1EicdEd1_NKUlvE_clEv(
169adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: call i32 @_ZZN7PR12917IJicdEEC1EicdEd0_NKUlvE_clEv(
170adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: call i32 @_ZZN7PR12917IJicdEEC1EicdEd_NKUlvE_clEv(
171adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith// CHECK: call void @_ZN7PR12917IJicdEEC1Eicd(
172adb1d4c18ee83249d4cffc99ef902f98e846092aRichard SmithPR12917<int, char, double> pr12917;
173adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smithint *pr12917_p = PR12917<int, int>::n;
174adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith
17580bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedmannamespace std {
17680bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman  struct type_info;
17780bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman}
17880bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedmannamespace PR12123 {
17980bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman  struct A { virtual ~A(); } g;
18080bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman  struct B {
18180bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman    void f(const std::type_info& x = typeid([]()->A& { return g; }()));
18280bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman    void h();
18380bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman  };
18480bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman  void B::h() { f(); }
18580bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman}
18680bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman// CHECK: define linkonce_odr %"struct.PR12123::A"* @_ZZN7PR121231B1fERKSt9type_infoEd_NKUlvE_clEv
18780bfa3d125fa0b9c636977ea37b4a55b2c9b1037Eli Friedman
18811267a32029b0095ba4b9799a64a2133e234037fEli Friedmannamespace PR12808 {
18911267a32029b0095ba4b9799a64a2133e234037fEli Friedman  template <typename> struct B {
19011267a32029b0095ba4b9799a64a2133e234037fEli Friedman    int a;
19111267a32029b0095ba4b9799a64a2133e234037fEli Friedman    template <typename L> constexpr B(L&& x) : a(x()) { }
19211267a32029b0095ba4b9799a64a2133e234037fEli Friedman  };
19311267a32029b0095ba4b9799a64a2133e234037fEli Friedman  template <typename> void b(int) {
19411267a32029b0095ba4b9799a64a2133e234037fEli Friedman    [&]{ (void)B<int>([&]{ return 1; }); }();
19511267a32029b0095ba4b9799a64a2133e234037fEli Friedman  }
19611267a32029b0095ba4b9799a64a2133e234037fEli Friedman  void f() {
19711267a32029b0095ba4b9799a64a2133e234037fEli Friedman    b<int>(1);
19811267a32029b0095ba4b9799a64a2133e234037fEli Friedman  }
19911267a32029b0095ba4b9799a64a2133e234037fEli Friedman  // CHECK: define linkonce_odr void @_ZZN7PR128081bIiEEviENKS0_IiEUlvE_clEv
20011267a32029b0095ba4b9799a64a2133e234037fEli Friedman  // CHECK: define linkonce_odr i32 @_ZZZN7PR128081bIiEEviENKS0_IiEUlvE_clEvENKUlvE_clEv
20111267a32029b0095ba4b9799a64a2133e234037fEli Friedman}
202adb1d4c18ee83249d4cffc99ef902f98e846092aRichard Smith
203f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor// CHECK: define linkonce_odr void @_Z1fIZZNK23TestNestedInstantiationclEvENKUlvE_clEvEUlvE_EvT_
204f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor
205552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregorstruct Members {
206552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  int x = [] { return 1; }() + [] { return 2; }();
207552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  int y = [] { return 3; }();
208552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor};
209552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor
210552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregorvoid test_Members() {
211552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  // CHECK: define linkonce_odr void @_ZN7MembersC2Ev
212552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  // CHECK: call i32 @_ZNK7Members1xMUlvE_clEv
213552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  // CHECK-NEXT: call i32 @_ZNK7Members1xMUlvE0_clE
214552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  // CHECK-NEXT: add nsw i32
215552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  // CHECK: call i32 @_ZNK7Members1yMUlvE_clEv
216552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  Members members;
217552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor  // CHECK: ret void
218552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor}
2195878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor
220f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregortemplate<typename P> void f(P) { }
221f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor
222f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregorstruct TestNestedInstantiation {
223f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor   void operator()() const {
224f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor     []() -> void {
225f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor       return f([]{});
226f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor     }();
227f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor   }
228f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor};
229f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor
230f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregorvoid test_NestedInstantiation() {
231f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor  TestNestedInstantiation()();
232f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor}
233f54486acc1cadf2791c3916ece66fded1e57ba0bDouglas Gregor
2345878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// Check the linkage of the lambdas used in test_Members.
2355878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZNK7Members1xMUlvE_clEv
2365878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 1
2375878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZNK7Members1xMUlvE0_clEv
2385878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 2
2395878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZNK7Members1yMUlvE_clEv
2405878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 3
2415878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor
2425878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// Check linkage of the various lambdas.
2435878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE_clEv
2445878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 1
2455878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE0_clEv
2465878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32
2475878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr double @_ZZ11inline_funciENKUlvE1_clEv
2485878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret double
2495878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZZ11inline_funciENKUliE_clEi
2505878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32
2515878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE2_clEv
2525878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor// CHECK: ret i32 17
253