83 lines · cpp
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 -mconstructor-aliases | FileCheck %s2 3struct A { 4 A();5};6 7// CHECK: @_ZN1AC1Ev ={{.*}} unnamed_addr alias {{.*}} @_ZN1AC2Ev8// CHECK-LABEL: define{{.*}} void @_ZN1AC2Ev(ptr {{[^,]*}} %this) unnamed_addr9A::A() { }10 11struct B : virtual A { 12 B();13};14 15// CHECK-LABEL: define{{.*}} void @_ZN1BC2Ev(ptr {{[^,]*}} %this, ptr noundef %vtt) unnamed_addr16// CHECK-LABEL: define{{.*}} void @_ZN1BC1Ev(ptr {{[^,]*}} %this) unnamed_addr17B::B() { }18 19struct C : virtual A {20 C(bool);21};22 23// CHECK-LABEL: define{{.*}} void @_ZN1CC2Eb(ptr {{[^,]*}} %this, ptr noundef %vtt, i1 noundef zeroext %0) unnamed_addr24// CHECK-LABEL: define{{.*}} void @_ZN1CC1Eb(ptr {{[^,]*}} %this, i1 noundef zeroext %0) unnamed_addr25C::C(bool) { }26 27// PR625128namespace 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(ptr {{[^,]*}} %this) unnamed_addr43// CHECK: call void @_ZN6PR62511AIcEC2Ev44// CHECK-NOT: call void @_ZN6PR62511AIcEC2Ev45// CHECK: ret void46D::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(ptr {{[^,]*}} %[[THIS:.*]])55// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align 856// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align 857// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]], align 858// CHECK: %[[X:.*]] = getelementptr inbounds nuw %[[STRUCT_B:.*]], ptr %[[THIS1]], i32 0, i32 259// CHECK: store i32 123, ptr %[[X]], align 1660 61// CHECK: define linkonce_odr void @_ZN20virtualBaseAlignment1BC2Ev(ptr {{[^,]*}} %[[THIS:.*]], ptr noundef %{{.*}})62// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align 863// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align 864// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]], align 865// CHECK: %[[X:.*]] = getelementptr inbounds nuw %[[STRUCT_B]], ptr %[[THIS1]], i32 0, i32 266// CHECK: store i32 123, ptr %[[X]], align 867 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