| Anders Carlsson | 20314ff | 2010-01-18 04:25:18 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s | 
|  | 2 |  | 
| Anders Carlsson | 35aa62a | 2010-01-18 17:13:59 +0000 | [diff] [blame] | 3 | // Test1::B should just have a single entry in its VTT, which points to the vtable. | 
| Anders Carlsson | 20314ff | 2010-01-18 04:25:18 +0000 | [diff] [blame] | 4 | namespace Test1 { | 
|  | 5 | struct A { }; | 
|  | 6 |  | 
|  | 7 | struct B : virtual A { | 
|  | 8 | virtual void f(); | 
|  | 9 | }; | 
|  | 10 |  | 
|  | 11 | void B::f() { } | 
|  | 12 | } | 
|  | 13 |  | 
| Anders Carlsson | 35aa62a | 2010-01-18 17:13:59 +0000 | [diff] [blame] | 14 | // Check that we don't add a secondary virtual pointer for Test2::A, since Test2::A doesn't have any virtual member functions or bases. | 
| Anders Carlsson | 20314ff | 2010-01-18 04:25:18 +0000 | [diff] [blame] | 15 | namespace Test2 { | 
|  | 16 | struct A { }; | 
|  | 17 |  | 
|  | 18 | struct B : A { virtual void f(); }; | 
|  | 19 | struct C : virtual B { }; | 
|  | 20 |  | 
|  | 21 | C c; | 
|  | 22 | } | 
|  | 23 |  | 
| Anders Carlsson | 35aa62a | 2010-01-18 17:13:59 +0000 | [diff] [blame] | 24 | // This is the sample from the C++ Itanium ABI, p2.6.2. | 
|  | 25 | namespace Test3 { | 
|  | 26 | class A1 { int i; }; | 
|  | 27 | class A2 { int i; virtual void f(); }; | 
|  | 28 | class V1 : public A1, public A2 { int i; }; | 
|  | 29 | class B1 { int i; }; | 
|  | 30 | class B2 { int i; }; | 
|  | 31 | class V2 : public B1, public B2, public virtual V1 { int i; }; | 
|  | 32 | class V3 {virtual void g(); }; | 
|  | 33 | class C1 : public virtual V1 { int i; }; | 
|  | 34 | class C2 : public virtual V3, virtual V2 { int i; }; | 
|  | 35 | class X1 { int i; }; | 
|  | 36 | class C3 : public X1 { int i; }; | 
|  | 37 | class D : public C1, public C2, public C3 { int i;  }; | 
|  | 38 |  | 
|  | 39 | D d; | 
|  | 40 | } | 
|  | 41 |  | 
|  | 42 | // This is the sample from the C++ Itanium ABI, p2.6.2, with the change suggested | 
|  | 43 | // (making A2 a virtual base of V1) | 
|  | 44 | namespace Test4 { | 
|  | 45 | class A1 { int i; }; | 
|  | 46 | class A2 { int i; virtual void f(); }; | 
|  | 47 | class V1 : public A1, public virtual A2 { int i; }; | 
|  | 48 | class B1 { int i; }; | 
|  | 49 | class B2 { int i; }; | 
|  | 50 | class V2 : public B1, public B2, public virtual V1 { int i; }; | 
|  | 51 | class V3 {virtual void g(); }; | 
|  | 52 | class C1 : public virtual V1 { int i; }; | 
|  | 53 | class C2 : public virtual V3, virtual V2 { int i; }; | 
|  | 54 | class X1 { int i; }; | 
|  | 55 | class C3 : public X1 { int i; }; | 
|  | 56 | class D : public C1, public C2, public C3 { int i;  }; | 
|  | 57 |  | 
|  | 58 | D d; | 
|  | 59 | } | 
|  | 60 |  | 
| Rafael Espindola | 82a0f4e | 2011-01-11 22:29:55 +0000 | [diff] [blame] | 61 | // CHECK: @_ZTTN5Test11BE = unnamed_addr constant [1 x i8*] [i8* bitcast (i8** getelementptr inbounds ([4 x i8*]* @_ZTVN5Test11BE, i64 0, i64 3) to i8*)] | 
| Anders Carlsson | f502d93 | 2011-01-24 00:46:19 +0000 | [diff] [blame] | 62 | // CHECK: @_ZTTN5Test41DE = linkonce_odr unnamed_addr constant [19 x i8*] [i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE0_NS_2C1E, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE0_NS_2C1E, i64 0, i64 7) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE0_NS_2C1E, i64 0, i64 10) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 7) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 7) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 12) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 15) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 18) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 17) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 20) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 13) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 13) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 1, i64 0) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test41DE40_NS_2V1E, i64 0, i64 3) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test41DE40_NS_2V1E, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE72_NS_2V2E, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE72_NS_2V2E, i64 0, i64 7) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE72_NS_2V2E, i64 0, i64 10) to i8*)] | 
|  | 63 | // CHECK: @_ZTTN5Test31DE = linkonce_odr unnamed_addr constant [13 x i8*] [i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 0, i64 5) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test31DE0_NS_2C1E, i64 0, i64 3) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test31DE0_NS_2C1E, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTCN5Test31DE16_NS_2C2E, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTCN5Test31DE16_NS_2C2E, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTCN5Test31DE16_NS_2C2E, i64 0, i64 10) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTCN5Test31DE16_NS_2C2E, i64 0, i64 13) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 0, i64 15) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 0, i64 11) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 0, i64 11) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 1, i64 0) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test31DE64_NS_2V2E, i64 0, i64 3) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test31DE64_NS_2V2E, i64 0, i64 6) to i8*)] | 
|  | 64 | // CHECK: @_ZTTN5Test21CE = linkonce_odr unnamed_addr constant [2 x i8*] [i8* bitcast (i8** getelementptr inbounds ([5 x i8*]* @_ZTVN5Test21CE, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([5 x i8*]* @_ZTVN5Test21CE, i64 0, i64 4) to i8*)] |