xref: /llvm-project/clang/test/CodeGenCXX/auto-var-init-attr.cpp (revision c86899d2d218e19f5a69d9f97f6ff43abc6c897c)
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 }