blob: 68ae68fadbbb38eb91522a2a74de99a7bc2a691d [file] [log] [blame]
Douglas Gregor464a01a2012-12-01 01:01:09 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
Eli Friedman86568552012-02-14 03:07:59 +00002
Richard Smith8ae4ec22012-08-07 04:16:51 +00003// CHECK-NOT: @unused
4auto unused = [](int i) { return i+1; };
5
6// CHECK: @used = internal global
7auto used = [](int i) { return i+1; };
8void *use = &used;
Douglas Gregoree188032012-02-20 20:05:29 +00009
Douglas Gregorfa07ab52012-02-20 20:47:06 +000010// CHECK: @cvar = global
11extern "C" auto cvar = []{};
12
Eli Friedman86568552012-02-14 03:07:59 +000013int a() { return []{ return 1; }(); }
14// CHECK: define i32 @_Z1av
Douglas Gregor5878cbc2012-02-21 04:17:39 +000015// CHECK: call i32 @"_ZZ1avENK3$_0clEv"
16// CHECK: define internal i32 @"_ZZ1avENK3$_0clEv"
Eli Friedman86568552012-02-14 03:07:59 +000017// CHECK: ret i32 1
18
19int b(int x) { return [x]{return x;}(); }
20// CHECK: define i32 @_Z1bi
21// CHECK: store i32
22// CHECK: load i32*
23// CHECK: store i32
Douglas Gregor5878cbc2012-02-21 04:17:39 +000024// CHECK: call i32 @"_ZZ1biENK3$_1clEv"
25// CHECK: define internal i32 @"_ZZ1biENK3$_1clEv"
Eli Friedman86568552012-02-14 03:07:59 +000026// CHECK: load i32*
27// CHECK: ret i32
28
29int c(int x) { return [&x]{return x;}(); }
30// CHECK: define i32 @_Z1ci
31// CHECK: store i32
32// CHECK: store i32*
Douglas Gregor5878cbc2012-02-21 04:17:39 +000033// CHECK: call i32 @"_ZZ1ciENK3$_2clEv"
34// CHECK: define internal i32 @"_ZZ1ciENK3$_2clEv"
Eli Friedman86568552012-02-14 03:07:59 +000035// CHECK: load i32**
36// CHECK: load i32*
37// CHECK: ret i32
38
39struct D { D(); D(const D&); int x; };
40int d(int x) { D y[10]; [x,y] { return y[x].x; }(); }
41
42// CHECK: define i32 @_Z1di
43// CHECK: call void @_ZN1DC1Ev
44// CHECK: icmp ult i64 %{{.*}}, 10
45// CHECK: call void @_ZN1DC1ERKS_
Douglas Gregor5878cbc2012-02-21 04:17:39 +000046// CHECK: call i32 @"_ZZ1diENK3$_3clEv"
47// CHECK: define internal i32 @"_ZZ1diENK3$_3clEv"
Eli Friedman86568552012-02-14 03:07:59 +000048// CHECK: load i32*
49// CHECK: load i32*
50// CHECK: ret i32
51
52struct E { E(); E(const E&); ~E(); int x; };
53int e(E a, E b, bool cond) { [a,b,cond](){ return (cond ? a : b).x; }(); }
54// CHECK: define i32 @_Z1e1ES_b
55// CHECK: call void @_ZN1EC1ERKS_
56// CHECK: invoke void @_ZN1EC1ERKS_
Douglas Gregor5878cbc2012-02-21 04:17:39 +000057// CHECK: invoke i32 @"_ZZ1e1ES_bENK3$_4clEv"
58// CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev"
59// CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev"
Douglas Gregor27dd7d92012-02-17 03:02:34 +000060
Douglas Gregor5878cbc2012-02-21 04:17:39 +000061// CHECK: define internal i32 @"_ZZ1e1ES_bENK3$_4clEv"
Eli Friedman86568552012-02-14 03:07:59 +000062// CHECK: trunc i8
63// CHECK: load i32*
64// CHECK: ret i32
Douglas Gregor27dd7d92012-02-17 03:02:34 +000065
66void f() {
67 // CHECK: define void @_Z1fv()
Douglas Gregor5878cbc2012-02-21 04:17:39 +000068 // CHECK: @"_ZZ1fvENK3$_5cvPFiiiEEv"
Douglas Gregor27dd7d92012-02-17 03:02:34 +000069 // CHECK-NEXT: store i32 (i32, i32)*
70 // CHECK-NEXT: ret void
71 int (*fp)(int, int) = [](int x, int y){ return x + y; };
72}
73
Richard Smith5016a702012-10-20 01:38:33 +000074static int k;
75int g() {
76 int &r = k;
77 // CHECK: define internal i32 @"_ZZ1gvENK3$_6clEv"(
78 // CHECK-NOT: }
79 // CHECK: load i32* @_ZL1k,
80 return [] { return r; } ();
81};
82
Eli Friedman89e19b42013-01-03 00:39:26 +000083// PR14773
84// CHECK: [[ARRVAL:%[0-9a-zA-Z]*]] = load i32* getelementptr inbounds ([0 x i32]* bitcast (<{}>* @_ZZ14staticarrayrefvE5array to [0 x i32]*), i32 0, i64 0), align 4
85// CHECK-NEXT: store i32 [[ARRVAL]]
86void staticarrayref(){
87 static int array[] = {};
88 (void)[](){
89 int (&xxx)[0] = array;
90 int y = xxx[0];
91 }();
92}
93
Bill Wendlingc0dcc2d2013-02-15 21:30:01 +000094// CHECK: define internal void @"_ZZ1hvEN3$_88__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} {
NAKAMURA Takumi457d65a2012-12-14 02:35:04 +000095// CHECK-NOT: =
Eli Friedman89e19b42013-01-03 00:39:26 +000096// CHECK: call void @"_ZZ1hvENK3$_8clEv"(%struct.A* sret %agg.result,
Eli Friedman50f089a2012-12-13 23:37:17 +000097// CHECK-NEXT: ret void
98struct A { ~A(); };
99void h() {
100 A (*h)() = [] { return A(); };
101}
102
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000103// CHECK: define internal i32 @"_ZZ1fvEN3$_58__invokeEii"
Douglas Gregor27dd7d92012-02-17 03:02:34 +0000104// CHECK: store i32
105// CHECK-NEXT: store i32
106// CHECK-NEXT: load i32*
107// CHECK-NEXT: load i32*
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000108// CHECK-NEXT: call i32 @"_ZZ1fvENK3$_5clEii"
Douglas Gregor27dd7d92012-02-17 03:02:34 +0000109// CHECK-NEXT: ret i32
110
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000111// CHECK: define internal void @"_ZZ1e1ES_bEN3$_4D2Ev"
Douglas Gregor464a01a2012-12-01 01:01:09 +0000112
113// <rdar://problem/12778708>
114struct XXX {};
115void nestedCapture () {
116 XXX localKey;
117 ^() {
118 [&]() {
119 ^{ XXX k = localKey; };
120 };
121 };
122}