|  | // RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -emit-llvm -o - %s -Wno-address-of-temporary | FileCheck %s | 
|  |  | 
|  | // CHECK: @[[THREE_NULL_MEMPTRS:.*]] = private constant [3 x i32] [i32 -1, i32 -1, i32 -1] | 
|  |  | 
|  | struct A { int a[1]; }; | 
|  | typedef A x[]; | 
|  | int f() { | 
|  | x{{{1}}}; | 
|  | // CHECK-LABEL: define{{.*}} i32 @_Z1fv | 
|  | // CHECK: store i32 1 | 
|  | // (It's okay if the output changes here, as long as we don't crash.) | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | namespace ValueInitArrayOfMemPtr { | 
|  | struct S {}; | 
|  | typedef int (S::*p); | 
|  | typedef p a[3]; | 
|  | void f(const a &); | 
|  |  | 
|  | struct Agg1 { | 
|  | int n; | 
|  | p x; | 
|  | }; | 
|  |  | 
|  | struct Agg2 { | 
|  | int n; | 
|  | a x; | 
|  | }; | 
|  |  | 
|  | struct S1 { | 
|  | p x; | 
|  | S1(); | 
|  | }; | 
|  |  | 
|  | // CHECK-LABEL: define{{.*}} void @_ZN22ValueInitArrayOfMemPtr1fEi | 
|  | void f(int n) { | 
|  | Agg1 a = { n }; | 
|  | // CHECK: store i32 -1, | 
|  |  | 
|  | Agg2 b = { n }; | 
|  | // CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %{{.*}}, ptr align 4 @[[THREE_NULL_MEMPTRS]], i32 12, i1 false) | 
|  | } | 
|  |  | 
|  | // Test dynamic initialization. | 
|  | // CHECK-LABEL: define{{.*}} void @_ZN22ValueInitArrayOfMemPtr1gEMNS_1SEi | 
|  | void g(p ptr) { | 
|  | // CHECK: store i32 -1, | 
|  | f(a{ptr}); | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace array_dtor { | 
|  | struct S { S(); ~S(); }; | 
|  | using T = S[3]; | 
|  | void f(const T &); | 
|  | void f(T *); | 
|  | // CHECK-LABEL: define{{.*}} void @_ZN10array_dtor1gEv( | 
|  | void g() { | 
|  | // CHECK: %[[ARRAY:.*]] = alloca [3 x | 
|  | // CHECK: br | 
|  |  | 
|  | // Construct loop. | 
|  | // CHECK: call void @_ZN10array_dtor1SC1Ev( | 
|  | // CHECK: br i1 | 
|  |  | 
|  | // CHECK: call void @_ZN10array_dtor1fERA3_KNS_1SE( | 
|  | // CHECK: br | 
|  |  | 
|  | // Destruct loop. | 
|  | // CHECK: call void @_ZN10array_dtor1SD1Ev( | 
|  | // CHECK: br i1 | 
|  | f(T{}); | 
|  |  | 
|  | // CHECK: ret void | 
|  | } | 
|  | // CHECK-LABEL: define{{.*}} void @_ZN10array_dtor1hEv( | 
|  | void h() { | 
|  | // CHECK: %[[ARRAY:.*]] = alloca [3 x | 
|  | // CHECK: br | 
|  |  | 
|  | // CHECK: call void @_ZN10array_dtor1SC1Ev( | 
|  | // CHECK: br i1 | 
|  | T &&t = T{}; | 
|  |  | 
|  | // CHECK: call void @_ZN10array_dtor1fERA3_KNS_1SE( | 
|  | // CHECK: br | 
|  | f(t); | 
|  |  | 
|  | // CHECK: call void @_ZN10array_dtor1SD1Ev( | 
|  | // CHECK: br i1 | 
|  |  | 
|  | // CHECK: ret void | 
|  | } | 
|  | // CHECK-LABEL: define{{.*}} void @_ZN10array_dtor1iEv( | 
|  | void i() { | 
|  | // CHECK: %[[ARRAY:.*]] = alloca [3 x | 
|  | // CHECK: br | 
|  |  | 
|  | // CHECK: call void @_ZN10array_dtor1SC1Ev( | 
|  | // CHECK: br i1 | 
|  |  | 
|  | // CHECK: call void @_ZN10array_dtor1fEPA3_NS_1SE( | 
|  | // CHECK: br | 
|  |  | 
|  | // CHECK: call void @_ZN10array_dtor1SD1Ev( | 
|  | // CHECK: br i1 | 
|  | f(&T{}); | 
|  |  | 
|  | // CHECK: ret void | 
|  | } | 
|  | } |