xref: /llvm-project/lldb/test/Shell/SymbolFile/NativePDB/icf.cpp (revision cf3464bbb796d492bcd4e764ada945304e0c874f)
19b825dcdSZequan Wu // clang-format off
29b825dcdSZequan Wu // REQUIRES: lld, x86
39b825dcdSZequan Wu 
49b825dcdSZequan Wu // Test lldb finds the correct parent context decl for functions and class methods when icf happens.
59b825dcdSZequan Wu // RUN: %clang_cl --target=x86_64-windows-msvc -Od -Z7 -GS- -fno-addrsig -c /Fo%t.obj -- %s
69b825dcdSZequan Wu // RUN: lld-link -opt:icf -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb
7*cf3464bbSJonas Devlieghere // RUN: lldb-test symbols --dump-ast %t.exe | FileCheck %s
89b825dcdSZequan Wu 
99b825dcdSZequan Wu struct A {
109b825dcdSZequan Wu   int f1(int x) {
119b825dcdSZequan Wu     return x * 2;
129b825dcdSZequan Wu   }
139b825dcdSZequan Wu };
149b825dcdSZequan Wu struct B {
159b825dcdSZequan Wu   int f2(int x) {
169b825dcdSZequan Wu     return x * 2;
179b825dcdSZequan Wu   }
189b825dcdSZequan Wu };
199b825dcdSZequan Wu namespace N1 {
209b825dcdSZequan Wu int f3(void*, int x) {
219b825dcdSZequan Wu   return  x * 2;
229b825dcdSZequan Wu }
239b825dcdSZequan Wu } // namespace N1
249b825dcdSZequan Wu 
259b825dcdSZequan Wu namespace N2 {
269b825dcdSZequan Wu namespace N3 {
279b825dcdSZequan Wu   int f4(void*, int x) {
289b825dcdSZequan Wu     return  x * 2;
299b825dcdSZequan Wu   }
309b825dcdSZequan Wu } // namespace N3
319b825dcdSZequan Wu } // namespace N2
329b825dcdSZequan Wu 
339b825dcdSZequan Wu namespace N4 {
349b825dcdSZequan Wu   // Same base name as N1::f3 but different namespaces.
359b825dcdSZequan Wu   int f3(void*, int x) {
369b825dcdSZequan Wu     return x * 2;
379b825dcdSZequan Wu   }
389b825dcdSZequan Wu   // Same base name as B::f2 but this is in namespace.
399b825dcdSZequan Wu   int f2(void*, int x) {
409b825dcdSZequan Wu     return x * 2;
419b825dcdSZequan Wu   }
429b825dcdSZequan Wu } // namespace N4
439b825dcdSZequan Wu 
449b825dcdSZequan Wu 
459b825dcdSZequan Wu int main() {
469b825dcdSZequan Wu   A a;
479b825dcdSZequan Wu   B b;
489b825dcdSZequan Wu   return a.f1(1) + b.f2(1) + N1::f3(nullptr, 1) + N2::N3::f4(nullptr, 1) +
499b825dcdSZequan Wu          N4::f3(nullptr, 1);
509b825dcdSZequan Wu }
519b825dcdSZequan Wu 
529b825dcdSZequan Wu 
539b825dcdSZequan Wu // CHECK:      namespace N1 {
549b825dcdSZequan Wu // CHECK-NEXT:     int f3(void *, int x);
559b825dcdSZequan Wu // CHECK-NEXT: }
569b825dcdSZequan Wu // CHECK-NEXT: namespace N2 {
579b825dcdSZequan Wu // CHECK-NEXT:     namespace N3 {
589b825dcdSZequan Wu // CHECK-NEXT:         int f4(void *, int x);
599b825dcdSZequan Wu // CHECK-NEXT:     }
609b825dcdSZequan Wu // CHECK-NEXT: }
619b825dcdSZequan Wu // CHECK-NEXT: namespace N4 {
629b825dcdSZequan Wu // CHECK-NEXT:     int f3(void *, int x);
639b825dcdSZequan Wu // CHECK-NEXT:     int f2(void *, int x);
649b825dcdSZequan Wu // CHECK-NEXT: }
659b825dcdSZequan Wu // CHECK-NEXT: int main();
669b825dcdSZequan Wu // CHECK-NEXT: struct A {
679b825dcdSZequan Wu // CHECK-NEXT:     int f1(int);
689b825dcdSZequan Wu // CHECK-NEXT: };
699b825dcdSZequan Wu // CHECK-NEXT: struct B {
709b825dcdSZequan Wu // CHECK-NEXT:     int f2(int);
719b825dcdSZequan Wu // CHECK-NEXT: };
72