1 | // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 -mconstructor-aliases | FileCheck %s |
2 | |
3 | struct A { |
4 | A(); |
5 | }; |
6 | |
7 | // CHECK: @_ZN1AC1Ev = unnamed_addr alias {{.*}} @_ZN1AC2Ev |
8 | // CHECK-LABEL: define void @_ZN1AC2Ev(%struct.A* %this) unnamed_addr |
9 | A::A() { } |
10 | |
11 | struct 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 |
17 | B::B() { } |
18 | |
19 | struct 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 |
25 | C::C(bool) { } |
26 | |
27 | // PR6251 |
28 | namespace PR6251 { |
29 | |
30 | // Test that we don't call the A<char> constructor twice. |
31 | |
32 | template<typename T> |
33 | struct A { A(); }; |
34 | |
35 | struct B : virtual A<char> { }; |
36 | struct C : virtual A<char> { }; |
37 | |
38 | struct 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 |
46 | D::D() { } |
47 | |
48 | } |
49 | |
50 | namespace 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 | |
68 | struct A { |
69 | __attribute__((aligned(16))) double data1; |
70 | }; |
71 | |
72 | struct B : public virtual A { |
73 | B() : x(123) {} |
74 | double a; |
75 | int x; |
76 | }; |
77 | |
78 | struct C : public virtual B {}; |
79 | |
80 | void test() { B b; C c; } |
81 | |
82 | } |
83 | |