blob: a8967dce80231269586ca268d0b9bb059d0b2a76 [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 Friedman50f089a2012-12-13 23:37:17 +000083// CHECK: define internal void @"_ZZ1hvEN3$_78__invokeEv"(%struct.A* noalias sret %agg.result)
NAKAMURA Takumi457d65a2012-12-14 02:35:04 +000084// CHECK-NOT: =
85// CHECK: call void @"_ZZ1hvENK3$_7clEv"(%struct.A* sret %agg.result,
Eli Friedman50f089a2012-12-13 23:37:17 +000086// CHECK-NEXT: ret void
87struct A { ~A(); };
88void h() {
89 A (*h)() = [] { return A(); };
90}
91
Douglas Gregor5878cbc2012-02-21 04:17:39 +000092// CHECK: define internal i32 @"_ZZ1fvEN3$_58__invokeEii"
Douglas Gregor27dd7d92012-02-17 03:02:34 +000093// CHECK: store i32
94// CHECK-NEXT: store i32
95// CHECK-NEXT: load i32*
96// CHECK-NEXT: load i32*
Douglas Gregor5878cbc2012-02-21 04:17:39 +000097// CHECK-NEXT: call i32 @"_ZZ1fvENK3$_5clEii"
Douglas Gregor27dd7d92012-02-17 03:02:34 +000098// CHECK-NEXT: ret i32
99
Douglas Gregor5878cbc2012-02-21 04:17:39 +0000100// CHECK: define internal void @"_ZZ1e1ES_bEN3$_4D2Ev"
Douglas Gregor464a01a2012-12-01 01:01:09 +0000101
102// <rdar://problem/12778708>
103struct XXX {};
104void nestedCapture () {
105 XXX localKey;
106 ^() {
107 [&]() {
108 ^{ XXX k = localKey; };
109 };
110 };
111}