// 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; }