72 lines · cpp
1// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -emit-llvm %s -fstrict-vtable-pointers -O1 -o - -disable-llvm-passes | FileCheck %s2 3struct A {4 virtual void foo();5};6 7struct D : A {8 void foo();9};10 11// CHECK-LABEL: define{{.*}} void @_Z21testExternallyVisiblev()12void testExternallyVisible() {13 A *a = new A;14 15 // CHECK: load {{.*}} !invariant.group ![[MD:[0-9]+]]16 a->foo();17 18 D *d = new D;19 // CHECK: call void @_ZN1DC1Ev(20 // CHECK: load {{.*}} !invariant.group ![[MD]]21 d->foo();22 A *a2 = d;23 // CHECK: load {{.*}} !invariant.group ![[MD]]24 a2->foo();25}26// CHECK-LABEL: {{^}}}27 28namespace {29 30struct B {31 virtual void bar();32};33 34struct C : B {35 void bar();36};37 38}39 40// CHECK-LABEL: define{{.*}} void @_Z21testInternallyVisibleb(41void testInternallyVisible(bool p) {42 B *b = new B;43 // CHECK: = load {{.*}}, !invariant.group ![[MD]]44 b->bar();45 46 // CHECK: call void @_ZN12_GLOBAL__N_11CC1Ev(47 C *c = new C;48 // CHECK: = load {{.*}}, !invariant.group ![[MD]]49 c->bar();50}51 52// Checking A::A()53// CHECK-LABEL: define linkonce_odr void @_ZN1AC2Ev(54// CHECK: store {{.*}}, !invariant.group ![[MD]]55// CHECK-LABEL: {{^}}}56 57// Checking D::D()58// CHECK-LABEL: define linkonce_odr void @_ZN1DC2Ev(59// CHECK: = call ptr @llvm.launder.invariant.group.p0(ptr60// CHECK: call void @_ZN1AC2Ev(ptr61// CHECK: store {{.*}} !invariant.group ![[MD]]62 63// Checking B::B()64// CHECK-LABEL: define internal void @_ZN12_GLOBAL__N_11BC2Ev(65// CHECK: store {{.*}}, !invariant.group ![[MD]]66 67// Checking C::C()68// CHECK-LABEL: define internal void @_ZN12_GLOBAL__N_11CC2Ev(69// CHECK: store {{.*}}, !invariant.group ![[MD]]70 71// CHECK: ![[MD]] = !{}72