blob: f2332bf0dc992a0931ad847d8245d1deeac1e760 [file] [log] [blame]
Stephen Hines176edba2014-12-01 14:53:08 -08001// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - | FileCheck %s
2// RUN: %clang_cc1 %s -std=c++11 -emit-pch -o %t
3// RUN: %clang_cc1 %s -std=c++11 -include-pch %t -emit-llvm -o - | FileCheck %s
4
5#ifndef HEADER
6#define HEADER
7
8typedef __INTPTR_TYPE__ intptr_t;
9
10// CHECK-DAG: [[CAP_TYPE1:%.+]] = type { [[INTPTR_T:i.+]], [[INTPTR_T]]*, [[INTPTR_T]]* }
11// CHECK-DAG: [[CAP_TYPE2:%.+]] = type { [[INTPTR_T]], [[INTPTR_T]]* }
12// CHECK-DAG: [[CAP_TYPE3:%.+]] = type { [[INTPTR_T]]*, [[INTPTR_T]], [[INTPTR_T]], [[INTPTR_T]]*, [[INTPTR_T]]* }
13// CHECK-DAG: [[CAP_TYPE4:%.+]] = type { [[INTPTR_T]]*, [[INTPTR_T]], [[INTPTR_T]]*, [[INTPTR_T]], [[INTPTR_T]]* }
14
15// CHECK: define void [[G:@.+]](
16// CHECK: [[N_ADDR:%.+]] = alloca [[INTPTR_T]]
17// CHECK: store [[INTPTR_T]] %{{.+}}, [[INTPTR_T]]* [[N_ADDR]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070018// CHECK: [[N_VAL:%.+]] = load [[INTPTR_T]], [[INTPTR_T]]* [[N_ADDR]]
19// CHECK: [[CAP_EXPR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
Stephen Hines176edba2014-12-01 14:53:08 -080020// CHECK: store [[INTPTR_T]] [[N_VAL]], [[INTPTR_T]]* [[CAP_EXPR_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070021// CHECK: [[CAP_BUFFER_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
Stephen Hines176edba2014-12-01 14:53:08 -080022// CHECK: store [[INTPTR_T]]* %{{.+}}, [[INTPTR_T]]** [[CAP_BUFFER_ADDR]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070023// CHECK: [[CAP_N_REF:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 2
Stephen Hines176edba2014-12-01 14:53:08 -080024// CHECK: store [[INTPTR_T]]* [[N_ADDR]], [[INTPTR_T]]** [[CAP_N_REF]]
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -070025// CHECK: call{{( x86_thiscallcc)?}} void [[G_LAMBDA:@.+]]([[CAP_TYPE1]]* [[CAP_ARG]])
Stephen Hines176edba2014-12-01 14:53:08 -080026// CHECK: ret void
27void g(intptr_t n) {
28 intptr_t buffer[n];
29 [&buffer, &n]() {
30 __typeof(buffer) x;
31 }();
32}
33
34// CHECK: void [[G_LAMBDA]]([[CAP_TYPE1]]*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070035// CHECK: [[THIS:%.+]] = load [[CAP_TYPE1]]*, [[CAP_TYPE1]]**
36// CHECK: [[N_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[THIS]], i{{.+}} 0, i{{.+}} 0
37// CHECK: [[N:%.+]] = load [[INTPTR_T]], [[INTPTR_T]]* [[N_ADDR]]
38// CHECK: [[BUFFER_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[THIS]], i{{.+}} 0, i{{.+}} 1
39// CHECK: [[BUFFER:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[BUFFER_ADDR]]
Stephen Hines176edba2014-12-01 14:53:08 -080040// CHECK: call i{{.+}}* @llvm.stacksave()
41// CHECK: alloca [[INTPTR_T]], [[INTPTR_T]] [[N]]
42// CHECK: call void @llvm.stackrestore(
43// CHECK: ret void
44
45template <typename T>
46void f(T n, T m) {
47 intptr_t buffer[n + m];
48 [&buffer]() {
49 __typeof(buffer) x;
50 }();
51}
52
53template <typename T>
54intptr_t getSize(T);
55
56template <typename T>
57void b(intptr_t n, T arg) {
58 typedef intptr_t ArrTy[getSize(arg)];
59 ArrTy buffer2;
60 ArrTy buffer1[n + arg];
61 intptr_t a;
62 [&]() {
63 n = sizeof(buffer1[n]);
64 [&](){
65 n = sizeof(buffer2);
66 n = sizeof(buffer1);
67 }();
68 }();
69}
70
71// CHECK-LABEL: @main
72int main() {
Stephen Hines0e2c34f2015-03-23 12:09:02 -070073 // CHECK: call void [[G]]([[INTPTR_T]] [[INTPTR_T_ATTR:(signext )?]]1)
Stephen Hines176edba2014-12-01 14:53:08 -080074 g((intptr_t)1);
Stephen Hines0e2c34f2015-03-23 12:09:02 -070075 // CHECK: call void [[F_INT:@.+]]([[INTPTR_T]] [[INTPTR_T_ATTR]]1, [[INTPTR_T]] [[INTPTR_T_ATTR]]2)
Stephen Hines176edba2014-12-01 14:53:08 -080076 f((intptr_t)1, (intptr_t)2);
Stephen Hines0e2c34f2015-03-23 12:09:02 -070077 // CHECK: call void [[B_INT:@.+]]([[INTPTR_T]] [[INTPTR_T_ATTR]]12, [[INTPTR_T]] [[INTPTR_T_ATTR]]13)
Stephen Hines176edba2014-12-01 14:53:08 -080078 b((intptr_t)12, (intptr_t)13);
79 // CHECK: ret i32 0
80 return 0;
81}
82
Stephen Hines0e2c34f2015-03-23 12:09:02 -070083// CHECK: define linkonce_odr void [[F_INT]]([[INTPTR_T]]
Stephen Hines176edba2014-12-01 14:53:08 -080084// CHECK: [[SIZE:%.+]] = add
85// CHECK: call i{{.+}}* @llvm.stacksave()
86// CHECK: [[BUFFER_ADDR:%.+]] = alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070087// CHECK: [[CAP_SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
Stephen Hines176edba2014-12-01 14:53:08 -080088// CHECK: store [[INTPTR_T]] [[SIZE]], [[INTPTR_T]]* [[CAP_SIZE_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070089// CHECK: [[CAP_BUFFER_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
Stephen Hines176edba2014-12-01 14:53:08 -080090// CHECK: store [[INTPTR_T]]* [[BUFFER_ADDR]], [[INTPTR_T]]** [[CAP_BUFFER_ADDR_REF]]
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -070091// CHECK: call{{( x86_thiscallcc)?}} void [[F_INT_LAMBDA:@.+]]([[CAP_TYPE2]]* [[CAP_ARG]])
Stephen Hines176edba2014-12-01 14:53:08 -080092// CHECK: call void @llvm.stackrestore(
93// CHECK: ret void
94// CHECK: void [[B_INT]]([[INTPTR_T]]
95// CHECK: [[SIZE1:%.+]] = call [[INTPTR_T]]
96// CHECK: call i{{.+}}* @llvm.stacksave()
97// CHECK: [[BUFFER2_ADDR:%.+]] = alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE1]]
98// CHECK: [[SIZE2:%.+]] = add
99// CHECK: [[BUFFER1_ADDR:%.+]] = alloca [[INTPTR_T]], [[INTPTR_T]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700100// CHECK: [[CAP_N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
Stephen Hines176edba2014-12-01 14:53:08 -0800101// CHECK: store [[INTPTR_T]]* {{%.+}}, [[INTPTR_T]]** [[CAP_N_ADDR_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700102// CHECK: [[CAP_SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
Stephen Hines176edba2014-12-01 14:53:08 -0800103// CHECK: store i{{[0-9]+}} [[SIZE2]], i{{[0-9]+}}* [[CAP_SIZE2_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700104// CHECK: [[CAP_SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 2
Stephen Hines176edba2014-12-01 14:53:08 -0800105// CHECK: store i{{[0-9]+}} [[SIZE1]], i{{[0-9]+}}* [[CAP_SIZE1_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700106// CHECK: [[CAP_BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 3
Stephen Hines176edba2014-12-01 14:53:08 -0800107// CHECK: store [[INTPTR_T]]* [[BUFFER1_ADDR]], [[INTPTR_T]]** [[CAP_BUFFER1_ADDR_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700108// CHECK: [[CAP_BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 4
Stephen Hines176edba2014-12-01 14:53:08 -0800109// CHECK: store [[INTPTR_T]]* [[BUFFER2_ADDR]], [[INTPTR_T]]** [[CAP_BUFFER2_ADDR_REF]]
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700110// CHECK: call{{( x86_thiscallcc)?}} void [[B_INT_LAMBDA:@.+]]([[CAP_TYPE3]]* [[CAP_ARG]])
Stephen Hines176edba2014-12-01 14:53:08 -0800111// CHECK: call void @llvm.stackrestore(
112// CHECK: ret void
113
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700114// CHECK: define linkonce_odr{{( x86_thiscallcc)?}} void [[F_INT_LAMBDA]]([[CAP_TYPE2]]*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700115// CHECK: [[THIS:%.+]] = load [[CAP_TYPE2]]*, [[CAP_TYPE2]]**
116// CHECK: [[SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[THIS]], i{{.+}} 0, i{{.+}} 0
117// CHECK: [[SIZE:%.+]] = load [[INTPTR_T]], [[INTPTR_T]]* [[SIZE_REF]]
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700118// CHECK: call i{{.+}}* @llvm.stacksave()
119// CHECK: alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE]]
120// CHECK: call void @llvm.stackrestore(
121// CHECK: ret void
122
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700123// CHECK: define linkonce_odr{{( x86_thiscallcc)?}} void [[B_INT_LAMBDA]]([[CAP_TYPE3]]*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700124// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
125// CHECK: [[SIZE2:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIZE2_REF]]
126// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
127// CHECK: [[SIZE1:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIZE1_REF]]
128// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
129// CHECK: [[N_ADDR:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[N_ADDR_REF]]
130// CHECK: [[N:%.+]] = load [[INTPTR_T]], [[INTPTR_T]]* [[N_ADDR]]
131// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
132// CHECK: [[BUFFER1_ADDR:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[BUFFER1_ADDR_REF]]
Stephen Hines176edba2014-12-01 14:53:08 -0800133// CHECK: [[ELEM_OFFSET:%.+]] = mul {{.*}} i{{[0-9]+}} [[N]], [[SIZE1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700134// CHECK: [[ELEM_ADDR:%.+]] = getelementptr inbounds [[INTPTR_T]], [[INTPTR_T]]* [[BUFFER1_ADDR]], i{{[0-9]+}} [[ELEM_OFFSET]]
Stephen Hines176edba2014-12-01 14:53:08 -0800135// CHECK: [[SIZEOF:%.+]] = mul {{.*}} i{{[0-9]+}} {{[0-9]+}}, [[SIZE1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700136// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
137// CHECK: [[N_ADDR:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[N_ADDR_REF]]
Stephen Hines176edba2014-12-01 14:53:08 -0800138// CHECK: store [[INTPTR_T]] {{%.+}}, [[INTPTR_T]]* [[N_ADDR]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700139// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
140// CHECK: [[N_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
141// CHECK: [[N_ADDR_ORIG:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[N_ADDR_REF_ORIG]]
Stephen Hines176edba2014-12-01 14:53:08 -0800142// CHECK: store [[INTPTR_T]]* [[N_ADDR_ORIG]], [[INTPTR_T]]** [[N_ADDR_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700143// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
Stephen Hines176edba2014-12-01 14:53:08 -0800144// CHECK: store i{{[0-9]+}} [[SIZE1]], i{{[0-9]+}}* [[SIZE1_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700145// CHECK: [[BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
146// CHECK: [[BUFFER2_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
147// CHECK: [[BUFFER2_ADDR_ORIG:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[BUFFER2_ADDR_REF_ORIG]]
Stephen Hines176edba2014-12-01 14:53:08 -0800148// CHECK: store [[INTPTR_T]]* [[BUFFER2_ADDR_ORIG]], [[INTPTR_T]]** [[BUFFER2_ADDR_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700149// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
Stephen Hines176edba2014-12-01 14:53:08 -0800150// CHECK: store i{{[0-9]+}} [[SIZE2]], i{{[0-9]+}}* [[SIZE2_REF]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700151// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
152// CHECK: [[BUFFER1_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
153// CHECK: [[BUFFER1_ADDR_ORIG:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[BUFFER1_ADDR_REF_ORIG]]
Stephen Hines176edba2014-12-01 14:53:08 -0800154// CHECK: store [[INTPTR_T]]* [[BUFFER1_ADDR_ORIG]], [[INTPTR_T]]** [[BUFFER1_ADDR_REF]]
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700155// CHECK: call{{( x86_thiscallcc)?}} void [[B_INT_LAMBDA_LAMBDA:@.+]]([[CAP_TYPE4]]* [[CAP]])
Stephen Hines176edba2014-12-01 14:53:08 -0800156// CHECK: ret void
157
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700158// CHECK: define linkonce_odr{{( x86_thiscallcc)?}} void [[B_INT_LAMBDA_LAMBDA]]([[CAP_TYPE4]]*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700159// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[THIS:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
160// CHECK: [[SIZE1:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIZE1_REF]]
161// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
162// CHECK: [[SIZE2:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIZE2_REF]]
163// CHECK: [[BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
164// CHECK: [[BUFFER2_ADDR:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[BUFFER2_ADDR_REF]]
Stephen Hines176edba2014-12-01 14:53:08 -0800165// CHECK: [[SIZEOF_BUFFER2:%.+]] = mul {{.*}} i{{[0-9]+}} {{[0-9]+}}, [[SIZE1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700166// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
167// CHECK: [[BUFFER1_ADDR:%.+]] = load [[INTPTR_T]]*, [[INTPTR_T]]** [[BUFFER1_ADDR_REF]]
Stephen Hines176edba2014-12-01 14:53:08 -0800168// CHECK: [[MUL:%.+]] = mul {{.*}} i{{[0-9]+}} [[SIZE2]], [[SIZE1]]
169// CHECK: mul {{.*}} i{{[0-9]+}} {{[0-9]+}}, [[MUL]]
170// CHECK: ret void
Stephen Hines176edba2014-12-01 14:53:08 -0800171#endif