]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGenCXX/lambda-expressions.cpp
Vendor import of clang trunk r238337:
[FreeBSD/FreeBSD.git] / test / CodeGenCXX / lambda-expressions.cpp
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
2
3 // CHECK-NOT: @unused
4 auto unused = [](int i) { return i+1; };
5
6 // CHECK: @used = internal global
7 auto used = [](int i) { return i+1; };
8 void *use = &used;
9
10 // CHECK: @cvar = global
11 extern "C" auto cvar = []{};
12
13 int a() { return []{ return 1; }(); }
14 // CHECK-LABEL: define i32 @_Z1av
15 // CHECK: call i32 @"_ZZ1avENK3$_0clEv"
16 // CHECK-LABEL: define internal i32 @"_ZZ1avENK3$_0clEv"
17 // CHECK: ret i32 1
18
19 int b(int x) { return [x]{return x;}(); }
20 // CHECK-LABEL: define i32 @_Z1bi
21 // CHECK: store i32
22 // CHECK: load i32, i32*
23 // CHECK: store i32
24 // CHECK: call i32 @"_ZZ1biENK3$_1clEv"
25 // CHECK-LABEL: define internal i32 @"_ZZ1biENK3$_1clEv"
26 // CHECK: load i32, i32*
27 // CHECK: ret i32
28
29 int c(int x) { return [&x]{return x;}(); }
30 // CHECK-LABEL: define i32 @_Z1ci
31 // CHECK: store i32
32 // CHECK: store i32*
33 // CHECK: call i32 @"_ZZ1ciENK3$_2clEv"
34 // CHECK-LABEL: define internal i32 @"_ZZ1ciENK3$_2clEv"
35 // CHECK: load i32*, i32**
36 // CHECK: load i32, i32*
37 // CHECK: ret i32
38
39 struct D { D(); D(const D&); int x; };
40 int d(int x) { D y[10]; [x,y] { return y[x].x; }(); }
41
42 // CHECK-LABEL: define i32 @_Z1di
43 // CHECK: call void @_ZN1DC1Ev
44 // CHECK: icmp ult i64 %{{.*}}, 10
45 // CHECK: call void @_ZN1DC1ERKS_
46 // CHECK: call i32 @"_ZZ1diENK3$_3clEv"
47 // CHECK-LABEL: define internal i32 @"_ZZ1diENK3$_3clEv"
48 // CHECK: load i32, i32*
49 // CHECK: load i32, i32*
50 // CHECK: ret i32
51
52 struct E { E(); E(const E&); ~E(); int x; };
53 int e(E a, E b, bool cond) { [a,b,cond](){ return (cond ? a : b).x; }(); }
54 // CHECK-LABEL: define i32 @_Z1e1ES_b
55 // CHECK: call void @_ZN1EC1ERKS_
56 // CHECK: invoke void @_ZN1EC1ERKS_
57 // CHECK: invoke i32 @"_ZZ1e1ES_bENK3$_4clEv"
58 // CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev"
59 // CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev"
60
61 // CHECK-LABEL: define internal i32 @"_ZZ1e1ES_bENK3$_4clEv"
62 // CHECK: trunc i8
63 // CHECK: load i32, i32*
64 // CHECK: ret i32
65
66 void f() {
67   // CHECK-LABEL: define void @_Z1fv()
68   // CHECK: @"_ZZ1fvENK3$_5cvPFiiiEEv"
69   // 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
74 static int k;
75 int g() {
76   int &r = k;
77   // CHECK-LABEL: define internal i32 @"_ZZ1gvENK3$_6clEv"(
78   // CHECK-NOT: }
79   // CHECK: load i32, i32* @_ZL1k,
80   return [] { return r; } ();
81 };
82
83 // PR14773
84 // CHECK: [[ARRVAL:%[0-9a-zA-Z]*]] = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @_ZZ14staticarrayrefvE5array, i32 0, i64 0), align 4
85 // CHECK-NEXT: store i32 [[ARRVAL]]
86 void staticarrayref(){
87   static int array[] = {};
88   (void)[](){
89     int (&xxx)[0] = array;
90     int y = xxx[0];
91   }();
92 }
93
94 // CHECK-LABEL: define internal i32* @"_ZZ11PR22071_funvENK3$_8clEv"
95 // CHECK: ret i32* @PR22071_var
96 int PR22071_var;
97 int *PR22071_fun() {
98   constexpr int &y = PR22071_var;
99   return [&] { return &y; }();
100 }
101
102 // CHECK-LABEL: define internal void @"_ZZ1e1ES_bEN3$_4D2Ev"
103
104 // CHECK-LABEL: define internal i32 @"_ZZ1fvEN3$_58__invokeEii"
105 // CHECK: store i32
106 // CHECK-NEXT: store i32
107 // CHECK-NEXT: load i32, i32*
108 // CHECK-NEXT: load i32, i32*
109 // CHECK-NEXT: call i32 @"_ZZ1fvENK3$_5clEii"
110 // CHECK-NEXT: ret i32
111
112 // CHECK-LABEL: define internal void @"_ZZ1hvEN3$_98__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} {
113 // CHECK-NOT: =
114 // CHECK: call void @"_ZZ1hvENK3$_9clEv"(%struct.A* sret %agg.result,
115 // CHECK-NEXT: ret void
116 struct A { ~A(); };
117 void h() {
118   A (*h)() = [] { return A(); };
119 }
120
121 // <rdar://problem/12778708>
122 struct XXX {};
123 void nestedCapture () {
124   XXX localKey;
125   ^() {
126     [&]() {
127       ^{ XXX k = localKey; };
128     };
129   };
130 }
131
132 // Ensure we don't assert here.
133 struct CaptureArrayAndThis {
134   CaptureArrayAndThis() {
135     char array[] = "floop";
136     [array, this] {};
137   }
138 } capture_array_and_this;
139