1// RUN: %clang_cc1 -triple armv7-none-eabi -emit-llvm -o - %s | FileCheck %s
2
3struct X {
4  X();
5  X(const X&);
6  X(const char*);
7  ~X();
8};
9
10struct Y {
11  int i;
12  X x;
13};
14
15// CHECK-LABEL: define i32 @_Z1fv()
16int f() {
17  // CHECK: [[LVALUE:%[a-z0-9.]+]] = alloca
18  // CHECK-NEXT: [[I:%[a-z0-9]+]] = getelementptr inbounds {{.*}}* [[LVALUE]], i32 0, i32 0
19  // CHECK-NEXT: store i32 17, i32* [[I]]
20  // CHECK-NEXT: [[X:%[a-z0-9]+]] = getelementptr inbounds {{.*}} [[LVALUE]], i32 0, i32 1
21  // CHECK-NEXT: call %struct.X* @_ZN1XC1EPKc({{.*}}[[X]]
22  // CHECK-NEXT: [[I:%[a-z0-9]+]] = getelementptr inbounds {{.*}} [[LVALUE]], i32 0, i32 0
23  // CHECK-NEXT: [[RESULT:%[a-z0-9]+]] = load i32*
24  // CHECK-NEXT: call %struct.Y* @_ZN1YD1Ev
25  // CHECK-NEXT: ret i32 [[RESULT]]
26  return ((Y){17, "seventeen"}).i;
27}
28
29// CHECK-LABEL: define i32 @_Z1gv()
30int g() {
31  // CHECK: store [2 x i32]* %{{[a-z0-9.]+}}, [2 x i32]** [[V:%[a-z0-9.]+]]
32  const int (&v)[2] = (int [2]) {1,2};
33
34  // CHECK: [[A:%[a-z0-9.]+]] = load [2 x i32]** [[V]]
35  // CHECK-NEXT: [[A0ADDR:%[a-z0-9.]+]] = getelementptr inbounds [2 x i32]* [[A]], i32 0, {{.*}} 0
36  // CHECK-NEXT: [[A0:%[a-z0-9.]+]] = load i32* [[A0ADDR]]
37  // CHECK-NEXT: ret i32 [[A0]]
38  return v[0];
39}
40
41struct Z { int i[3]; };
42int *p = (Z){ {1, 2, 3} }.i;
43// CHECK: define {{.*}}__cxx_global_var_init()
44// CHECK: store i32* getelementptr inbounds (%struct.Z* @.compoundliteral, i32 0, i32 0, i32 0), i32** @p
45