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: 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: 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: 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 // CHECK: define void @_ZN10array_dtor1gEv( 57 void g() { 58 // CHECK: %[[ARRAY:.*]] = alloca [3 x 59 // CHECK: br 60 61 // Construct loop. 62 // CHECK: call void @_ZN10array_dtor1SC1Ev( 63 // CHECK: br i1 64 65 // CHECK: call void @_ZN10array_dtor1fERA3_KNS_1SE( 66 // CHECK: br 67 68 // Destruct loop. 69 // CHECK: call void @_ZN10array_dtor1SD1Ev( 70 // CHECK: br i1 71 72 // CHECK: ret void 73 74 f(T{}); 75 } 76 // CHECK: 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 } 95