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 Song mypair 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 Song int 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