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