1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li // CHECK-NOT: @unused
__anon3369ef030102(int i) 4*67e74705SXin Li auto unused = [](int i) { return i+1; };
5*67e74705SXin Li
6*67e74705SXin Li // CHECK: @used = internal global
__anon3369ef030202(int i) 7*67e74705SXin Li auto used = [](int i) { return i+1; };
8*67e74705SXin Li void *use = &used;
9*67e74705SXin Li
10*67e74705SXin Li // CHECK: @cvar = global
__anon3369ef030302null11*67e74705SXin Li extern "C" auto cvar = []{};
12*67e74705SXin Li
13*67e74705SXin Li // CHECK-LABEL: define i32 @_Z9ARBSizeOfi(i32
ARBSizeOf(int n)14*67e74705SXin Li int ARBSizeOf(int n) {
15*67e74705SXin Li typedef double(T)[8][n];
16*67e74705SXin Li using TT = double[8][n];
17*67e74705SXin Li return [&]() -> int {
18*67e74705SXin Li typedef double(T1)[8][n];
19*67e74705SXin Li using TT1 = double[8][n];
20*67e74705SXin Li return [&n]() -> int {
21*67e74705SXin Li typedef double(T2)[8][n];
22*67e74705SXin Li using TT2 = double[8][n];
23*67e74705SXin Li return sizeof(T) + sizeof(T1) + sizeof(T2) + sizeof(TT) + sizeof(TT1) + sizeof(TT2);
24*67e74705SXin Li }();
25*67e74705SXin Li }();
26*67e74705SXin Li }
27*67e74705SXin Li
28*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZZ9ARBSizeOfiENK3$_0clEv"
29*67e74705SXin Li
a()30*67e74705SXin Li int a() { return []{ return 1; }(); }
31*67e74705SXin Li // CHECK-LABEL: define i32 @_Z1av
32*67e74705SXin Li // CHECK: call i32 @"_ZZ1avENK3$_1clEv"
33*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZZ1avENK3$_1clEv"
34*67e74705SXin Li // CHECK: ret i32 1
35*67e74705SXin Li
b(int x)36*67e74705SXin Li int b(int x) { return [x]{return x;}(); }
37*67e74705SXin Li // CHECK-LABEL: define i32 @_Z1bi
38*67e74705SXin Li // CHECK: store i32
39*67e74705SXin Li // CHECK: load i32, i32*
40*67e74705SXin Li // CHECK: store i32
41*67e74705SXin Li // CHECK: call i32 @"_ZZ1biENK3$_2clEv"
42*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZZ1biENK3$_2clEv"
43*67e74705SXin Li // CHECK: load i32, i32*
44*67e74705SXin Li // CHECK: ret i32
45*67e74705SXin Li
c(int x)46*67e74705SXin Li int c(int x) { return [&x]{return x;}(); }
47*67e74705SXin Li // CHECK-LABEL: define i32 @_Z1ci
48*67e74705SXin Li // CHECK: store i32
49*67e74705SXin Li // CHECK: store i32*
50*67e74705SXin Li // CHECK: call i32 @"_ZZ1ciENK3$_3clEv"
51*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZZ1ciENK3$_3clEv"
52*67e74705SXin Li // CHECK: load i32*, i32**
53*67e74705SXin Li // CHECK: load i32, i32*
54*67e74705SXin Li // CHECK: ret i32
55*67e74705SXin Li
56*67e74705SXin Li struct D { D(); D(const D&); int x; };
__anon3369ef030902null57*67e74705SXin Li int d(int x) { D y[10]; [x,y] { return y[x].x; }(); }
58*67e74705SXin Li
59*67e74705SXin Li // CHECK-LABEL: define i32 @_Z1di
60*67e74705SXin Li // CHECK: call void @_ZN1DC1Ev
61*67e74705SXin Li // CHECK: icmp ult i64 %{{.*}}, 10
62*67e74705SXin Li // CHECK: call void @_ZN1DC1ERKS_
63*67e74705SXin Li // CHECK: call i32 @"_ZZ1diENK3$_4clEv"
64*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZZ1diENK3$_4clEv"
65*67e74705SXin Li // CHECK: load i32, i32*
66*67e74705SXin Li // CHECK: load i32, i32*
67*67e74705SXin Li // CHECK: ret i32
68*67e74705SXin Li
69*67e74705SXin Li struct E { E(); E(const E&); ~E(); int x; };
e(E a,E b,bool cond)70*67e74705SXin Li int e(E a, E b, bool cond) { [a,b,cond](){ return (cond ? a : b).x; }(); }
71*67e74705SXin Li // CHECK-LABEL: define i32 @_Z1e1ES_b
72*67e74705SXin Li // CHECK: call void @_ZN1EC1ERKS_
73*67e74705SXin Li // CHECK: invoke void @_ZN1EC1ERKS_
74*67e74705SXin Li // CHECK: invoke i32 @"_ZZ1e1ES_bENK3$_5clEv"
75*67e74705SXin Li // CHECK: call void @"_ZZ1e1ES_bEN3$_5D1Ev"
76*67e74705SXin Li // CHECK: call void @"_ZZ1e1ES_bEN3$_5D1Ev"
77*67e74705SXin Li
78*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZZ1e1ES_bENK3$_5clEv"
79*67e74705SXin Li // CHECK: trunc i8
80*67e74705SXin Li // CHECK: load i32, i32*
81*67e74705SXin Li // CHECK: ret i32
82*67e74705SXin Li
f()83*67e74705SXin Li void f() {
84*67e74705SXin Li // CHECK-LABEL: define void @_Z1fv()
85*67e74705SXin Li // CHECK: @"_ZZ1fvENK3$_6cvPFiiiEEv"
86*67e74705SXin Li // CHECK-NEXT: store i32 (i32, i32)*
87*67e74705SXin Li // CHECK-NEXT: ret void
88*67e74705SXin Li int (*fp)(int, int) = [](int x, int y){ return x + y; };
89*67e74705SXin Li }
90*67e74705SXin Li
91*67e74705SXin Li static int k;
g()92*67e74705SXin Li int g() {
93*67e74705SXin Li int &r = k;
94*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZZ1gvENK3$_7clEv"(
95*67e74705SXin Li // CHECK-NOT: }
96*67e74705SXin Li // CHECK: load i32, i32* @_ZL1k,
97*67e74705SXin Li return [] { return r; } ();
98*67e74705SXin Li };
99*67e74705SXin Li
100*67e74705SXin Li // PR14773
101*67e74705SXin Li // CHECK: [[ARRVAL:%[0-9a-zA-Z]*]] = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @_ZZ14staticarrayrefvE5array, i64 0, i64 0), align 4
102*67e74705SXin Li // CHECK-NEXT: store i32 [[ARRVAL]]
staticarrayref()103*67e74705SXin Li void staticarrayref(){
104*67e74705SXin Li static int array[] = {};
105*67e74705SXin Li (void)[](){
106*67e74705SXin Li int (&xxx)[0] = array;
107*67e74705SXin Li int y = xxx[0];
108*67e74705SXin Li }();
109*67e74705SXin Li }
110*67e74705SXin Li
111*67e74705SXin Li // CHECK-LABEL: define internal i32* @"_ZZ11PR22071_funvENK3$_9clEv"
112*67e74705SXin Li // CHECK: ret i32* @PR22071_var
113*67e74705SXin Li int PR22071_var;
PR22071_fun()114*67e74705SXin Li int *PR22071_fun() {
115*67e74705SXin Li constexpr int &y = PR22071_var;
116*67e74705SXin Li return [&] { return &y; }();
117*67e74705SXin Li }
118*67e74705SXin Li
119*67e74705SXin Li // CHECK-LABEL: define internal void @"_ZZ1e1ES_bEN3$_5D2Ev"
120*67e74705SXin Li
121*67e74705SXin Li // CHECK-LABEL: define internal i32 @"_ZZ1fvEN3$_68__invokeEii"
122*67e74705SXin Li // CHECK: store i32
123*67e74705SXin Li // CHECK-NEXT: store i32
124*67e74705SXin Li // CHECK-NEXT: load i32, i32*
125*67e74705SXin Li // CHECK-NEXT: load i32, i32*
126*67e74705SXin Li // CHECK-NEXT: call i32 @"_ZZ1fvENK3$_6clEii"
127*67e74705SXin Li // CHECK-NEXT: ret i32
128*67e74705SXin Li
129*67e74705SXin Li // CHECK-LABEL: define internal void @"_ZZ1hvEN4$_108__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} {
130*67e74705SXin Li // CHECK-NOT: =
131*67e74705SXin Li // CHECK: call void @"_ZZ1hvENK4$_10clEv"(%struct.A* sret %agg.result,
132*67e74705SXin Li // CHECK-NEXT: ret void
133*67e74705SXin Li struct A { ~A(); };
h()134*67e74705SXin Li void h() {
135*67e74705SXin Li A (*h)() = [] { return A(); };
136*67e74705SXin Li }
137*67e74705SXin Li
138*67e74705SXin Li // <rdar://problem/12778708>
139*67e74705SXin Li struct XXX {};
nestedCapture()140*67e74705SXin Li void nestedCapture () {
141*67e74705SXin Li XXX localKey;
142*67e74705SXin Li ^() {
143*67e74705SXin Li [&]() {
144*67e74705SXin Li ^{ XXX k = localKey; };
145*67e74705SXin Li };
146*67e74705SXin Li };
147*67e74705SXin Li }
148*67e74705SXin Li
149*67e74705SXin Li // Ensure we don't assert here.
150*67e74705SXin Li struct CaptureArrayAndThis {
CaptureArrayAndThisCaptureArrayAndThis151*67e74705SXin Li CaptureArrayAndThis() {
152*67e74705SXin Li char array[] = "floop";
153*67e74705SXin Li [array, this] {};
154*67e74705SXin Li }
155*67e74705SXin Li } capture_array_and_this;
156*67e74705SXin Li
157