forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
 | |
| // RUN: %clang_cc1 -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
 | |
| 
 | |
| class A {
 | |
|  public:
 | |
|   int x;
 | |
|   A() {}
 | |
|   virtual ~A() {}
 | |
| };
 | |
| A a;
 | |
| 
 | |
| class B : virtual public A {
 | |
|  public:
 | |
|   int y;
 | |
|   B() {}
 | |
|   ~B() {}
 | |
| };
 | |
| B b;
 | |
| 
 | |
| // CHECK-LABEL: define {{.*}}AD1Ev
 | |
| // CHECK-NOT: call void @__sanitizer_dtor_callback
 | |
| // CHECK: call void {{.*}}AD2Ev
 | |
| // CHECK-NOT: call void @__sanitizer_dtor_callback
 | |
| // CHECK: ret void
 | |
| 
 | |
| // After invoking base dtor and dtor for virtual base, poison vtable ptr.
 | |
| // CHECK-LABEL: define {{.*}}BD1Ev
 | |
| // CHECK-NOT: call void @__sanitizer_dtor_callback
 | |
| // CHECK: call void {{.*}}BD2Ev
 | |
| // CHECK-NOT: call void @__sanitizer_dtor_callback
 | |
| // CHECK: call void {{.*}}AD2Ev
 | |
| // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
 | |
| // CHECK-NOT: call void @__sanitizer_dtor_callback
 | |
| // CHECK: ret void
 | |
| 
 | |
| // Since no virtual bases, poison vtable ptr here.
 | |
| // CHECK-LABEL: define {{.*}}AD2Ev
 | |
| // CHECK: call void @__sanitizer_dtor_callback
 | |
| // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
 | |
| // CHECK-NOT: call void @__sanitizer_dtor_callback
 | |
| // CHECK: ret void
 | |
| 
 | |
| // Poison members
 | |
| // CHECK-LABEL: define {{.*}}BD2Ev
 | |
| // CHECK: call void @__sanitizer_dtor_callback
 | |
| // CHECK-NOT: call void @__sanitizer_dtor_callback
 | |
| // CHECK: ret void
 |