xref: /aosp_15_r20/external/clang/test/CodeGenCXX/virtual-bases.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 -mconstructor-aliases | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li struct A {
4*67e74705SXin Li   A();
5*67e74705SXin Li };
6*67e74705SXin Li 
7*67e74705SXin Li // CHECK: @_ZN1AC1Ev = alias {{.*}} @_ZN1AC2Ev
8*67e74705SXin Li // CHECK-LABEL: define void @_ZN1AC2Ev(%struct.A* %this) unnamed_addr
A()9*67e74705SXin Li A::A() { }
10*67e74705SXin Li 
11*67e74705SXin Li struct B : virtual A {
12*67e74705SXin Li   B();
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li // CHECK-LABEL: define void @_ZN1BC2Ev(%struct.B* %this, i8** %vtt) unnamed_addr
16*67e74705SXin Li // CHECK-LABEL: define void @_ZN1BC1Ev(%struct.B* %this) unnamed_addr
B()17*67e74705SXin Li B::B() { }
18*67e74705SXin Li 
19*67e74705SXin Li struct C : virtual A {
20*67e74705SXin Li   C(bool);
21*67e74705SXin Li };
22*67e74705SXin Li 
23*67e74705SXin Li // CHECK-LABEL: define void @_ZN1CC2Eb(%struct.C* %this, i8** %vtt, i1 zeroext) unnamed_addr
24*67e74705SXin Li // CHECK-LABEL: define void @_ZN1CC1Eb(%struct.C* %this, i1 zeroext) unnamed_addr
C(bool)25*67e74705SXin Li C::C(bool) { }
26*67e74705SXin Li 
27*67e74705SXin Li // PR6251
28*67e74705SXin Li namespace PR6251 {
29*67e74705SXin Li 
30*67e74705SXin Li // Test that we don't call the A<char> constructor twice.
31*67e74705SXin Li 
32*67e74705SXin Li template<typename T>
33*67e74705SXin Li struct A { A(); };
34*67e74705SXin Li 
35*67e74705SXin Li struct B : virtual A<char> { };
36*67e74705SXin Li struct C : virtual A<char> { };
37*67e74705SXin Li 
38*67e74705SXin Li struct D : B, C  {
39*67e74705SXin Li   D();
40*67e74705SXin Li };
41*67e74705SXin Li 
42*67e74705SXin Li // CHECK-LABEL: define void @_ZN6PR62511DC1Ev(%"struct.PR6251::D"* %this) unnamed_addr
43*67e74705SXin Li // CHECK: call void @_ZN6PR62511AIcEC2Ev
44*67e74705SXin Li // CHECK-NOT: call void @_ZN6PR62511AIcEC2Ev
45*67e74705SXin Li // CHECK: ret void
D()46*67e74705SXin Li D::D() { }
47*67e74705SXin Li 
48*67e74705SXin Li }
49