1d21b3d34SFangrui Song // RUN: %clangxx_msan -O0 %s -o %t && %run %t >%t.out 2>&1
2d21b3d34SFangrui Song // RUN: %clangxx_msan -O1 %s -o %t && %run %t >%t.out 2>&1
3d21b3d34SFangrui Song // RUN: %clangxx_msan -O2 %s -o %t && %run %t >%t.out 2>&1
4d21b3d34SFangrui Song // RUN: %clangxx_msan -O3 %s -o %t && %run %t >%t.out 2>&1
5d21b3d34SFangrui Song 
6d21b3d34SFangrui Song // Test that (no_sanitize_memory) functions DO NOT propagate shadow.
7d21b3d34SFangrui Song 
8d21b3d34SFangrui Song #include <stdlib.h>
9d21b3d34SFangrui Song #include <stdio.h>
10d21b3d34SFangrui Song 
11d21b3d34SFangrui Song __attribute__((noinline))
12*51fab8f3SRichard Smith __attribute__((weak))
13d21b3d34SFangrui Song __attribute__((no_sanitize_memory))
f(int x)14d21b3d34SFangrui Song int f(int x) {
15d21b3d34SFangrui Song   return x;
16d21b3d34SFangrui Song }
17d21b3d34SFangrui Song 
main(void)18d21b3d34SFangrui Song int main(void) {
19d21b3d34SFangrui Song   int x;
20d21b3d34SFangrui Song   int * volatile p = &x;
21d21b3d34SFangrui Song   int y = f(*p);
22d21b3d34SFangrui Song   if (y)
23d21b3d34SFangrui Song     exit(0);
24d21b3d34SFangrui Song   return 0;
25d21b3d34SFangrui Song }
26