1*d21b3d34SFangrui Song // RUN: %clangxx_msan -O0 %s -o %t && %run %t >%t.out 2>&1
2*d21b3d34SFangrui Song // RUN: %clangxx_msan -O1 %s -o %t && %run %t >%t.out 2>&1
3*d21b3d34SFangrui Song // RUN: %clangxx_msan -O2 %s -o %t && %run %t >%t.out 2>&1
4*d21b3d34SFangrui Song // RUN: %clangxx_msan -O3 %s -o %t && %run %t >%t.out 2>&1
5*d21b3d34SFangrui Song 
6*d21b3d34SFangrui Song // RUN: %clangxx_msan -O0 %s -o %t -DCHECK_IN_F && %run %t >%t.out 2>&1
7*d21b3d34SFangrui Song // RUN: %clangxx_msan -O1 %s -o %t -DCHECK_IN_F && %run %t >%t.out 2>&1
8*d21b3d34SFangrui Song // RUN: %clangxx_msan -O2 %s -o %t -DCHECK_IN_F && %run %t >%t.out 2>&1
9*d21b3d34SFangrui Song // RUN: %clangxx_msan -O3 %s -o %t -DCHECK_IN_F && %run %t >%t.out 2>&1
10*d21b3d34SFangrui Song 
11*d21b3d34SFangrui Song // Test that (no_sanitize_memory) functions
12*d21b3d34SFangrui Song // * don't check shadow values (-DCHECK_IN_F)
13*d21b3d34SFangrui Song // * treat all values loaded from memory as fully initialized (-UCHECK_IN_F)
14*d21b3d34SFangrui Song 
15*d21b3d34SFangrui Song #include <stdlib.h>
16*d21b3d34SFangrui Song #include <stdio.h>
17*d21b3d34SFangrui Song 
18*d21b3d34SFangrui Song __attribute__((noinline))
19*d21b3d34SFangrui Song __attribute__((no_sanitize_memory))
f(void)20*d21b3d34SFangrui Song int f(void) {
21*d21b3d34SFangrui Song   int x;
22*d21b3d34SFangrui Song   int * volatile p = &x;
23*d21b3d34SFangrui Song #ifdef CHECK_IN_F
24*d21b3d34SFangrui Song   if (*p)
25*d21b3d34SFangrui Song     exit(0);
26*d21b3d34SFangrui Song #endif
27*d21b3d34SFangrui Song   return *p;
28*d21b3d34SFangrui Song }
29*d21b3d34SFangrui Song 
main(void)30*d21b3d34SFangrui Song int main(void) {
31*d21b3d34SFangrui Song   if (f())
32*d21b3d34SFangrui Song     exit(0);
33*d21b3d34SFangrui Song   return 0;
34*d21b3d34SFangrui Song }
35