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