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* align 4 %{{.*}}, i8* align 4 bitcast ([3 x i32]* @[[THREE_NULL_MEMPTRS]] to i8*), i32 12, i1 false) |
43 | } |
44 | |
45 | // Test dynamic initialization. |
46 | // CHECK-LABEL: define void @_ZN22ValueInitArrayOfMemPtr1gEMNS_1SEi |
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( |
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( |
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( |
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 | |