forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			36 lines
		
	
	
		
			906 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			906 B
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -o %t && not %run %t >%t.out 2>&1
 | 
						|
// RUN: FileCheck %s < %t.out && FileCheck %s < %t.out
 | 
						|
// RUN: %clangxx_msan -fsanitize-memory-track-origins -O3 %s -o %t && not %run %t >%t.out 2>&1
 | 
						|
// RUN: FileCheck %s < %t.out && FileCheck %s < %t.out
 | 
						|
 | 
						|
// Test origin propagation through insertvalue IR instruction.
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
struct mypair {
 | 
						|
 int64_t x;
 | 
						|
 int y;
 | 
						|
};
 | 
						|
 | 
						|
mypair my_make_pair(int64_t x, int y)  {
 | 
						|
 mypair p;
 | 
						|
 p.x = x;
 | 
						|
 p.y = y;
 | 
						|
 return p;
 | 
						|
}
 | 
						|
 | 
						|
int main() {
 | 
						|
 int64_t * volatile p = new int64_t;
 | 
						|
 mypair z = my_make_pair(*p, 0);
 | 
						|
 if (z.x)
 | 
						|
   printf("zzz\n");
 | 
						|
 // CHECK: MemorySanitizer: use-of-uninitialized-value
 | 
						|
 // CHECK: {{in main .*insertvalue_origin.cc:}}[[@LINE-3]]
 | 
						|
 | 
						|
 // CHECK: Uninitialized value was created by a heap allocation
 | 
						|
 // CHECK: {{in main .*insertvalue_origin.cc:}}[[@LINE-8]]
 | 
						|
 delete p;
 | 
						|
 return 0;
 | 
						|
}
 |