xref: /llvm-project/clang/test/CodeGenCXX/cxx0x-initializer-array.cpp (revision c5de4dd1eab00df76c1a68c5f397304ceacb71f2)
1 // RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -emit-llvm -o - %s -Wno-address-of-temporary | FileCheck %s
2 
3 // CHECK: @[[THREE_NULL_MEMPTRS:.*]] = private constant [3 x i32] [i32 -1, i32 -1, i32 -1]
4 
5 struct A { int a[1]; };
6 typedef A x[];
f()7 int f() {
8   x{{{1}}};
9   // CHECK-LABEL: define{{.*}} i32 @_Z1fv
10   // CHECK: store i32 1
11   // (It's okay if the output changes here, as long as we don't crash.)
12   return 0;
13 }
14 
15 namespace ValueInitArrayOfMemPtr {
16   struct S {};
17   typedef int (S::*p);
18   typedef p a[3];
19   void f(const a &);
20 
21   struct Agg1 {
22     int n;
23     p x;
24   };
25 
26   struct Agg2 {
27     int n;
28     a x;
29   };
30 
31   struct S1 {
32     p x;
33     S1();
34   };
35 
36   // CHECK-LABEL: define{{.*}} void @_ZN22ValueInitArrayOfMemPtr1fEi
f(int n)37   void f(int n) {
38     Agg1 a = { n };
39     // CHECK: store i32 -1,
40 
41     Agg2 b = { n };
42     // CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %{{.*}}, ptr align 4 @[[THREE_NULL_MEMPTRS]], i32 12, i1 false)
43   }
44 
45   // Test dynamic initialization.
46   // CHECK-LABEL: define{{.*}} void @_ZN22ValueInitArrayOfMemPtr1gEMNS_1SEi
g(p ptr)47   void g(p ptr) {
48     // CHECK: store i32 -1,
49     f(a{ptr});
50   }
51 }
52 
53 namespace array_dtor {
54   struct S { S(); ~S(); };
55   using T = S[3];
56   void f(const T &);
57   void f(T *);
58   // CHECK-LABEL: define{{.*}} void @_ZN10array_dtor1gEv(
g()59   void g() {
60     // CHECK: %[[ARRAY:.*]] = alloca [3 x
61     // CHECK: br
62 
63     // Construct loop.
64     // CHECK: call void @_ZN10array_dtor1SC1Ev(
65     // CHECK: br i1
66 
67     // CHECK: call void @_ZN10array_dtor1fERA3_KNS_1SE(
68     // CHECK: br
69 
70     // Destruct loop.
71     // CHECK: call void @_ZN10array_dtor1SD1Ev(
72     // CHECK: br i1
73     f(T{});
74 
75     // CHECK: ret void
76   }
77   // CHECK-LABEL: define{{.*}} void @_ZN10array_dtor1hEv(
h()78   void h() {
79     // CHECK: %[[ARRAY:.*]] = alloca [3 x
80     // CHECK: br
81 
82     // CHECK: call void @_ZN10array_dtor1SC1Ev(
83     // CHECK: br i1
84     T &&t = T{};
85 
86     // CHECK: call void @_ZN10array_dtor1fERA3_KNS_1SE(
87     // CHECK: br
88     f(t);
89 
90     // CHECK: call void @_ZN10array_dtor1SD1Ev(
91     // CHECK: br i1
92 
93     // CHECK: ret void
94   }
95   // CHECK-LABEL: define{{.*}} void @_ZN10array_dtor1iEv(
i()96   void i() {
97     // CHECK: %[[ARRAY:.*]] = alloca [3 x
98     // CHECK: br
99 
100     // CHECK: call void @_ZN10array_dtor1SC1Ev(
101     // CHECK: br i1
102 
103     // CHECK: call void @_ZN10array_dtor1fEPA3_NS_1SE(
104     // CHECK: br
105 
106     // CHECK: call void @_ZN10array_dtor1SD1Ev(
107     // CHECK: br i1
108     f(&T{});
109 
110     // CHECK: ret void
111   }
112 }
113