| // RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -S -emit-llvm -o - %s | 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: 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: 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* %{{.*}}, i8* bitcast ([3 x i32]* @[[THREE_NULL_MEMPTRS]] to i8*), i32 12, i32 4, i1 false) |
| } |
| |
| // CHECK: define void @_ZN22ValueInitArrayOfMemPtr1gEv |
| void g() { |
| // CHECK: store i32 -1, |
| f(a{}); |
| } |
| } |