xref: /aosp_15_r20/external/clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++1y %s -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li struct A {
4*67e74705SXin Li   int n = 0;
5*67e74705SXin Li   const char *p;
6*67e74705SXin Li   char k = p[n];
7*67e74705SXin Li   int f();
8*67e74705SXin Li   int x = f();
9*67e74705SXin Li   union {
10*67e74705SXin Li     char c;
11*67e74705SXin Li     double d = 1.0;
12*67e74705SXin Li   };
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li int f();
16*67e74705SXin Li 
17*67e74705SXin Li union B {
18*67e74705SXin Li   int a;
19*67e74705SXin Li   int f();
20*67e74705SXin Li   int b = f();
21*67e74705SXin Li };
22*67e74705SXin Li 
23*67e74705SXin Li A a { .p = "foobar" };
24*67e74705SXin Li A b { 4, "bazquux", .x = 42, .c = 9 };
25*67e74705SXin Li A c { 1, 0, 'A', f(), { 3 } };
26*67e74705SXin Li 
27*67e74705SXin Li // CHECK: @[[STR_A:.*]] = {{.*}} [7 x i8] c"foobar\00"
28*67e74705SXin Li // CHECK: @a = global {{.*}} zeroinitializer
29*67e74705SXin Li 
30*67e74705SXin Li // @b has a constant initializer
31*67e74705SXin Li // CHECK: @[[STR_B:.*]] = {{.*}} [8 x i8] c"bazquux\00"
32*67e74705SXin Li // CHECK: @b = global {{.*}} i32 4, {{.*}} @[[STR_B]], {{.*}} i8 117, i32 42, {{.*}} i8 9
33*67e74705SXin Li 
34*67e74705SXin Li B x;
35*67e74705SXin Li B y {};
36*67e74705SXin Li B z { 1 };
37*67e74705SXin Li // CHECK: @z = global {{.*}} { i32 1 }
38*67e74705SXin Li 
39*67e74705SXin Li // Brace initialization should initialize the first field even though it is
40*67e74705SXin Li // unnamed.
41*67e74705SXin Li union C {
42*67e74705SXin Li   struct {
43*67e74705SXin Li     int C::*memptr;
44*67e74705SXin Li   };
45*67e74705SXin Li };
46*67e74705SXin Li 
47*67e74705SXin Li C n{};
48*67e74705SXin Li // CHECK: @n = global %union.C { %struct.anon { i64 -1 } }, align 8
49*67e74705SXin Li 
50*67e74705SXin Li // Initialization of 'a':
51*67e74705SXin Li 
52*67e74705SXin Li // CHECK: store i32 0, i32* getelementptr inbounds ({{.*}} @a, i32 0, i32 0)
53*67e74705SXin Li // CHECK: store i8* {{.*}} @[[STR_A]]{{.*}}, i8** getelementptr inbounds ({{.*}} @a, i32 0, i32 1)
54*67e74705SXin Li // CHECK: load i32, i32* getelementptr inbounds ({{.*}} @a, i32 0, i32 0)
55*67e74705SXin Li // CHECK: load i8*, i8** getelementptr inbounds ({{.*}} @a, i32 0, i32 1)
56*67e74705SXin Li // CHECK: getelementptr inbounds i8, i8* %{{.*}}, {{.*}} %{{.*}}
57*67e74705SXin Li // CHECK: store i8 %{{.*}}, i8* getelementptr inbounds ({{.*}} @a, i32 0, i32 2)
58*67e74705SXin Li // CHECK: call i32 @_ZN1A1fEv({{.*}} @a)
59*67e74705SXin Li // CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({{.*}}, {{.*}}* @a, i32 0, i32 3)
60*67e74705SXin Li // CHECK: store double 1.000000e+00, double* getelementptr inbounds ({{.*}} @a, i32 0, i32 4, i32 0)
61*67e74705SXin Li 
62*67e74705SXin Li // No dynamic initialization of 'b':
63*67e74705SXin Li 
64*67e74705SXin Li // CHECK-NOT: @b
65*67e74705SXin Li 
66*67e74705SXin Li // Initialization of 'c':
67*67e74705SXin Li 
68*67e74705SXin Li // CHECK: store i32 1, i32* getelementptr inbounds ({{.*}} @c, i32 0, i32 0)
69*67e74705SXin Li // CHECK: store i8* null, i8** getelementptr inbounds ({{.*}} @c, i32 0, i32 1)
70*67e74705SXin Li // CHECK-NOT: load
71*67e74705SXin Li // CHECK: store i8 65, i8* getelementptr inbounds ({{.*}} @c, i32 0, i32 2)
72*67e74705SXin Li // CHECK: call i32 @_Z1fv()
73*67e74705SXin Li // CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({{.*}}, {{.*}}* @c, i32 0, i32 3)
74*67e74705SXin Li // CHECK-NOT: C1Ev
75*67e74705SXin Li // CHECK: store i8 3, i8* {{.*}} @c, i32 0, i32 4)
76*67e74705SXin Li 
77*67e74705SXin Li // CHECK: call void @_ZN1BC1Ev({{.*}} @x)
78*67e74705SXin Li 
79*67e74705SXin Li // CHECK: call i32 @_ZN1B1fEv({{.*}} @y)
80*67e74705SXin Li // CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({{.*}} @y, i32 0, i32 0)
81