| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s | 
 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s | 
 |  | 
 | // C guarantees that brace-init with fewer initializers than members in the | 
 | // aggregate will initialize the rest of the aggregate as-if it were static | 
 | // initialization. In turn static initialization guarantees that padding is | 
 | // initialized to zero bits. | 
 |  | 
 | // CHECK: @__const.partial_init.s = private unnamed_addr constant { i8, [7 x i8], i64 } { i8 42, [7 x i8] zeroinitializer, i64 0 }, align 8 | 
 |  | 
 | // Technically, we could initialize this padding to non-zero because all of the | 
 | // struct's members have initializers. | 
 |  | 
 | // CHECK: @__const.init_all.s = private unnamed_addr constant { i8, [7 x i8], i64 } { i8 42, [7 x i8] zeroinitializer, i64 -2401053089374216531 }, align 8 | 
 |  | 
 | struct S { | 
 |   char c; | 
 |   long long l; | 
 | }; | 
 |  | 
 | void use(struct S*); | 
 |  | 
 | // CHECK-LABEL: @empty_braces( | 
 | // CHECK:       %s = alloca | 
 | // CHECK-NEXT:  call void @llvm.memset{{.*}}(ptr align 8 %s, i8 0, | 
 | // CHECK-NEXT:  call void @use(ptr noundef %s) | 
 | void empty_braces(void) { | 
 |   struct S s = {}; | 
 |   return use(&s); | 
 | } | 
 |  | 
 | // CHECK-LABEL: @partial_init( | 
 | // CHECK:       %s = alloca | 
 | // CHECK-NEXT:  call void @llvm.memcpy{{.*}}(ptr align 8 %s, {{.*}}@__const.partial_init.s | 
 | // CHECK-NEXT:  call void @use(ptr noundef %s) | 
 | void partial_init(void) { | 
 |   struct S s = { .c = 42 }; | 
 |   return use(&s); | 
 | } | 
 |  | 
 | // CHECK-LABEL: @init_all( | 
 | // CHECK:       %s = alloca | 
 | // CHECK-NEXT:  call void @llvm.memcpy{{.*}}(ptr align 8 %s, {{.*}}@__const.init_all.s | 
 | // CHECK-NEXT:  call void @use(ptr noundef %s) | 
 | void init_all(void) { | 
 |   struct S s = { .c = 42, .l = 0xdeadbeefc0fedead }; | 
 |   return use(&s); | 
 | } |