1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
// 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;
}
}
|