1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-macosx10.7.0 -emit-llvm -o - %s -w | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li // CHECK-LABEL: define linkonce_odr void @_Z11inline_funci inline_func(int n)4*67e74705SXin Liinline void inline_func(int n) { 5*67e74705SXin Li // CHECK: call i32 @_ZZ11inline_funciENKUlvE_clEv 6*67e74705SXin Li int i = []{ return 1; }(); 7*67e74705SXin Li 8*67e74705SXin Li // CHECK: call i32 @_ZZ11inline_funciENKUlvE0_clEv 9*67e74705SXin Li int j = [=] { return n + i; }(); 10*67e74705SXin Li 11*67e74705SXin Li // CHECK: call double @_ZZ11inline_funciENKUlvE1_clEv 12*67e74705SXin Li int k = [=] () -> double { return n + i; }(); 13*67e74705SXin Li 14*67e74705SXin Li // CHECK: call i32 @_ZZ11inline_funciENKUliE_clEi 15*67e74705SXin Li int l = [=] (int x) -> int { return x + i; }(n); 16*67e74705SXin Li 17*67e74705SXin Li int inner(int i = []{ return 17; }()); 18*67e74705SXin Li // CHECK: call i32 @_ZZ11inline_funciENKUlvE2_clEv 19*67e74705SXin Li // CHECK-NEXT: call i32 @_Z5inneri 20*67e74705SXin Li inner(); 21*67e74705SXin Li 22*67e74705SXin Li // CHECK-NEXT: ret void 23*67e74705SXin Li } 24*67e74705SXin Li call_inline_func()25*67e74705SXin Livoid call_inline_func() { 26*67e74705SXin Li inline_func(17); 27*67e74705SXin Li } 28*67e74705SXin Li 29*67e74705SXin Li struct S { __anon55d30ce70602S30*67e74705SXin Li void f(int = []{return 1;}() __anon55d30ce70702S31*67e74705SXin Li + []{return 2;}(), __anon55d30ce70802S32*67e74705SXin Li int = []{return 3;}()); 33*67e74705SXin Li void g(int, int); 34*67e74705SXin Li }; 35*67e74705SXin Li __anon55d30ce70902null36*67e74705SXin Livoid S::g(int i = []{return 1;}(), __anon55d30ce70a02null37*67e74705SXin Li int j = []{return 2; }()) {} 38*67e74705SXin Li 39*67e74705SXin Li // CHECK-LABEL: define void @_Z6test_S1S test_S(S s)40*67e74705SXin Livoid test_S(S s) { 41*67e74705SXin Li // CHECK: call i32 @_ZZN1S1fEiiEd0_NKUlvE_clEv 42*67e74705SXin Li // CHECK-NEXT: call i32 @_ZZN1S1fEiiEd0_NKUlvE0_clEv 43*67e74705SXin Li // CHECK-NEXT: add nsw i32 44*67e74705SXin Li // CHECK-NEXT: call i32 @_ZZN1S1fEiiEd_NKUlvE_clEv 45*67e74705SXin Li // CHECK-NEXT: call void @_ZN1S1fEii 46*67e74705SXin Li s.f(); 47*67e74705SXin Li 48*67e74705SXin Li // NOTE: These manglings don't actually matter that much, because 49*67e74705SXin Li // the lambdas in the default arguments of g() won't be seen by 50*67e74705SXin Li // multiple translation units. We check them mainly to ensure that they don't 51*67e74705SXin Li // get the special mangling for lambdas in in-class default arguments. 52*67e74705SXin Li // CHECK: call i32 @"_ZNK1S3$_0clEv" 53*67e74705SXin Li // CHECK-NEXT: call i32 @"_ZNK1S3$_1clEv" 54*67e74705SXin Li // CHECK-NEXT: call void @_ZN1S1gEi 55*67e74705SXin Li s.g(); 56*67e74705SXin Li 57*67e74705SXin Li // CHECK-NEXT: ret void 58*67e74705SXin Li } 59*67e74705SXin Li 60*67e74705SXin Li // Check the linkage of the lambda call operators used in test_S. 61*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZZN1S1fEiiEd0_NKUlvE_clEv 62*67e74705SXin Li // CHECK: ret i32 1 63*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZZN1S1fEiiEd0_NKUlvE0_clEv 64*67e74705SXin Li // CHECK: ret i32 2 65*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZZN1S1fEiiEd_NKUlvE_clEv 66*67e74705SXin Li // CHECK: ret i32 3 67*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZNK1S3$_0clEv" 68*67e74705SXin Li // CHECK: ret i32 1 69*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZNK1S3$_1clEv" 70*67e74705SXin Li // CHECK: ret i32 2 71*67e74705SXin Li 72*67e74705SXin Li template<typename T> 73*67e74705SXin Li struct ST { __anon55d30ce70b02ST74*67e74705SXin Li void f(T = []{return T() + 1;}() __anon55d30ce70c02ST75*67e74705SXin Li + []{return T() + 2;}(), __anon55d30ce70d02ST76*67e74705SXin Li T = []{return T(3);}()); 77*67e74705SXin Li }; 78*67e74705SXin Li 79*67e74705SXin Li // CHECK-LABEL: define void @_Z7test_ST2STIdE test_ST(ST<double> st)80*67e74705SXin Livoid test_ST(ST<double> st) { 81*67e74705SXin Li // CHECK: call double @_ZZN2STIdE1fEddEd0_NKUlvE_clEv 82*67e74705SXin Li // CHECK-NEXT: call double @_ZZN2STIdE1fEddEd0_NKUlvE0_clEv 83*67e74705SXin Li // CHECK-NEXT: fadd double 84*67e74705SXin Li // CHECK-NEXT: call double @_ZZN2STIdE1fEddEd_NKUlvE_clEv 85*67e74705SXin Li // CHECK-NEXT: call void @_ZN2STIdE1fEdd 86*67e74705SXin Li st.f(); 87*67e74705SXin Li 88*67e74705SXin Li // CHECK-NEXT: ret void 89*67e74705SXin Li } 90*67e74705SXin Li 91*67e74705SXin Li // Check the linkage of the lambda call operators used in test_ST. 92*67e74705SXin Li // CHECK-LABEL: define linkonce_odr double @_ZZN2STIdE1fEddEd0_NKUlvE_clEv 93*67e74705SXin Li // CHECK: ret double 1 94*67e74705SXin Li // CHECK-LABEL: define linkonce_odr double @_ZZN2STIdE1fEddEd0_NKUlvE0_clEv 95*67e74705SXin Li // CHECK: ret double 2 96*67e74705SXin Li // CHECK-LABEL: define linkonce_odr double @_ZZN2STIdE1fEddEd_NKUlvE_clEv 97*67e74705SXin Li // CHECK: ret double 3 98*67e74705SXin Li 99*67e74705SXin Li template<typename T> 100*67e74705SXin Li struct StaticMembers { 101*67e74705SXin Li static T x; 102*67e74705SXin Li static T y; 103*67e74705SXin Li static T z; 104*67e74705SXin Li static int (*f)(); 105*67e74705SXin Li }; 106*67e74705SXin Li 107*67e74705SXin Li template<typename T> int accept_lambda(T); 108*67e74705SXin Li 109*67e74705SXin Li template<typename T> __anon55d30ce70f02null110*67e74705SXin LiT StaticMembers<T>::x = []{return 1;}() + []{return 2;}(); 111*67e74705SXin Li 112*67e74705SXin Li template<typename T> __anon55d30ce71002null113*67e74705SXin LiT StaticMembers<T>::y = []{return 3;}(); 114*67e74705SXin Li 115*67e74705SXin Li template<typename T> __anon55d30ce71102null116*67e74705SXin LiT StaticMembers<T>::z = accept_lambda([]{return 4;}); 117*67e74705SXin Li 118*67e74705SXin Li template<typename T> __anon55d30ce71202null119*67e74705SXin Liint (*StaticMembers<T>::f)() = []{return 5;}; 120*67e74705SXin Li 121*67e74705SXin Li // CHECK-LABEL: define internal void @__cxx_global_var_init() 122*67e74705SXin Li // CHECK: call i32 @_ZNK13StaticMembersIfE1xMUlvE_clEv 123*67e74705SXin Li // CHECK-NEXT: call i32 @_ZNK13StaticMembersIfE1xMUlvE0_clEv 124*67e74705SXin Li // CHECK-NEXT: add nsw 125*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZNK13StaticMembersIfE1xMUlvE_clEv 126*67e74705SXin Li // CHECK: ret i32 1 127*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZNK13StaticMembersIfE1xMUlvE0_clEv 128*67e74705SXin Li // CHECK: ret i32 2 129*67e74705SXin Li template float StaticMembers<float>::x; 130*67e74705SXin Li 131*67e74705SXin Li // CHECK-LABEL: define internal void @__cxx_global_var_init.1() 132*67e74705SXin Li // CHECK: call i32 @_ZNK13StaticMembersIfE1yMUlvE_clEv 133*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZNK13StaticMembersIfE1yMUlvE_clEv 134*67e74705SXin Li // CHECK: ret i32 3 135*67e74705SXin Li template float StaticMembers<float>::y; 136*67e74705SXin Li 137*67e74705SXin Li // CHECK-LABEL: define internal void @__cxx_global_var_init.2() 138*67e74705SXin Li // CHECK: call i32 @_Z13accept_lambdaIN13StaticMembersIfE1zMUlvE_EEiT_ 139*67e74705SXin Li // CHECK: declare i32 @_Z13accept_lambdaIN13StaticMembersIfE1zMUlvE_EEiT_() 140*67e74705SXin Li template float StaticMembers<float>::z; 141*67e74705SXin Li 142*67e74705SXin Li // CHECK-LABEL: define internal void @__cxx_global_var_init.3() 143*67e74705SXin Li // CHECK: call {{.*}} @_ZNK13StaticMembersIfE1fMUlvE_cvPFivEEv 144*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 ()* @_ZNK13StaticMembersIfE1fMUlvE_cvPFivEEv 145*67e74705SXin Li template int (*StaticMembers<float>::f)(); 146*67e74705SXin Li 147*67e74705SXin Li // CHECK-LABEL: define internal void @__cxx_global_var_init.4 148*67e74705SXin Li // CHECK: call i32 @"_ZNK13StaticMembersIdE3$_2clEv" 149*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZNK13StaticMembersIdE3$_2clEv" 150*67e74705SXin Li // CHECK: ret i32 42 __anon55d30ce71302null151*67e74705SXin Litemplate<> double StaticMembers<double>::z = []{return 42; }(); 152*67e74705SXin Li 153*67e74705SXin Li template<typename T> __anon55d30ce71402null154*67e74705SXin Livoid func_template(T = []{ return T(); }()); 155*67e74705SXin Li 156*67e74705SXin Li // CHECK-LABEL: define void @_Z17use_func_templatev() use_func_template()157*67e74705SXin Livoid use_func_template() { 158*67e74705SXin Li // CHECK: call i32 @"_ZZ13func_templateIiEvT_ENK3$_3clEv" 159*67e74705SXin Li func_template<int>(); 160*67e74705SXin Li } 161*67e74705SXin Li 162*67e74705SXin Li namespace std { 163*67e74705SXin Li struct type_info; 164*67e74705SXin Li } 165*67e74705SXin Li namespace PR12123 { 166*67e74705SXin Li struct A { virtual ~A(); } g; 167*67e74705SXin Li struct B { __anon55d30ce71502PR12123::B168*67e74705SXin Li void f(const std::type_info& x = typeid([]()->A& { return g; }())); 169*67e74705SXin Li void h(); 170*67e74705SXin Li }; h()171*67e74705SXin Li void B::h() { f(); } 172*67e74705SXin Li } 173*67e74705SXin Li 174*67e74705SXin Li // CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %"struct.PR12123::A"* @_ZZN7PR121231B1fERKSt9type_infoEd_NKUlvE_clEv 175*67e74705SXin Li 176*67e74705SXin Li // Check linkage of the various lambdas. 177*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE_clEv 178*67e74705SXin Li // CHECK: ret i32 1 179*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE0_clEv 180*67e74705SXin Li // CHECK: ret i32 181*67e74705SXin Li // CHECK-LABEL: define linkonce_odr double @_ZZ11inline_funciENKUlvE1_clEv 182*67e74705SXin Li // CHECK: ret double 183*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUliE_clEi 184*67e74705SXin Li // CHECK: ret i32 185*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE2_clEv 186*67e74705SXin Li // CHECK: ret i32 17 187*67e74705SXin Li 188*67e74705SXin Li // CHECK-LABEL: define linkonce_odr void @_ZN7MembersC2Ev 189*67e74705SXin Li // CHECK: call i32 @_ZNK7Members1xMUlvE_clEv 190*67e74705SXin Li // CHECK-NEXT: call i32 @_ZNK7Members1xMUlvE0_clE 191*67e74705SXin Li // CHECK-NEXT: add nsw i32 192*67e74705SXin Li // CHECK: call i32 @_ZNK7Members1yMUlvE_clEv 193*67e74705SXin Li // CHECK: ret void 194*67e74705SXin Li 195*67e74705SXin Li 196*67e74705SXin Li // Check the linkage of the lambdas used in test_Members. 197*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZNK7Members1xMUlvE_clEv 198*67e74705SXin Li // CHECK: ret i32 1 199*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZNK7Members1xMUlvE0_clEv 200*67e74705SXin Li // CHECK: ret i32 2 201*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZNK7Members1yMUlvE_clEv 202*67e74705SXin Li // CHECK: ret i32 3 203*67e74705SXin Li 204*67e74705SXin Li // CHECK-LABEL: define linkonce_odr void @_Z1fIZZNK23TestNestedInstantiationclEvENKUlvE_clEvEUlvE_EvT_ 205*67e74705SXin Li 206*67e74705SXin Li 207*67e74705SXin Li namespace PR12808 { 208*67e74705SXin Li template <typename> struct B { 209*67e74705SXin Li int a; BPR12808::B210*67e74705SXin Li template <typename L> constexpr B(L&& x) : a(x()) { } 211*67e74705SXin Li }; b(int)212*67e74705SXin Li template <typename> void b(int) { 213*67e74705SXin Li [&]{ (void)B<int>([&]{ return 1; }); }(); 214*67e74705SXin Li } f()215*67e74705SXin Li void f() { 216*67e74705SXin Li b<int>(1); 217*67e74705SXin Li } 218*67e74705SXin Li // CHECK-LABEL: define linkonce_odr void @_ZZN7PR128081bIiEEviENKUlvE_clEv 219*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32 @_ZZZN7PR128081bIiEEviENKUlvE_clEvENKUlvE_clEv 220*67e74705SXin Li } 221*67e74705SXin Li 222*67e74705SXin Li 223*67e74705SXin Li struct Members { __anon55d30ce71902Members224*67e74705SXin Li int x = [] { return 1; }() + [] { return 2; }(); __anon55d30ce71a02Members225*67e74705SXin Li int y = [] { return 3; }(); 226*67e74705SXin Li }; 227*67e74705SXin Li test_Members()228*67e74705SXin Livoid test_Members() { 229*67e74705SXin Li Members members; 230*67e74705SXin Li } 231*67e74705SXin Li f(P)232*67e74705SXin Litemplate<typename P> void f(P) { } 233*67e74705SXin Li 234*67e74705SXin Li struct TestNestedInstantiation { operator ()TestNestedInstantiation235*67e74705SXin Li void operator()() const { 236*67e74705SXin Li []() -> void { 237*67e74705SXin Li return f([]{}); 238*67e74705SXin Li }(); 239*67e74705SXin Li } 240*67e74705SXin Li }; 241*67e74705SXin Li test_NestedInstantiation()242*67e74705SXin Livoid test_NestedInstantiation() { 243*67e74705SXin Li TestNestedInstantiation()(); 244*67e74705SXin Li } 245