1 // RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -S -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[];
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
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.p0i8.p0i8.i32(i8* %{{.*}}, i8* bitcast ([3 x i32]* @[[THREE_NULL_MEMPTRS]] to i8*), i32 12, i32 4, i1 false)
43   }
44 
45   // CHECK-LABEL: define void @_ZN22ValueInitArrayOfMemPtr1gEv
46   void g() {
47     // CHECK: store i32 -1,
48     f(a{});
49   }
50 }
51 
52 namespace array_dtor {
53   struct S { S(); ~S(); };
54   using T = S[3];
55   void f(const T &);
56   void f(T *);
57   // CHECK-LABEL: define void @_ZN10array_dtor1gEv(
58   void g() {
59     // CHECK: %[[ARRAY:.*]] = alloca [3 x
60     // CHECK: br
61 
62     // Construct loop.
63     // CHECK: call void @_ZN10array_dtor1SC1Ev(
64     // CHECK: br i1
65 
66     // CHECK: call void @_ZN10array_dtor1fERA3_KNS_1SE(
67     // CHECK: br
68 
69     // Destruct loop.
70     // CHECK: call void @_ZN10array_dtor1SD1Ev(
71     // CHECK: br i1
72     f(T{});
73 
74     // CHECK: ret void
75   }
76   // CHECK-LABEL: define void @_ZN10array_dtor1hEv(
77   void h() {
78     // CHECK: %[[ARRAY:.*]] = alloca [3 x
79     // CHECK: br
80 
81     // CHECK: call void @_ZN10array_dtor1SC1Ev(
82     // CHECK: br i1
83     T &&t = T{};
84 
85     // CHECK: call void @_ZN10array_dtor1fERA3_KNS_1SE(
86     // CHECK: br
87     f(t);
88 
89     // CHECK: call void @_ZN10array_dtor1SD1Ev(
90     // CHECK: br i1
91 
92     // CHECK: ret void
93   }
94   // CHECK-LABEL: define void @_ZN10array_dtor1iEv(
95   void i() {
96     // CHECK: %[[ARRAY:.*]] = alloca [3 x
97     // CHECK: br
98 
99     // CHECK: call void @_ZN10array_dtor1SC1Ev(
100     // CHECK: br i1
101 
102     // CHECK: call void @_ZN10array_dtor1fEPA3_NS_1SE(
103     // CHECK: br
104 
105     // CHECK: call void @_ZN10array_dtor1SD1Ev(
106     // CHECK: br i1
107     f(&T{});
108 
109     // CHECK: ret void
110   }
111 }
112