// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -fdeclspec -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s struct S { char c; }; class C { char c; }; enum class E { ZERO }; union U { char c; int i; }; struct __declspec(no_init_all) NoInitS { char c; }; class __declspec(no_init_all) NoInitC { char c; }; enum class __declspec(no_init_all) NoInitE { ZERO }; union __declspec(no_init_all) NoInitU { char c; int i; }; extern "C" { void test_no_attr() { // CHECK-LABEL: @test_no_attr() // CHECK-NEXT: entry: // CHECK-NEXT: %s = alloca %struct.S, align 1 // CHECK-NEXT: %c = alloca %class.C, align 1 // CHECK-NEXT: %e = alloca i32, align 4 // CHECK-NEXT: %u = alloca %union.U, align 4 // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 %s, i8 0, i64 1, i1 false) // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 %c, i8 0, i64 1, i1 false) // CHECK-NEXT: store i32 0, ptr %e, align 4 // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 %u, i8 0, i64 4, i1 false) // CHECK-NEXT ret void S s; C c; E e; U u; } void __declspec(no_init_all) test_attr_on_function() { // CHECK-LABEL: @test_attr_on_function() // CHECK-NEXT: entry: // CHECK-NEXT: %s = alloca %struct.S, align 1 // CHECK-NEXT: %c = alloca %class.C, align 1 // CHECK-NEXT: %e = alloca i32, align 4 // CHECK-NEXT: %u = alloca %union.U, align 4 // CHECK-NEXT: ret void S s; C c; E e; U u; } void test_attr_on_decl() { // CHECK-LABEL: @test_attr_on_decl() // CHECK-NEXT: entry: // CHECK-NEXT: %s = alloca %struct.NoInitS, align 1 // CHECK-NEXT: %c = alloca %class.NoInitC, align 1 // CHECK-NEXT: %e = alloca i32, align 4 // CHECK-NEXT: %u = alloca %union.NoInitU, align 4 // CHECK-NEXT: ret void NoInitS s; NoInitC c; NoInitE e; NoInitU u; } }