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 Liint 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