72 lines · cpp
1// clang-format off2// REQUIRES: lld, x863 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 -- %s6// RUN: lld-link -opt:icf -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb7// RUN: lldb-test symbols --dump-ast %t.exe | FileCheck %s8 9struct A {10 int f1(int x) {11 return x * 2;12 }13};14struct B {15 int f2(int x) {16 return x * 2;17 }18};19namespace N1 {20int f3(void*, int x) {21 return x * 2;22}23} // namespace N124 25namespace N2 {26namespace N3 {27 int f4(void*, int x) {28 return x * 2;29 }30} // namespace N331} // namespace N232 33namespace 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 N443 44 45int 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