Clang Project

clang_source_code/test/CodeGenCXX/virtual-bases.cpp
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 -mconstructor-aliases | FileCheck %s
2
3struct A { 
4  A();
5};
6
7// CHECK: @_ZN1AC1Ev = unnamed_addr alias {{.*}} @_ZN1AC2Ev
8// CHECK-LABEL: define void @_ZN1AC2Ev(%struct.A* %this) unnamed_addr
9A::A() { }
10
11struct B : virtual A { 
12  B();
13};
14
15// CHECK-LABEL: define void @_ZN1BC2Ev(%struct.B* %this, i8** %vtt) unnamed_addr
16// CHECK-LABEL: define void @_ZN1BC1Ev(%struct.B* %this) unnamed_addr
17B::B() { }
18
19struct C : virtual A {
20  C(bool);
21};
22
23// CHECK-LABEL: define void @_ZN1CC2Eb(%struct.C* %this, i8** %vtt, i1 zeroext) unnamed_addr
24// CHECK-LABEL: define void @_ZN1CC1Eb(%struct.C* %this, i1 zeroext) unnamed_addr
25C::C(bool) { }
26
27// PR6251
28namespace PR6251 {
29
30// Test that we don't call the A<char> constructor twice.
31
32template<typename T>
33struct A { A(); };
34
35struct B : virtual A<char> { };
36struct C : virtual A<char> { };
37
38struct D : B, C  {
39  D();
40};
41
42// CHECK-LABEL: define void @_ZN6PR62511DC1Ev(%"struct.PR6251::D"* %this) unnamed_addr
43// CHECK: call void @_ZN6PR62511AIcEC2Ev
44// CHECK-NOT: call void @_ZN6PR62511AIcEC2Ev
45// CHECK: ret void
46D::D() { }
47
48}
49
50namespace virtualBaseAlignment {
51
52// Check that the store to B::x in the base constructor has an 8-byte alignment.
53
54// CHECK: define linkonce_odr void @_ZN20virtualBaseAlignment1BC1Ev(%[[STRUCT_B:.*]]* %[[THIS:.*]])
55// CHECK: %[[THIS_ADDR:.*]] = alloca %[[STRUCT_B]]*, align 8
56// CHECK: store %[[STRUCT_B]]* %[[THIS]], %[[STRUCT_B]]** %[[THIS_ADDR]], align 8
57// CHECK: %[[THIS1:.*]] = load %[[STRUCT_B]]*, %[[STRUCT_B]]** %[[THIS_ADDR]], align 8
58// CHECK: %[[X:.*]] = getelementptr inbounds %[[STRUCT_B]], %[[STRUCT_B]]* %[[THIS1]], i32 0, i32 2
59// CHECK: store i32 123, i32* %[[X]], align 16
60
61// CHECK: define linkonce_odr void @_ZN20virtualBaseAlignment1BC2Ev(%[[STRUCT_B]]* %[[THIS:.*]], i8** %{{.*}})
62// CHECK: %[[THIS_ADDR:.*]] = alloca %[[STRUCT_B]]*, align 8
63// CHECK: store %[[STRUCT_B]]* %[[THIS]], %[[STRUCT_B]]** %[[THIS_ADDR]], align 8
64// CHECK: %[[THIS1:.*]] = load %[[STRUCT_B]]*, %[[STRUCT_B]]** %[[THIS_ADDR]], align 8
65// CHECK: %[[X:.*]] = getelementptr inbounds %[[STRUCT_B]], %[[STRUCT_B]]* %[[THIS1]], i32 0, i32 2
66// CHECK: store i32 123, i32* %[[X]], align 8
67
68struct A {
69  __attribute__((aligned(16))) double data1;
70};
71
72struct B : public virtual A {
73  B() : x(123) {}
74  double a;
75  int x;
76};
77
78struct C : public virtual B {};
79
80void test() { B b; C c; }
81
82}
83