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