1*d21b3d34SFangrui Song // RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -o %t && not %run %t >%t.out 2>&1 2*d21b3d34SFangrui Song // RUN: FileCheck %s < %t.out && FileCheck %s < %t.out 3*d21b3d34SFangrui Song // RUN: %clangxx_msan -fsanitize-memory-track-origins -O3 %s -o %t && not %run %t >%t.out 2>&1 4*d21b3d34SFangrui Song // RUN: FileCheck %s < %t.out && FileCheck %s < %t.out 5*d21b3d34SFangrui Song 6*d21b3d34SFangrui Song // Test origin propagation through insertvalue IR instruction. 7*d21b3d34SFangrui Song 8*d21b3d34SFangrui Song #include <stdio.h> 9*d21b3d34SFangrui Song #include <stdint.h> 10*d21b3d34SFangrui Song 11*d21b3d34SFangrui Song struct mypair { 12*d21b3d34SFangrui Song int64_t x; 13*d21b3d34SFangrui Song int y; 14*d21b3d34SFangrui Song }; 15*d21b3d34SFangrui Song my_make_pair(int64_t x,int y)16*d21b3d34SFangrui Songmypair my_make_pair(int64_t x, int y) { 17*d21b3d34SFangrui Song mypair p; 18*d21b3d34SFangrui Song p.x = x; 19*d21b3d34SFangrui Song p.y = y; 20*d21b3d34SFangrui Song return p; 21*d21b3d34SFangrui Song } 22*d21b3d34SFangrui Song main()23*d21b3d34SFangrui Songint main() { 24*d21b3d34SFangrui Song int64_t * volatile p = new int64_t; 25*d21b3d34SFangrui Song mypair z = my_make_pair(*p, 0); 26*d21b3d34SFangrui Song if (z.x) 27*d21b3d34SFangrui Song printf("zzz\n"); 28*d21b3d34SFangrui Song // CHECK: MemorySanitizer: use-of-uninitialized-value 29*d21b3d34SFangrui Song // CHECK: {{in main .*insertvalue_origin.cpp:}}[[@LINE-3]] 30*d21b3d34SFangrui Song 31*d21b3d34SFangrui Song // CHECK: Uninitialized value was created by a heap allocation 32*d21b3d34SFangrui Song // CHECK: {{in main .*insertvalue_origin.cpp:}}[[@LINE-8]] 33*d21b3d34SFangrui Song delete p; 34*d21b3d34SFangrui Song return 0; 35*d21b3d34SFangrui Song } 36