// Regression test for origin propagation in "select i1, float, float".
// https://code.google.com/p/memory-sanitizer/issues/detail?id=78

// RUN: %clangxx_msan -O2 -fsanitize-memory-track-origins %s -o %t && not %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out

// RUN: %clangxx_msan -O2 -fsanitize-memory-track-origins=2 %s -o %t && not %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out

#include <stdio.h>
#include <sanitizer/msan_interface.h>

int main() {
  volatile bool b = true;
  float x, y;
  __msan_allocated_memory(&x, sizeof(x));
  __msan_allocated_memory(&y, sizeof(y));
  float z = b ? x : y;
  if (z > 0) printf(".\n");
  // CHECK: Uninitialized value was created by a heap allocation
  // CHECK: {{#0 0x.* in .*__msan_allocated_memory}}
  // CHECK: {{#1 0x.* in main .*select_float_origin.cc:}}[[@LINE-6]]
  return 0;
}

Fix origin propagation for select of floats.
[msan] Fix origin propagation for select of floats.

MSan does not assign origin for instrumentation temps (i.e. the ones that do
not come from the application code), but "select" instrumentation erroneously
tried to use one of those.

https://code.google.com/p/memory-sanitizer/issues/detail?id=78


git-svn-id: c199f293c43da69278bea8e88f92242bf3aa95f7@222918 91177308-0d34-0410-b5e6-96231b3b80d8
