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