forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -emit-llvm %s -fstrict-vtable-pointers -O1 -o - -disable-llvm-passes | FileCheck %s
 | |
| 
 | |
| struct A {
 | |
|   virtual void foo();
 | |
| };
 | |
| 
 | |
| struct D : A {
 | |
|   void foo();
 | |
| };
 | |
| 
 | |
| // CHECK-LABEL: define void @_Z21testExternallyVisiblev()
 | |
| void testExternallyVisible() {
 | |
|   A *a = new A;
 | |
| 
 | |
|   // CHECK: load {{.*}} !invariant.group ![[MD:[0-9]+]]
 | |
|   a->foo();
 | |
| 
 | |
|   D *d = new D;
 | |
|   // CHECK: call void @_ZN1DC1Ev(
 | |
|   // CHECK: load {{.*}} !invariant.group ![[MD]]
 | |
|   d->foo();
 | |
|   A *a2 = d;
 | |
|   // CHECK: load {{.*}} !invariant.group ![[MD]]
 | |
|   a2->foo();
 | |
| }
 | |
| // CHECK-LABEL: {{^}}}
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| struct B {
 | |
|   virtual void bar();
 | |
| };
 | |
| 
 | |
| struct C : B {
 | |
|   void bar();
 | |
| };
 | |
| 
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: define void @_Z21testInternallyVisibleb(
 | |
| void testInternallyVisible(bool p) {
 | |
|   B *b = new B;
 | |
|   // CHECK: = load {{.*}}, !invariant.group ![[MD]]
 | |
|   b->bar();
 | |
| 
 | |
|   // CHECK: call void @_ZN12_GLOBAL__N_11CC1Ev(
 | |
|   C *c = new C;
 | |
|   // CHECK: = load {{.*}}, !invariant.group ![[MD]]
 | |
|   c->bar();
 | |
| }
 | |
| 
 | |
| // Checking A::A()
 | |
| // CHECK-LABEL: define linkonce_odr void @_ZN1AC2Ev(
 | |
| // CHECK: store {{.*}}, !invariant.group ![[MD]]
 | |
| // CHECK-LABEL: {{^}}}
 | |
| 
 | |
| // Checking D::D()
 | |
| // CHECK-LABEL: define linkonce_odr void @_ZN1DC2Ev(
 | |
| // CHECK:  = call i8* @llvm.launder.invariant.group.p0i8(i8*
 | |
| // CHECK:  call void @_ZN1AC2Ev(%struct.A*
 | |
| // CHECK: store {{.*}} !invariant.group ![[MD]]
 | |
| 
 | |
| // Checking B::B()
 | |
| // CHECK-LABEL: define internal void @_ZN12_GLOBAL__N_11BC2Ev(
 | |
| // CHECK:  store {{.*}}, !invariant.group ![[MD]]
 | |
| 
 | |
| // Checking C::C()
 | |
| // CHECK-LABEL: define internal void @_ZN12_GLOBAL__N_11CC2Ev(
 | |
| // CHECK:  store {{.*}}, !invariant.group ![[MD]]
 | |
| 
 | |
| // CHECK: ![[MD]] = !{}
 |