File: dynamic-cast-hint.cpp

package info (click to toggle)
llvm-toolchain-17 1%3A17.0.6-22
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,799,624 kB
  • sloc: cpp: 6,428,607; ansic: 1,383,196; asm: 793,408; python: 223,504; objc: 75,364; f90: 60,502; lisp: 33,869; pascal: 15,282; sh: 9,684; perl: 7,453; ml: 4,937; awk: 3,523; makefile: 2,889; javascript: 2,149; xml: 888; fortran: 619; cs: 573
file content (55 lines) | stat: -rw-r--r-- 2,017 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -o - %s | FileCheck %s
// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -std=c++98 -o - %s | FileCheck %s
// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -std=c++11 -o - %s | FileCheck %s

class A { protected: virtual ~A() {} };
class B { protected: virtual ~B() {} };

class C : A { char x; };
class D : public A { short y; };
class E : public A, public B { int z; };
class F : public virtual A { long long w; };
class G : virtual A { long long w; };

class H : public E { int a; };
class I : public F { char b; };

class J : public H { char q; };
class K : public C, public B { char q; };

class XA : public A { };
class XB : public A { };
class XC : public virtual A { };
class X : public XA, public XB, public XC { };

void test(A *a, B *b) {
  volatile C *ac = dynamic_cast<C *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1C, i64 -2)
  volatile D *ad = dynamic_cast<D *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1D, i64 0)
  volatile E *ae = dynamic_cast<E *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1E, i64 0)
  volatile F *af = dynamic_cast<F *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1F, i64 -1)
  volatile G *ag = dynamic_cast<G *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1G, i64 -2)
  volatile H *ah = dynamic_cast<H *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1H, i64 0)
  volatile I *ai = dynamic_cast<I *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1I, i64 -1)
  volatile J *aj = dynamic_cast<J *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1J, i64 0)
  volatile K *ak = dynamic_cast<K *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1K, i64 -2)
  volatile X *ax = dynamic_cast<X *>(a);
// CHECK: ptr @_ZTI1A, ptr @_ZTI1X, i64 -1)

  volatile E *be = dynamic_cast<E *>(b);
// CHECK: ptr @_ZTI1B, ptr @_ZTI1E, i64 8)
  volatile G *bg = dynamic_cast<G *>(b);
// CHECK: ptr @_ZTI1B, ptr @_ZTI1G, i64 -2)
  volatile J *bj = dynamic_cast<J *>(b);
// CHECK: ptr @_ZTI1B, ptr @_ZTI1J, i64 8)
  volatile K *bk = dynamic_cast<K *>(b);
// CHECK: ptr @_ZTI1B, ptr @_ZTI1K, i64 16)
}