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