// clang-format off // REQUIRES: lld, x86 // Test lldb finds the correct parent context decl for functions and class methods when icf happens. // RUN: %clang_cl --target=x86_64-windows-msvc -Od -Z7 -GS- -fno-addrsig -c /Fo%t.obj -- %s // RUN: lld-link -opt:icf -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb // RUN: env LLDB_USE_NATIVE_PDB_READER=1 lldb-test symbols --dump-ast %t.exe | FileCheck %s struct A { int f1(int x) { return x * 2; } }; struct B { int f2(int x) { return x * 2; } }; namespace N1 { int f3(void*, int x) { return x * 2; } } // namespace N1 namespace N2 { namespace N3 { int f4(void*, int x) { return x * 2; } } // namespace N3 } // namespace N2 namespace N4 { // Same base name as N1::f3 but different namespaces. int f3(void*, int x) { return x * 2; } // Same base name as B::f2 but this is in namespace. int f2(void*, int x) { return x * 2; } } // namespace N4 int main() { A a; B b; return a.f1(1) + b.f2(1) + N1::f3(nullptr, 1) + N2::N3::f4(nullptr, 1) + N4::f3(nullptr, 1); } // CHECK: namespace N1 { // CHECK-NEXT: int f3(void *, int x); // CHECK-NEXT: } // CHECK-NEXT: namespace N2 { // CHECK-NEXT: namespace N3 { // CHECK-NEXT: int f4(void *, int x); // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: namespace N4 { // CHECK-NEXT: int f3(void *, int x); // CHECK-NEXT: int f2(void *, int x); // CHECK-NEXT: } // CHECK-NEXT: int main(); // CHECK-NEXT: struct A { // CHECK-NEXT: int f1(int); // CHECK-NEXT: }; // CHECK-NEXT: struct B { // CHECK-NEXT: int f2(int); // CHECK-NEXT: };