xref: /llvm-project/lldb/test/Shell/SymbolFile/NativePDB/icf.cpp (revision cf3464bbb796d492bcd4e764ada945304e0c874f)
1 // clang-format off
2 // REQUIRES: lld, x86
3 
4 // Test lldb finds the correct parent context decl for functions and class methods when icf happens.
5 // RUN: %clang_cl --target=x86_64-windows-msvc -Od -Z7 -GS- -fno-addrsig -c /Fo%t.obj -- %s
6 // RUN: lld-link -opt:icf -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb
7 // RUN: lldb-test symbols --dump-ast %t.exe | FileCheck %s
8 
9 struct A {
10   int f1(int x) {
11     return x * 2;
12   }
13 };
14 struct B {
15   int f2(int x) {
16     return x * 2;
17   }
18 };
19 namespace N1 {
20 int f3(void*, int x) {
21   return  x * 2;
22 }
23 } // namespace N1
24 
25 namespace N2 {
26 namespace N3 {
27   int f4(void*, int x) {
28     return  x * 2;
29   }
30 } // namespace N3
31 } // namespace N2
32 
33 namespace N4 {
34   // Same base name as N1::f3 but different namespaces.
35   int f3(void*, int x) {
36     return x * 2;
37   }
38   // Same base name as B::f2 but this is in namespace.
39   int f2(void*, int x) {
40     return x * 2;
41   }
42 } // namespace N4
43 
44 
45 int main() {
46   A a;
47   B b;
48   return a.f1(1) + b.f2(1) + N1::f3(nullptr, 1) + N2::N3::f4(nullptr, 1) +
49          N4::f3(nullptr, 1);
50 }
51 
52 
53 // CHECK:      namespace N1 {
54 // CHECK-NEXT:     int f3(void *, int x);
55 // CHECK-NEXT: }
56 // CHECK-NEXT: namespace N2 {
57 // CHECK-NEXT:     namespace N3 {
58 // CHECK-NEXT:         int f4(void *, int x);
59 // CHECK-NEXT:     }
60 // CHECK-NEXT: }
61 // CHECK-NEXT: namespace N4 {
62 // CHECK-NEXT:     int f3(void *, int x);
63 // CHECK-NEXT:     int f2(void *, int x);
64 // CHECK-NEXT: }
65 // CHECK-NEXT: int main();
66 // CHECK-NEXT: struct A {
67 // CHECK-NEXT:     int f1(int);
68 // CHECK-NEXT: };
69 // CHECK-NEXT: struct B {
70 // CHECK-NEXT:     int f2(int);
71 // CHECK-NEXT: };
72