1ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -o - %s | FileCheck %s
2ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
3ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass A { virtual ~A() {} };
4ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass B { virtual ~B() {} };
5ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
6ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass C : A { char x; };
7ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass D : public A { short y; };
8ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass E : public A, public B { int z; };
9ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass F : public virtual A { long long w; };
10ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass G : virtual A { long long w; };
11ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
12ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass H : public E { int a; };
13ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass I : public F { char b; };
14ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
15ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass J : public H { char q; };
16ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass K : public C, public B { char q; };
17ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
18ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass XA : public A { };
19ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass XB : public A { };
20ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass XC : public virtual A { };
21ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerclass X : public XA, public XB, public XC { };
22ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
23ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramervoid test(A *a, B *b) {
24ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile C *ac = dynamic_cast<C *>(a);
25f408d1dc5824223a9bbb65a4bbdb9440d8d7c30eBenjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64 }* @_ZTI1C to i8*), i64 -2)
26ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile D *ad = dynamic_cast<D *>(a);
27f408d1dc5824223a9bbb65a4bbdb9440d8d7c30eBenjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1D to i8*), i64 0)
28ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile E *ae = dynamic_cast<E *>(a);
29ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64, i8*, i64 }* @_ZTI1E to i8*), i64 0)
30ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile F *af = dynamic_cast<F *>(a);
31ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64 }* @_ZTI1F to i8*), i64 -1)
32ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile G *ag = dynamic_cast<G *>(a);
33ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64 }* @_ZTI1G to i8*), i64 -2)
34ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile H *ah = dynamic_cast<H *>(a);
35ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1H to i8*), i64 0)
36ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile I *ai = dynamic_cast<I *>(a);
37ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1I to i8*), i64 -1)
38ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile J *aj = dynamic_cast<J *>(a);
39ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1J to i8*), i64 0)
40ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile K *ak = dynamic_cast<K *>(a);
41ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64, i8*, i64 }* @_ZTI1K to i8*), i64 -2)
42ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile X *ax = dynamic_cast<X *>(a);
43ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64, i8*, i64, i8*, i64 }* @_ZTI1X to i8*), i64 -1)
44ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
45ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile E *be = dynamic_cast<E *>(b);
46ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1B to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64, i8*, i64 }* @_ZTI1E to i8*), i64 8)
47ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile G *bg = dynamic_cast<G *>(b);
48ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1B to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64 }* @_ZTI1G to i8*), i64 -2)
49ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile J *bj = dynamic_cast<J *>(b);
50ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1B to i8*), i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1J to i8*), i64 8)
51ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  volatile K *bk = dynamic_cast<K *>(b);
52ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: i8* bitcast ({ i8*, i8* }* @_ZTI1B to i8*), i8* bitcast ({ i8*, i8*, i32, i32, i8*, i64, i8*, i64 }* @_ZTI1K to i8*), i64 16)
53ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer}
54