1*c86899d2SDaniel Paoliello // RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -fdeclspec -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s 2*c86899d2SDaniel Paoliello 3*c86899d2SDaniel Paoliello struct S { char c; }; 4*c86899d2SDaniel Paoliello class C { char c; }; 5*c86899d2SDaniel Paoliello enum class E { ZERO }; 6*c86899d2SDaniel Paoliello union U { char c; int i; }; 7*c86899d2SDaniel Paoliello 8*c86899d2SDaniel Paoliello struct __declspec(no_init_all) NoInitS { char c; }; 9*c86899d2SDaniel Paoliello class __declspec(no_init_all) NoInitC { char c; }; 10*c86899d2SDaniel Paoliello enum class __declspec(no_init_all) NoInitE { ZERO }; 11*c86899d2SDaniel Paoliello union __declspec(no_init_all) NoInitU { char c; int i; }; 12*c86899d2SDaniel Paoliello 13*c86899d2SDaniel Paoliello extern "C" { 14*c86899d2SDaniel Paoliello void test_no_attr() { 15*c86899d2SDaniel Paoliello // CHECK-LABEL: @test_no_attr() 16*c86899d2SDaniel Paoliello // CHECK-NEXT: entry: 17*c86899d2SDaniel Paoliello // CHECK-NEXT: %s = alloca %struct.S, align 1 18*c86899d2SDaniel Paoliello // CHECK-NEXT: %c = alloca %class.C, align 1 19*c86899d2SDaniel Paoliello // CHECK-NEXT: %e = alloca i32, align 4 20*c86899d2SDaniel Paoliello // CHECK-NEXT: %u = alloca %union.U, align 4 21*c86899d2SDaniel Paoliello // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 %s, i8 0, i64 1, i1 false) 22*c86899d2SDaniel Paoliello // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 %c, i8 0, i64 1, i1 false) 23*c86899d2SDaniel Paoliello // CHECK-NEXT: store i32 0, ptr %e, align 4 24*c86899d2SDaniel Paoliello // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 %u, i8 0, i64 4, i1 false) 25*c86899d2SDaniel Paoliello // CHECK-NEXT ret void 26*c86899d2SDaniel Paoliello S s; 27*c86899d2SDaniel Paoliello C c; 28*c86899d2SDaniel Paoliello E e; 29*c86899d2SDaniel Paoliello U u; 30*c86899d2SDaniel Paoliello } 31*c86899d2SDaniel Paoliello 32*c86899d2SDaniel Paoliello void __declspec(no_init_all) test_attr_on_function() { 33*c86899d2SDaniel Paoliello // CHECK-LABEL: @test_attr_on_function() 34*c86899d2SDaniel Paoliello // CHECK-NEXT: entry: 35*c86899d2SDaniel Paoliello // CHECK-NEXT: %s = alloca %struct.S, align 1 36*c86899d2SDaniel Paoliello // CHECK-NEXT: %c = alloca %class.C, align 1 37*c86899d2SDaniel Paoliello // CHECK-NEXT: %e = alloca i32, align 4 38*c86899d2SDaniel Paoliello // CHECK-NEXT: %u = alloca %union.U, align 4 39*c86899d2SDaniel Paoliello // CHECK-NEXT: ret void 40*c86899d2SDaniel Paoliello S s; 41*c86899d2SDaniel Paoliello C c; 42*c86899d2SDaniel Paoliello E e; 43*c86899d2SDaniel Paoliello U u; 44*c86899d2SDaniel Paoliello } 45*c86899d2SDaniel Paoliello 46*c86899d2SDaniel Paoliello void test_attr_on_decl() { 47*c86899d2SDaniel Paoliello // CHECK-LABEL: @test_attr_on_decl() 48*c86899d2SDaniel Paoliello // CHECK-NEXT: entry: 49*c86899d2SDaniel Paoliello // CHECK-NEXT: %s = alloca %struct.NoInitS, align 1 50*c86899d2SDaniel Paoliello // CHECK-NEXT: %c = alloca %class.NoInitC, align 1 51*c86899d2SDaniel Paoliello // CHECK-NEXT: %e = alloca i32, align 4 52*c86899d2SDaniel Paoliello // CHECK-NEXT: %u = alloca %union.NoInitU, align 4 53*c86899d2SDaniel Paoliello // CHECK-NEXT: ret void 54*c86899d2SDaniel Paoliello NoInitS s; 55*c86899d2SDaniel Paoliello NoInitC c; 56*c86899d2SDaniel Paoliello NoInitE e; 57*c86899d2SDaniel Paoliello NoInitU u; 58*c86899d2SDaniel Paoliello } 59*c86899d2SDaniel Paoliello }