1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-none-linux-gnu -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=BOTH
2*67e74705SXin Li // RUN: %clang_cc1 -triple i686-pc-windows-msvc -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=MSVC --check-prefix=BOTH
3*67e74705SXin Li
4*67e74705SXin Li // CHECK: define void @_ZN7pr147634funcENS_3fooE
5*67e74705SXin Li // CHECK: call void @llvm.dbg.declare({{.*}}, metadata ![[F:[0-9]+]], metadata ![[EXPR:[0-9]+]])
6*67e74705SXin Li
7*67e74705SXin Li // !llvm.dbg.cu pulls in globals and their types first.
8*67e74705SXin Li // CHECK-NOT: !DIGlobalVariable(name: "c"
9*67e74705SXin Li // CHECK: !DIGlobalVariable(name: "x", linkageName: "_ZN6pr96081xE"
10*67e74705SXin Li // CHECK-SAME: type: [[INCARRAYPTR:![0-9]*]]
11*67e74705SXin Li // CHECK-SAME: variable: [3 x i8]** @_ZN6pr96081xE
12*67e74705SXin Li // CHECK: [[INCARRAYPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[INCARRAY:![0-9]+]]
13*67e74705SXin Li // CHECK: [[INCARRAY]] = !DICompositeType(tag: DW_TAG_array_type
14*67e74705SXin Li // CHECK-NOT: line:
15*67e74705SXin Li // CHECK-NOT: size:
16*67e74705SXin Li // CHECK-NOT: align:
17*67e74705SXin Li // CHECK-NOT: offset:
18*67e74705SXin Li // CHECK-SAME: baseType: ![[INCTYPE:[0-9]+]]
19*67e74705SXin Li
20*67e74705SXin Li // CHECK: ![[INCTYPE]] = !DICompositeType(tag: DW_TAG_structure_type, name: "incomplete"
21*67e74705SXin Li // CHECK-SAME: DIFlagFwdDecl
22*67e74705SXin Li
23*67e74705SXin Li template<typename T> struct Identity {
24*67e74705SXin Li typedef T Type;
25*67e74705SXin Li };
26*67e74705SXin Li
f(Identity<int>::Type a)27*67e74705SXin Li void f(Identity<int>::Type a) {}
f(Identity<int> a)28*67e74705SXin Li void f(Identity<int> a) {}
f(int & a)29*67e74705SXin Li void f(int& a) { }
30*67e74705SXin Li
31*67e74705SXin Li template<typename T> struct A {
32*67e74705SXin Li A<T> *next;
33*67e74705SXin Li };
f(A<int>)34*67e74705SXin Li void f(A<int>) { }
35*67e74705SXin Li
36*67e74705SXin Li struct B { };
37*67e74705SXin Li
f()38*67e74705SXin Li void f() {
39*67e74705SXin Li int B::*a = 0;
40*67e74705SXin Li void (B::*b)() = 0;
41*67e74705SXin Li }
42*67e74705SXin Li
43*67e74705SXin Li namespace EmptyNameCrash {
44*67e74705SXin Li struct A { A(); };
45*67e74705SXin Li typedef struct { A x; } B;
46*67e74705SXin Li B x;
47*67e74705SXin Li }
48*67e74705SXin Li
49*67e74705SXin Li // PR4890
50*67e74705SXin Li namespace PR4890 {
51*67e74705SXin Li struct X {
52*67e74705SXin Li ~X();
53*67e74705SXin Li };
54*67e74705SXin Li
~X()55*67e74705SXin Li X::~X() { }
56*67e74705SXin Li }
57*67e74705SXin Li
58*67e74705SXin Li namespace VirtualDtor {
59*67e74705SXin Li struct Y {
60*67e74705SXin Li virtual ~Y();
61*67e74705SXin Li };
62*67e74705SXin Li
~Y()63*67e74705SXin Li Y::~Y() { }
64*67e74705SXin Li }
65*67e74705SXin Li
66*67e74705SXin Li namespace VirtualBase {
67*67e74705SXin Li struct A { int a; };
68*67e74705SXin Li struct B : virtual A { int b; };
69*67e74705SXin Li // BOTH: ![[VBASE_B:[0-9]+]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "B",{{.*}} line: [[@LINE-1]],
70*67e74705SXin Li // MSVC-SAME: size: 96, align: 32
71*67e74705SXin Li // CHECK-SAME: size: 128, align: 64,
72*67e74705SXin Li // BOTH-NOT: offset:
73*67e74705SXin Li // BOTH-NOT: DIFlagFwdDecl
74*67e74705SXin Li // BOTH-SAME: elements: [[VBASE_B_DEF:![0-9]+]]
75*67e74705SXin Li // BOTH: [[VBASE_B_DEF]] = !{[[VBASE_A_IN_B:![0-9]+]],
76*67e74705SXin Li //
77*67e74705SXin Li // Look for the vbtable offset of A, which should be 4 for MSVC, 24 otherwise.
78*67e74705SXin Li // BOTH: [[VBASE_A_IN_B]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[VBASE_B]],
79*67e74705SXin Li // BOTH-SAME: baseType: ![[VBASE_A:[0-9]+]],
80*67e74705SXin Li // MSVC-SAME: offset: 4,
81*67e74705SXin Li // CHECK-SAME: offset: 24,
82*67e74705SXin Li //
83*67e74705SXin Li // BOTH: ![[VBASE_A]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "A",
84*67e74705SXin Li
f()85*67e74705SXin Li void f() {
86*67e74705SXin Li B b;
87*67e74705SXin Li }
88*67e74705SXin Li }
89*67e74705SXin Li
90*67e74705SXin Li namespace b5249287 {
91*67e74705SXin Li template <typename T> class A {
92*67e74705SXin Li struct B;
93*67e74705SXin Li };
94*67e74705SXin Li
95*67e74705SXin Li class Cls {
96*67e74705SXin Li template <typename T> friend class A<T>::B;
97*67e74705SXin Li };
98*67e74705SXin Li
99*67e74705SXin Li Cls obj;
100*67e74705SXin Li }
101*67e74705SXin Li
102*67e74705SXin Li // CHECK: [[FUNC:[0-9]+]] = distinct !DISubprogram(name: "func", linkageName: "_ZN7pr147634funcENS_3fooE"
103*67e74705SXin Li // CHECK-SAME: type: {{![0-9]+}}
104*67e74705SXin Li // CHECK-SAME: isDefinition: true
105*67e74705SXin Li
106*67e74705SXin Li // CHECK: [[PR14763:![0-9]+]] = !DINamespace(name: "pr14763"
107*67e74705SXin Li namespace pr14763 {
108*67e74705SXin Li struct foo {
109*67e74705SXin Li // CHECK: ![[FOO:[0-9]+]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "foo"
110*67e74705SXin Li // CHECK-SAME: scope: [[PR14763]]
111*67e74705SXin Li // CHECK-SAME: identifier:
112*67e74705SXin Li foo(const foo&);
113*67e74705SXin Li };
114*67e74705SXin Li
115*67e74705SXin Li // For some reason function arguments ended up down here
116*67e74705SXin Li // CHECK: ![[F]] = !DILocalVariable(name: "f", arg: 1, scope: ![[FUNC]]
117*67e74705SXin Li // CHECK-SAME: type: ![[FOO]]
118*67e74705SXin Li // CHECK: ![[EXPR]] = !DIExpression(DW_OP_deref)
func(foo f)119*67e74705SXin Li foo func(foo f) {
120*67e74705SXin Li return f; // reference 'f' for now because otherwise we hit another bug
121*67e74705SXin Li }
122*67e74705SXin Li
123*67e74705SXin Li }
124*67e74705SXin Li
foo()125*67e74705SXin Li void foo() {
126*67e74705SXin Li // CHECK: !DILocalVariable(name: "c"
127*67e74705SXin Li // CHECK-NOT: arg:
128*67e74705SXin Li // CHECK-SAME: )
129*67e74705SXin Li const wchar_t c = L'x';
130*67e74705SXin Li wchar_t d = c;
131*67e74705SXin Li }
132*67e74705SXin Li
133*67e74705SXin Li namespace pr9608 { // also pr9600
134*67e74705SXin Li struct incomplete;
135*67e74705SXin Li incomplete (*x)[3];
136*67e74705SXin Li }
137*67e74705SXin Li
138*67e74705SXin Li namespace pr16214 {
139*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "a"
140*67e74705SXin Li // CHECK-SAME: elements: [[A_MEM:![0-9]+]]
141*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN7pr162141aE"
142*67e74705SXin Li // CHECK: [[A_MEM]] = !{[[A_I:![0-9]*]]}
143*67e74705SXin Li struct a {
144*67e74705SXin Li // CHECK: [[A_I]] = !DIDerivedType(tag: DW_TAG_member, name: "i"
145*67e74705SXin Li int i;
146*67e74705SXin Li };
147*67e74705SXin Li
148*67e74705SXin Li typedef a at;
149*67e74705SXin Li
150*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "b"
151*67e74705SXin Li // CHECK-SAME: DIFlagFwdDecl
152*67e74705SXin Li struct b {
153*67e74705SXin Li };
154*67e74705SXin Li
155*67e74705SXin Li typedef b bt;
156*67e74705SXin Li
func()157*67e74705SXin Li void func() {
158*67e74705SXin Li at a_inst;
159*67e74705SXin Li bt *b_ptr_inst;
160*67e74705SXin Li const bt *b_cnst_ptr_inst;
161*67e74705SXin Li }
162*67e74705SXin Li
163*67e74705SXin Li }
164