// RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -S -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.p0i8.p0i8.i32(i8* align 4 %{{.*}}, i8* align 4 bitcast ([3 x i32]* @[[THREE_NULL_MEMPTRS]] to i8*), 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 } }