1*cd3fd82dSDanil Malyshev // RUN: %clang_cc1 -triple x86_64-linux-gnu -O1 %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,OLD-PATH
2*cd3fd82dSDanil Malyshev // RUN: %clang_cc1 -triple x86_64-linux-gnu -O1 %s -emit-llvm -new-struct-path-tbaa -o - | FileCheck %s -check-prefixes=CHECK,NEW-PATH
3ed4f3301SIvan A. Kosarev //
4ed4f3301SIvan A. Kosarev // Test generating of TBAA metadata for accesses to members of base classes.
5ed4f3301SIvan A. Kosarev 
6ed4f3301SIvan A. Kosarev struct A {
7ed4f3301SIvan A. Kosarev   int x, y, z;
8ed4f3301SIvan A. Kosarev };
9ed4f3301SIvan A. Kosarev 
10ed4f3301SIvan A. Kosarev struct B : A {
11ed4f3301SIvan A. Kosarev   int i;
12ed4f3301SIvan A. Kosarev };
13ed4f3301SIvan A. Kosarev 
14ed4f3301SIvan A. Kosarev struct C {
15ed4f3301SIvan A. Kosarev   int i;
16ed4f3301SIvan A. Kosarev   B b;
17ed4f3301SIvan A. Kosarev   int j;
18ed4f3301SIvan A. Kosarev };
19ed4f3301SIvan A. Kosarev 
f1(B * b)20ed4f3301SIvan A. Kosarev int f1(B *b) {
21ed4f3301SIvan A. Kosarev // CHECK-LABEL: _Z2f1P1B
22ed4f3301SIvan A. Kosarev // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_y:!.*]]
23ed4f3301SIvan A. Kosarev   return b->y;
24ed4f3301SIvan A. Kosarev }
25ed4f3301SIvan A. Kosarev 
f2(C * c)26ed4f3301SIvan A. Kosarev int f2(C *c) {
27ed4f3301SIvan A. Kosarev // CHECK-LABEL: _Z2f2P1C
28ed4f3301SIvan A. Kosarev // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_y]]
29ed4f3301SIvan A. Kosarev   return (&(c->b))->y;
30ed4f3301SIvan A. Kosarev }
31ed4f3301SIvan A. Kosarev 
32ed4f3301SIvan A. Kosarev struct D : virtual A
33ed4f3301SIvan A. Kosarev {};
34ed4f3301SIvan A. Kosarev 
35ed4f3301SIvan A. Kosarev struct E {
36ed4f3301SIvan A. Kosarev   D d;
37ed4f3301SIvan A. Kosarev };
38ed4f3301SIvan A. Kosarev 
f3(D * d)39ed4f3301SIvan A. Kosarev int f3(D *d) {
40ed4f3301SIvan A. Kosarev // CHECK-LABEL: _Z2f3P1D
41ed4f3301SIvan A. Kosarev // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_y]]
42ed4f3301SIvan A. Kosarev   return d->y;
43ed4f3301SIvan A. Kosarev }
44ed4f3301SIvan A. Kosarev 
f4(E * e)45ed4f3301SIvan A. Kosarev int f4(E *e) {
46ed4f3301SIvan A. Kosarev // CHECK-LABEL: _Z2f4P1E
47ed4f3301SIvan A. Kosarev // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_y]]
48ed4f3301SIvan A. Kosarev   return (&(e->d))->y;
49ed4f3301SIvan A. Kosarev }
50ed4f3301SIvan A. Kosarev 
51*cd3fd82dSDanil Malyshev // OLD-PATH-DAG: [[TYPE_char:!.*]] = !{!"omnipotent char", {{.*}}, i64 0}
52*cd3fd82dSDanil Malyshev // OLD-PATH-DAG: [[TYPE_int:!.*]] = !{!"int", [[TYPE_char]], i64 0}
53*cd3fd82dSDanil Malyshev // OLD-PATH-DAG: [[TYPE_A:!.*]] = !{!"_ZTS1A", [[TYPE_int]], i64 0, [[TYPE_int]], i64 4, [[TYPE_int]], i64 8}
54*cd3fd82dSDanil Malyshev // OLD-PATH-DAG: [[TAG_A_y]] = !{[[TYPE_A]], [[TYPE_int]], i64 4}
55*cd3fd82dSDanil Malyshev // NEW-PATH-DAG: [[TYPE_char:!.*]] = !{{{.*}}, i64 1, !"omnipotent char"}
56*cd3fd82dSDanil Malyshev // NEW-PATH-DAG: [[TYPE_int:!.*]] = !{[[TYPE_char]], i64 4, !"int"}
57*cd3fd82dSDanil Malyshev // NEW-PATH-DAG: [[TYPE_A:!.*]] = !{[[TYPE_char]], i64 12, !"_ZTS1A", [[TYPE_int]], i64 0, i64 4, [[TYPE_int]], i64 4, i64 4, [[TYPE_int]], i64 8, i64 4}
58*cd3fd82dSDanil Malyshev // NEW-PATH-DAG: [[TAG_A_y]] = !{[[TYPE_A]], [[TYPE_int]], i64 4, i64 4}
59