dynamic-cast-hint.cpp revision ae3f7608756eb90d8dd5d014238437fcbf1c7de7
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); 25ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: call i8* @__dynamic_cast(i8* %2, 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); 27ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer// CHECK: call i8* @__dynamic_cast(i8* %8, 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