59 lines · cpp
1// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -fdeclspec -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s2 3struct S { char c; };4class C { char c; };5enum class E { ZERO };6union U { char c; int i; };7 8struct __declspec(no_init_all) NoInitS { char c; };9class __declspec(no_init_all) NoInitC { char c; };10enum class __declspec(no_init_all) NoInitE { ZERO };11union __declspec(no_init_all) NoInitU { char c; int i; };12 13extern "C" {14 void test_no_attr() {15 // CHECK-LABEL: @test_no_attr()16 // CHECK-NEXT: entry:17 // CHECK-NEXT: %s = alloca %struct.S, align 118 // CHECK-NEXT: %c = alloca %class.C, align 119 // CHECK-NEXT: %e = alloca i32, align 420 // CHECK-NEXT: %u = alloca %union.U, align 421 // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 %s, i8 0, i64 1, i1 false)22 // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 %c, i8 0, i64 1, i1 false)23 // CHECK-NEXT: store i32 0, ptr %e, align 424 // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 %u, i8 0, i64 4, i1 false)25 // CHECK-NEXT ret void26 S s;27 C c;28 E e;29 U u;30 }31 32 void __declspec(no_init_all) test_attr_on_function() {33 // CHECK-LABEL: @test_attr_on_function()34 // CHECK-NEXT: entry:35 // CHECK-NEXT: %s = alloca %struct.S, align 136 // CHECK-NEXT: %c = alloca %class.C, align 137 // CHECK-NEXT: %e = alloca i32, align 438 // CHECK-NEXT: %u = alloca %union.U, align 439 // CHECK-NEXT: ret void40 S s;41 C c;42 E e;43 U u;44 }45 46 void test_attr_on_decl() {47 // CHECK-LABEL: @test_attr_on_decl()48 // CHECK-NEXT: entry:49 // CHECK-NEXT: %s = alloca %struct.NoInitS, align 150 // CHECK-NEXT: %c = alloca %class.NoInitC, align 151 // CHECK-NEXT: %e = alloca i32, align 452 // CHECK-NEXT: %u = alloca %union.NoInitU, align 453 // CHECK-NEXT: ret void54 NoInitS s;55 NoInitC c;56 NoInitE e;57 NoInitU u;58 }59}