| // RUN: %clang_cc1 -triple=x86_64-linux -disable-llvm-passes -emit-llvm \ |
| // RUN: -debug-info-kind=constructor -dwarf-version=5 -O1 %s \ |
| // RUN: -o - | FileCheck %s -check-prefix CHECK-DERIVED |
| |
| // Simple base and derived class with virtual and static methods: |
| // We check for: |
| // - a generated 'call_target' for 'f1'. |
| // - not generated 'call_target' for 'f3'. |
| |
| struct CBase { |
| virtual void f1() {} |
| static void f3(); |
| }; |
| |
| void CBase::f3() { |
| } |
| |
| void foo(CBase *Base) { |
| CBase::f3(); |
| } |
| |
| struct CDerived : public CBase { |
| void f1() {} |
| }; |
| void foo(CDerived *Derived); |
| |
| int main() { |
| CDerived D; |
| foo(&D); |
| |
| return 0; |
| } |
| |
| void foo(CDerived *Derived) { |
| Derived->f1(); |
| } |
| |
| // CHECK-DERIVED: define {{.*}} @_Z3fooP5CBase{{.*}} { |
| // CHECK-DERIVED: call void @_ZN5CBase2f3Ev{{.*}} !dbg {{![0-9]+}} |
| // CHECK-DERIVED: } |
| |
| // CHECK-DERIVED: define {{.*}} @main{{.*}} { |
| // CHECK-DERIVED: call void @_ZN8CDerivedC1Ev{{.*}} !dbg {{![0-9]+}} |
| // CHECK-DERIVED: call void @_Z3fooP8CDerived{{.*}} !dbg {{![0-9]+}} |
| // CHECK-DERIVED: } |
| |
| // CHECK-DERIVED: define {{.*}} @_ZN8CDerivedC1Ev{{.*}} { |
| // CHECK-DERIVED: call void @_ZN8CDerivedC2Ev{{.*}} !dbg {{![0-9]+}} |
| // CHECK-DERIVED: } |
| |
| // CHECK-DERIVED: define {{.*}} @_Z3fooP8CDerived{{.*}} { |
| // CHECK-DERIVED: call void %1{{.*}} !dbg {{![0-9]+}}, !call_target [[DERIVED_F1_DCL:![0-9]+]] |
| // CHECK-DERIVED: } |
| |
| // CHECK-DERIVED: [[BASE_F1_DCL:![0-9]+]] = {{.*}}!DISubprogram(name: "f1", linkageName: "_ZN5CBase2f1Ev", {{.*}}containingType |
| // CHECK-DERIVED: [[DERIVED_F1_DCL]] = {{.*}}!DISubprogram(name: "f1", linkageName: "_ZN8CDerived2f1Ev", {{.*}}containingType |
| // CHECK-DERIVED: [[DERIVED_F1_DEF:![0-9]+]] = {{.*}}!DISubprogram(name: "f1", linkageName: "_ZN8CDerived2f1Ev", {{.*}}DISPFlagDefinition |
| // CHECK-DERIVED: [[BASE_F1_DEF:![0-9]+]] = {{.*}}!DISubprogram(name: "f1", linkageName: "_ZN5CBase2f1Ev", {{.*}}DISPFlagDefinition |