xref: /llvm-project/clang/test/CodeGenCXX/auto-var-init-attr.cpp (revision c86899d2d218e19f5a69d9f97f6ff43abc6c897c)
1 // 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 
3 struct S { char c; };
4 class C { char c; };
5 enum class E { ZERO };
6 union U { char c; int i; };
7 
8 struct __declspec(no_init_all) NoInitS { char c; };
9 class __declspec(no_init_all) NoInitC { char c; };
10 enum class __declspec(no_init_all) NoInitE { ZERO };
11 union __declspec(no_init_all) NoInitU { char c; int i; };
12 
13 extern "C" {
14   void test_no_attr() {
15     // CHECK-LABEL: @test_no_attr()
16     // CHECK-NEXT:  entry:
17     // CHECK-NEXT:  %s = alloca %struct.S, align 1
18     // CHECK-NEXT:  %c = alloca %class.C, align 1
19     // CHECK-NEXT:  %e = alloca i32, align 4
20     // CHECK-NEXT:  %u = alloca %union.U, align 4
21     // 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 4
24     // CHECK-NEXT:  call void @llvm.memset.p0.i64(ptr align 4 %u, i8 0, i64 4, i1 false)
25     // CHECK-NEXT   ret void
26     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 1
36     // CHECK-NEXT:  %c = alloca %class.C, align 1
37     // CHECK-NEXT:  %e = alloca i32, align 4
38     // CHECK-NEXT:  %u = alloca %union.U, align 4
39     // CHECK-NEXT:  ret void
40     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 1
50     // CHECK-NEXT:  %c = alloca %class.NoInitC, align 1
51     // CHECK-NEXT:  %e = alloca i32, align 4
52     // CHECK-NEXT:  %u = alloca %union.NoInitU, align 4
53     // CHECK-NEXT:  ret void
54     NoInitS s;
55     NoInitC c;
56     NoInitE e;
57     NoInitU u;
58   }
59 }