1d21b3d34SFangrui Song // RUN: %clangxx_msan -std=c++11 -O0 -g %s -o %t && %run %t
2d21b3d34SFangrui Song // RUN: %clangxx_msan -DPOSITIVE -std=c++11 -O0 -g %s -o %t && not %run %t 2>&1 | FileCheck %s
3d21b3d34SFangrui Song 
4d21b3d34SFangrui Song #include <assert.h>
5d21b3d34SFangrui Song #include <signal.h>
6d21b3d34SFangrui Song #include <sys/time.h>
7*16784c05SGui Andrade #include <sys/wait.h>
8d21b3d34SFangrui Song #include <unistd.h>
9d21b3d34SFangrui Song 
10d21b3d34SFangrui Song #include <sanitizer/msan_interface.h>
11d21b3d34SFangrui Song 
test_sigwait()12d21b3d34SFangrui Song void test_sigwait() {
13d21b3d34SFangrui Song   sigset_t s;
14d21b3d34SFangrui Song #ifndef POSITIVE
15d21b3d34SFangrui Song   sigemptyset(&s);
16d21b3d34SFangrui Song   sigaddset(&s, SIGUSR1);
17d21b3d34SFangrui Song #endif
18d21b3d34SFangrui Song   sigprocmask(SIG_BLOCK, &s, 0);
19d21b3d34SFangrui Song   // CHECK:  MemorySanitizer: use-of-uninitialized-value
20d21b3d34SFangrui Song 
21d21b3d34SFangrui Song   if (pid_t pid = fork()) {
22d21b3d34SFangrui Song     kill(pid, SIGUSR1);
23*16784c05SGui Andrade     int child_stat;
24*16784c05SGui Andrade     wait(&child_stat);
25*16784c05SGui Andrade     _exit(!WIFEXITED(child_stat));
26d21b3d34SFangrui Song   } else {
27d21b3d34SFangrui Song     int sig;
28d21b3d34SFangrui Song     int res = sigwait(&s, &sig);
29d21b3d34SFangrui Song     assert(!res);
30d21b3d34SFangrui Song     // The following checks that sig is initialized.
31d21b3d34SFangrui Song     assert(sig == SIGUSR1);
32d21b3d34SFangrui Song   }
33d21b3d34SFangrui Song }
34d21b3d34SFangrui Song 
main(void)35d21b3d34SFangrui Song int main(void) {
36d21b3d34SFangrui Song   test_sigwait();
37d21b3d34SFangrui Song   return 0;
38d21b3d34SFangrui Song }
39