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